Command 命令行 r.setRes1280 x 720 w 窗口模式 f 全屏模式
打包前的设置(广域网)
1.在设置中Packaging/List of maps to include in a packaged build? ? ?点击+ 号添加数组元素,然后点击... 进行浏览选择要添加的场景 ? ?与关卡流不同,此处是跳转场景将对应的场景路径添加,?打包时会将对应的关卡也一并打包。 否则打包完成后没有进行设置,游戏运行时执行跳转场景时会失败。
2.打包完成后,关闭UE4,然后编译一遍DebugGameServer 完成后,点开你的项目名/Binares/Win64/项目名Server-Win64-DebugGame.exe 把这个文件复制到你打包好的项目文件目录:项目名/Binares/Win64/放这里 然后在外部建立一个.bat文件 路径写死:你的刚复制过来的在打包好的文件里的xxxserver.exe文件 -log 这样写好后,执行,就可以看到打包好的文件了.
3.如何加载到线上呢 直接压缩服务器文件,然后远程链接后,粘贴上去运行即可 如果提示有dll文件缺失,缺啥就下载啥 做一下内网穿透(哲西云软件),然后ping一下穿透后建立隧道的地址 获取到真正的地址,修改之前客户端的ip.txt文件(需要一个文件读取功能插件,可以自己写) 把地址输入进去,链接一般就可以了.
1124
数据表
作用:给策划用,添加一种货币,修改某些数据,通过配表处理更好 不用程序加班加点 使用方式:头文件:#include Engine/DataTable.h?声明的继承下 FTableRowBase 即可
?
?
遗忘部分知识点回顾
1:UPROPERTY中
EditAnywhere 与 EditDefaultsOnly的区别 any可以在编译器中,也可以放置在世界中的细节面板修改 def只能在编译器,世界中是找不到的
2:UClass::TagSubobjects
使用指定的对象标志标记属于同一资产的对象,用于 GC 检查
3:EObjectFlag
描述对象实例的标志,理解就是给对象实例下标签,让编译器处理
4:TSubclassOf
是提供 UClass 类型安全性的模板类。 规定了传入的类的类型 用法区别:
UPROPERTY(EditDefaultsOnly, Category=Damage)
UClass* DamageType;
UPROPERTY(EditDefaultsOnly, Category=Damage)
TSubclassOf<UDamageType> DamageType;
后面的规定了编辑器的属性窗口只列出派生自 UDamageType 的类 在第一个声明中可选择任意 UClass
包含反射.h类的不能前置声明,只能引用头文件的形式找到类
5:模块
正如引擎本身由一组模块构成一样,每个游戏也是由一个或多个 游戏性模块构成的。这些模块类似于引擎以前的版本中的包的概 念,它们都是一组相关类的容器。模块实际上是 DLL 文件
6:模块接口(API)
对于一些需要被模块外部访问的函数和类,需要通过 *_API 的宏 标记出来。每个被暴露在外的单项都会带来编译时间的额外消耗 ,因此请务必仅暴露出必须暴露的接口。如果外部只需要访问 一个类中的某个函数,那么比起暴露整个类而言,仅暴露出这 个函数能够节省出相当可观的编译时间。
7:使用ConstructorHelpers来加载资源
使用特殊类 ConstructorHelpers 加载,这个类在构造阶段查找某个对象的对象和类。 注意:路径名也必须带_C后缀! 蓝图路径是:Blueprint'/Game/Blueprints/MyBP.MyBP',
加后缀以后,则是:Blueprint'/Game/Blueprints/MyBP.MyBP_C',
static ConstructorHelpers::FObjectFinder<UBlueprint> UnitSelector(TEXT("Blueprint'/Game/MyProject/MyBlueprint.MyBlueprint'")); ?
TSubclassOf<AActor> UnitSelectorClass = (UClass*)UnitSelector.Object->GeneratedClass; ?
UClass。存储类信息,用于反射。把它当成C#的Type来理解。 GetClass()。获得一个UObject实例的UClass,是UObject成员函数。 GetStaticClass()。不需要有实例就能获得UClass。是静态的,每次调用返回相同结果。 ClassDefaultObject。类默认对象,可以获得UObject初始化时的值。注意GetClass()->GetDefaultObject()和T::StaticClass()->GetDefaultObject()不一样。
DefaultEngine中找这一句,后面的是通道名字 +DefaultChannelResponses=
8:期望该函数在蓝图被重写,同时又拥有c++的实现方法
那么定义函数时,除了自身的方法名外,还需要加一个后缀_Implementation,并在c++实现这个有后缀的函数 这样定义以后,会优先调用蓝图中的Event,如果蓝图中该event没有实现,则调用C++的方法 同时: 定义我们的RPC函数。此时需要注意的是,RPC函数的定义需要在函数末尾添加_Impementation
UFUNCTION(reliable, server, WithValidation) void ServerFlyUp(); 注意到Server函数的例子中,添加了WithValidation的字段。这是为了防止玩家作弊,添加的一个验证函数,我们可以自行编写验证条件, 这是为了防止玩家作弊,添加的一个验证函数,我们可以自行编写验证条件,如果客户端的数据不满足验证条件,则客户端这边会直接放弃RPC的调用,到了服务器那边,服务器在执行Server函数之前还会进行一次判断,防止客户端发送假的包过来,如果判断通过了,才会继续执行。实验环境下,我们默认验证条件都返回true。
AI(C++部分,待完成)
Sequence两边都可以执行,由左到右 Selector 只执行一边 添加BTTask或者BTServer时会报错 解决方法: 需要在BTServer.h中添加三个接口,F12找过去即可,最后三个加上下面这俩 virtual EBTNodeResult::Type ExecuteTask(UBehaviorTreeComponent& OwnerComp,uint8* NodeMemory)override;
virtual void InitializeFromAsset(UBehaviorTree& Asset) override;
AI蓝图部分功能笔记
NPC简单跟随
前期准备: 1:创建一个Character类,命名为NPC 2:创建一个AIController类,命名为NPC_AI 3:创建一个BehaviorTree,命名为Npc_BT 4:创建一个BlackBoard,命名为Npc_BB 实际制作 1.首先给NPC一个控制器,在ClassDefault中,NPC_AI 2.然后AI控制器中,BeginPlay中设置RunBehaviorTree(NPC_BT) 并NPC_BT关联好NPC_BB 3.在NPC_BB中,添加一个变量(TargetLocation) 4.设置行为树,Select绑Sequence,false就不执行 然后添加一个Task,添加SetBlackBoardValueAsVector节点(下图) 并且在Task中设置一个BlackBoardSelector变量 5.行为树中设置变量并绑定之前黑板的数值,结束.
?
AI跳跃
1.在NpcAI上新建一个变量Character 引用 2.添加时间EventOnPossess,事件控制时,通过Npc变量获取Npc角色相关数据,目的是为了当NPC拥有这个控制器 即执行到这,把NPC角色数据获取到 3.添加Tick,根据Npc变量获取速度,然后获取速度的响亮,判断长度大于100时候可以起跳,然后生成一个Sphere碰撞体 ,仅一帧,如果这一帧在墙边上,那就起跳,Jump,并且微微做一个Offset ,让人物可以起跳 4.在地图上添加Nav LinkProxy,可以在这个位置直接跳过去. ?
?
|