文章内容来自于Udemy课程。第一章为设置C++和虚幻环境,直接略过。
第二章内容为一个小游戏,名字叫Triple X,是个简单的数字益智游戏。它基于三个未知数字。你将侵入某种计算机锁。游戏的想法是找到一个有效的三个数字组合。
比如关卡1:3个数字相加为8,相乘为18。
这部分很简单,我们直接略过。
第三章内容为The Bull Cow Project,是一个terminal game, but with unreal,我们从部分开始记录:
一、游戏内容介绍
这是一个猜词游戏,为了使他更加简单,我们想猜测isogram,an isogram is simply any word that doesn't have any repeating letters。它是一个没有重复字母的单词(例如ambidextrously),或者更广泛地说,是一个字母出现相同次数的单词。下面是它的定义:
Isogram - Definition and Examples in Englishhttps://www.thoughtco.com/isogram-word-play-term-1691199
A letter in a guess and in the right place is a bull and a letter in a guess but in the wrong place
is a cow. And of course, if you guess a letter that isn't in our head and word you won't get any bulls or any cows
游戏本身的机制,隐藏的词将从一个词列表中提取出来,游戏会让我们知道我们拥有玩家会猜测的lives。
二、游戏基本设置和基本知识
1、我们下载对应的压缩包文件
会给出警告,关于版本不同的警告,问是否要rebuild,这里选择是就可以了。
其次需要注意的是,我们进入引擎后,需要点击上方的编译,来编译C++代码:
关于互动,我们需要进入游戏后,按下tab键,这样可以在游戏中的木板上输入对应单词。
这里关于游戏引擎的一些操作介绍,我们就暂时略过,和之前的内容重复较多。
2、关于生成编译器代码
我们可以在偏好设置中,修改是VS还是VS code作为启动:
这样会在文件目录中产生下面这个文件:
然后我们可以在vs code中打开项目,但是会有如下的报错:
但这是因为课程的版本和我们版本使用不同造成的。我们可以进入下面的链接,下载vsix文件
https://gist.github.com/boocs/f63a4878156295b6e854cac68672f305#Extension-Settings
然后按照文章中步骤进行操作就可以了,别忘了在设置中,选中这两个:
这样的话,现在就没有之前的报错了,我们可以继续进行后续的任务。
3 Actor和组件
Actor 可以被视为一个容器,可以附加许多组件。
我们可以在C++类中,找到我们的组件,可以将它添加到我们的terminal中:
关于terminal的解释:
而在这个项目中使用的类比思想是一个老式的终端,你输入两个,它的字符出现在屏幕上,然后游戏以不同的东西响应。
所以这里的想法是,本节中将对这些墨盒(cartridges)之一进行编程,然后从理论上讲,然后将其插入我们的终端。
那么怎么做?
我们首先选中这个终端:
我们可以直接在添加组件中搜索,也可以在列表中拖入:
这样我们进入vs code的对应文件中,我们可以添加代码(添加一行输出):
然后我们进入到游戏中的终端,就可以看到输出:
在这里需要注意的是,有的时候vs code会进行报错,但是在ue里的编译是正常的。
This declartion has no storage class or type specifier.
注意到OnInput函数中没有语句,我们可以添加ClearScreen(),在输入时清空屏幕。
4、Unreal has its Own c++ type
这一部分主要讲text macro(文本宏)
https://docs.unrealengine.com/4.27/en-US/ProgrammingAndScripting/ProgrammingWithCPP/UnrealArchitecture/StringHandling/https://docs.unrealengine.com/4.27/en-US/ProgrammingAndScripting/ProgrammingWithCPP/UnrealArchitecture/StringHandling/例如Fstring:
Unreal TEXT FText,FName,FString 浅谈 - 不三周助 - 博客园
也可以看看官方文档字符编码的部分:
https://docs.unrealengine.com/4.27/zh-CN/ProgrammingAndScripting/ProgrammingWithCPP/UnrealArchitecture/StringHandling/CharacterEncoding/https://docs.unrealengine.com/4.27/zh-CN/ProgrammingAndScripting/ProgrammingWithCPP/UnrealArchitecture/StringHandling/CharacterEncoding/
需要知道的是,我们每次有一个string,我们都需要以下面的方式:
FString HiddenWorld = TEXT("cake");
加上TEXT,这样虚幻可以正确编码。
同样的,对于PrintLine也可以按照下面的例子:
PrintLine(TEXT("Hi There!"));
关于game loop
在coding之前,先画流程草图。
5 对于编译时间长(10s甚至更多)
进入Message log-Compile log,查看是否有出现编译时长突然变化的情况。
如果有,回到VS code中,到目录栏下的UE-engine-Binaries-Win64-UnrealHeaderTool.target
可以在结尾加入一个空格然后重新保存,这样重新编译速度会变快。
6 Structure of a String
7 对词表添加TEXT(“”)
我们选中所有的单词,然后再工具栏的上方,选择,在行尾添加光标。
这样我们可以先输入”),然后删除最后一行的逗号。
对于前面的部分,我们可以再次添加光标后,用Home键移动光标
8 Loading Words At Runtime
单个.h文件中有大量的单词会影响编译时间。我们可以使用FFileHelper::LoadFileToStringArray将单词加载到数组中。
我们在Txt中输入单词表,然后再代码中创建一个TArray
FPaths::ProjectContentDir()
将返回内容目录的绝对路径
const FString WordListPath = FPaths::ProjectContentDir() / TEXT("WordLists/HiddenWordList.txt");
FFileHelper::LoadFileToStringArray(Words, *WordListPath);
最后:
为了使其在打包游戏中工作,需要将 WordLists 目录添加到要打包在打包下的项目设置中的附加非资产目录列表中。
9 TArray Functions
.Add() New element to the end of the array
.Emplace() New element to the end of the array
在FString时,最好使用Emplace
.Remove() Removes matching elements
.RemoveAt()Removes element at index