当前位置: 首页 > news >正文

[UE4]创建自定义AIController的方法(C++)

[UE4]创建自定义AIController的方法(C++)

https://dawnarc.com/2017/09/ue4%E5%88%9B%E5%BB%BA%E8%87%AA%E5%AE%9A%E4%B9%89aicontroller%E7%9A%84%E6%96%B9%E6%B3%95c-/

[UE4]创建自定义AIController的方法(C++)

Wednesday, 20:09, Sep 13, 2017 in UnrealEngine4

之前写过如何用C++创建自定义PlayerController方式:

FActorSpawnParameters SpawnInfo;
SpawnInfo.Instigator = Instigator;	
SpawnInfo.ObjectFlags |= RF_Transient;	// We never want to save player controllers into a map
SpawnInfo.bDeferConstruction = true;
AMyPlayerController* NewPC = GetWorld()->SpawnActor<AMyPlayerController>(AMyPlayerController::StaticClass(), SpawnLocation, SpawnRotation, SpawnInfo);

如果用同样的方式,在服务端创建AIController,会有问题,执行:

EPathFollowingRequestResult::Type AAIController::MoveToLocation(const FVector& Dest, ...);

返回值是Success,但是没有任何效果。

原因:
自己设置FActorSpawnParameters相关参数,对PlayerController可行,但是对AIController,相关参数设置不一样,导致AIController在服务端失效。

解决办法:
两种方式

方式一:AIControllerClass指定

1,先为Character指定AI Controller Class,且禁用AutoPossessPlayer。这段代码可以放在构造函数中,保证在Possess之前设置好。以下3个属性也可以在角色蓝图中指定。

AutoPossessPlayer = EAutoReceiveInput::Type::Disabled;
AutoPossessAI = EAutoPossessAI::PlacedInWorld;
AIControllerClass = AMyAIController::StaticClass();

2,Character被Spawn出来后,再执行:

void APawn::SpawnDefaultController();

如果AutoPossessAI设置为Disable,则接着执行一下Possess:

void AController::Possess(APawn* InPawn);

方式一:SpawnActor时使用默认FActorSpawnParameters。

 AMyAIController* PC = GetWorld()->SpawnActor<AMyAIController>(AMyAIController::StaticClass(), SpawnLoc, SpawnRot);

不要自己设置FActorSpawnParameters,因为AIController和PlayerController表现不一样。


 

 

 

 

 

 

 

相关文章:

  • eclipse + pydev远程调试OpenStack
  • 调用shell jenkins不能自动结束
  • Unreal 第三方 Python平台
  • 【UE4_C++】<14-3>用户界面 UI和UMG——为UI创建屏幕尺寸自适应缩放
  • 虚幻4DPI自适应缩放规则解析
  • Eclipse中打开windows资源管理器或打开文件夹的设置!(实例)
  • 在Eclipse中快速定位当前文件所在位置
  • AssetBundle详解与优化
  • 苹果电脑远程管理/屏幕共享的客方设置
  • 使用UnrealPak.exe创建Pak文件
  • 正确配置 Visual Studio Code 开发和调试 TypeScript
  • Typescript 基本数据类型(boolean、number、string、any、联合)
  • typescript let和const区别
  • 关于TypeScript中null,undefined的使用
  • typescript 类型断言
  • 【笔记】你不知道的JS读书笔记——Promise
  • Linux编程学习笔记 | Linux IO学习[1] - 文件IO
  • Lucene解析 - 基本概念
  • mysql 数据库四种事务隔离级别
  • PHP 的 SAPI 是个什么东西
  • Phpstorm怎样批量删除空行?
  • python学习笔记 - ThreadLocal
  • rabbitmq延迟消息示例
  • rc-form之最单纯情况
  • Spring思维导图,让Spring不再难懂(mvc篇)
  • Vue.js源码(2):初探List Rendering
  • 十年未变!安全,谁之责?(下)
  • 实战|智能家居行业移动应用性能分析
  • MiKTeX could not find the script engine ‘perl.exe‘ which is required to execute ‘latexmk‘.
  • ionic异常记录
  • 曜石科技宣布获得千万级天使轮投资,全方面布局电竞产业链 ...
  • #我与Java虚拟机的故事#连载19:等我技术变强了,我会去看你的 ​
  • (4)事件处理——(6)给.ready()回调函数传递一个参数(Passing an argument to the .ready() callback)...
  • (十七)devops持续集成开发——使用jenkins流水线pipeline方式发布一个微服务项目
  • (四)Controller接口控制器详解(三)
  • . ./ bash dash source 这五种执行shell脚本方式 区别
  • .java 9 找不到符号_java找不到符号
  • .NET CLR基本术语
  • .NET DataGridView数据绑定说明
  • .net 反编译_.net反编译的相关问题
  • .net 重复调用webservice_Java RMI 远程调用详解,优劣势说明
  • .net对接阿里云CSB服务
  • .Net多线程总结
  • .NET建议使用的大小写命名原则
  • .xml 下拉列表_RecyclerView嵌套recyclerview实现二级下拉列表,包含自定义IOS对话框...
  • @Transactional注解下,循环取序列的值,但得到的值都相同的问题
  • [ web基础篇 ] Burp Suite 爆破 Basic 认证密码
  • [BZOJ 4598][Sdoi2016]模式字符串
  • [CF482B]Interesting Array
  • [CSS] - 修正IE6不支持position:fixed的bug
  • [DM复习]Apriori算法-国会投票记录关联规则挖掘(上)
  • [Dxperience.8.*]报表预览控件PrintControl设置
  • [Effective C++读书笔记]0012_复制对象时勿忘其每一部分
  • [HCTF 2018]WarmUp (代码审计)
  • [JavaWeb]——过滤器filter与拦截器Interceptor的使用、执行过程、区别