C++生成AI以及AI默认Animation,AI播放Montage,AIController控制移动的实现
2017-12-04 17:41
776 查看
-首先说明,我的AI都是用c++写的,而且AI都是随着游戏进程自动生成的,我的UE4是4.17版本(版本对于默认Animation有影响,后面会提示)!!
-需要提前在蓝图中写好SkeletalMesh以及Montage以及Animation等内容,然后通过c++调用
-需要提前在蓝图中写好SkeletalMesh以及Montage以及Animation等内容,然后通过c++调用
1.在蓝图中生成一个Character类和一个Controller类,在c++中重新加载,然后在Character的.h中声明组件,变量等
FVector TargetLocation; //设置移动终点 UPROPERTY(VisibleAnyWhere, BlueprintReadonly, Category = Mesh) class USkeletalMeshComponent *MeshCom; //从蓝图中选择SkeletalMesh UPROPERTY(VisibleAnyWhere, BlueprintReadonly, Category = Mesh) class UAnimMontage *YourMontage; //从蓝图中选择Montage UPROPERTY(EditAnywhere) TSubclassOf<class UAnimInstance> BlueprintVar; //从蓝图中选择默认Animation蓝图
2.完善c++类,先添加头文件
#include "Components/CapsuleComponent.h" #include "Components/SkeletalMeshComponent.h" #include "GameFramework/CharacterMovementComponent.h" #include "UObject/ConstructorHelpers.h" #include "Engine/CollisionProfile.h" #include "Engine/World.h" #include "YouAIController.h"//你的AIController #include "Tasks/AITask_MoveTo.h" #include "Animation/AnimMontage.h"
3.构造函数,碰撞类型的相关设置在TraceForObjects和碰撞中提到过,接下来直接使用:
//初始化CapsuleComponent的大小 GetCapsuleComponent()->InitCapsuleSize(105.f, 156.0f); //设置CapsuleComponent的碰撞类型,这个碰撞类型是我自己定义的,也可以用现有的碰撞类型 GetCapsuleComponent()->BodyInstance.SetCollisionProfileName("MyCollisionType"); /*添加SkeletalMesh相关内容*/ //找到蓝图中的SkeletalMesh,路径可以通过“Copy Reference”拷贝 static ConstructorHelpers::FObjectFinder<USkeletalMesh> MeshComAssert(TEXT("/YouPath/YouSkeletalMeshName.YouSkeletalMeshName")); //给Character添加SkeletalMesh组件 MeshCom = CreateDefaultSubobject<USkeletalMeshComponent>(TEXT("Mesh0")); //给组件赋值 MeshCom->SetSkeletalMesh(MeshComAssert.Object); //挂在CapsuleComponent上 MeshCom->SetupAttachment(GetCapsuleComponent()); GetCharacterMovement()->MaxWalkSpeed = 80;//设置最大移动速度 /*添加默认Animation相关内容,我的UE4是4.17版本,这个实现方法对于不同的版本有好多,我的版本用这种方法不会报错*/ //一定要记得路径最后加“_C” static ConstructorHelpers::FObjectFinder<UAnimBlueprintGeneratedClass> WalkInstance(TEXT("Animation'/YourPath/YouAnimation.YouAnimation_C'")); //设置默认AnimClass MeshCom->AnimClass = WalkInstance.Object; /*添加Montage相关内容*/ //找到蓝图中的Montage,路径可以通过“Copy Reference”拷贝” static ConstructorHelpers::FObjectFinder<UAnimMontage> YourMontageName(TEXT("/YourPath/MontageName.MontageName")); YourMontage= YourMontageName.Object; //设置AIController AutoPossessAI = EAutoPossessAI::Spawned; AIControllerClass = AYouAIController::StaticClass(); }
4.相关函数实现
①AI移动,由AIController控制
AYouAIController * Con = Cast<AYouAIController>(GetController()); Con->MoveToLocation(TargetLocation);//TargetLocation在使用之前自行赋值
②AI播放Montage
//播放动画 if (YourMontage!= NULL) { UAnimInstance* AnimInstance = MeshCom->GetAnimInstance(); if (AnimInstance != NULL) { AnimInstance->Montage_Play(YourMontage, 1.f);//第二个参数为播放时间 } }
相关文章推荐
- 关于Android 悬浮窗问题以及仿网易云音乐底部播放控制栏实现
- 使用WPF Resource以及Transform等技术实现鼠标控制图片缩放和移动的效果
- c#调用js,以及js调用C#里的函数, c#自己生成js代码,实现对web的控制
- 在ASP.NET网站中实现带列表(其由xml文件控制生成)的视频播放
- Unreal 4引擎中,使用BehaviorTree控制AI行为的C++实现
- 使用WPF Resource以及Transform等技术实现鼠标控制图片缩放和移动的效果
- 坦克游戏教程二:实现坦克移动以及方向控制
- cocos2dx 3.15 视频播放实现 lua 以及c++ 版本VideoPlayer的使用注意 与详细示例
- 如何使用A*插件实现移动以及网格的动态生成
- Mediar.Framework—业务的实现3 (控制UI控件的可视和可编辑属性、验证、以及一对一,一对多,多对多关系)
- Reporting Service Tips 101(#4) - 使用RS实现报表的自动生成以及在程序中调用RS
- 转载---使用Ajax实现DropDownList和ListBox的联动以及两个ListBox之间数据的移动
- 使用Ajax实现DropDownList和ListBox的联动以及两个ListBox之间数据的移动
- .NET生成GUID 以及C#验证码的实现
- 一个无聊男人的疯狂《数据结构与算法分析-C++描述》学习笔记 用C++/lua/python/bash的四重实现(7)习题2.8 随机数组的三种生成算法
- 一个无聊男人的疯狂《数据结构与算法分析-C++描述》学习笔记 习题2.8 随机数组的三种生成算法(补) 将bash的实现翻译成比较纯正的bash风格
- C++实现自绘按钮控制
- reportviewer动态加载报表的实现以及动态控制报表,套打,存折打印模式等的一些探讨,欢迎批评指正!
- 使用Ajax实现DropDownList和ListBox的联动以及两个ListBox之间数据的移动
- C++ Builder 实现动态生成窗口、控件,以及处理控件事件