UE4每周学习总结_数据表_广域网_模块_模块接口_AI蓝图部分

14 篇文章 0 订阅

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,可以在这个位置直接跳过去.
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值