从零开始使用UEC++创建一个简易的AI—第一部分
这篇文章的内容为创建一个简易的AI。使用的引擎为UE4,C++加行为树结合
通过这篇文章能够简单熟悉使用UC++创建AI的一般流程。
一.创建项目
1.选择第三人称(选择这个会有一个简易的玩家模版,我们主要讨论AI)
2.点击下一步
3.选择C++
4.其他无所谓(但是建议按照我的步骤来)
5.点击下一步
项目创建好的样子:
运行可以直接操作玩家,但是只是具备简单的跑动跳跃功能。
二、开始创建所需的类
由于目前功能比较简单,我们只需要创建两个类
1.Character类,取名为MyAICharacter
2.AIController类,取名为MyAIController
这里选择public文件可以方便管理。
创建好一个类就会生成一个cpp文件和一个头文件。
.h文件也就是头文件,一般做声明用
cpp文件才是我们编写功能代码的地方
三、创建好对应的行为树和黑板等。
1.行为树
2.黑板
右键文件夹
Behaviortree和blackboard两个
创建完成:
1.打开我们创建好的行为树,点击黑板,选择我们创建好的黑板
2.打开黑板,黑板一般有一个默认的键值,selfActor,如果没有就自己创建,我们给他换个名字为TargetActor
四:继承之前创建的类创建蓝图
Character和Controller都要创建
创建好的样子
五、给AI绑定好行为树和Controller
1.打开角色蓝图,倒入mesh
2.绑定控制器
选择我们创建好的蓝图(注意不要直接选择C++类,C++类我们没有对行为树初始化)
2.编写Controller类代码
2.1头文件
#pragma once
#include "CoreMinimal.h"
#include "AIController.h"
#include "MyAIController.generated.h"
/**
*
*/
class UBehaviorTree;
UCLASS()
class TEST_API AMyAIController : public AAIController
{
GENERATED_BODY()
protected:
virtual void BeginPlay() override;//重载父类方法
public:
UPROPERTY(EditDefaultsOnly,Category="AI")//这里不知道的话可以先去了解下UE的宏反射
UBehaviorTree* MyBehaviorTree;
};
2.2cpp文件
#include "MyAIController.h"
#include "AIController.h"
void AMyAIController::BeginPlay()
{
Super::BeginPlay();//加载父类
if (MyBehaviorTree)//防止空指针
{
RunBehaviorTree(MyBehaviorTree);//直接运行
}
}
3.编译
1.将编辑器关闭,ctrl+f5编译,他会自动打开
2.编译完成之后,打开controller蓝图可以看到我们在代码中生成的行为树选项
选择对应的行为树。
六、编写行为树
1.拉出箭头选择sequence节点
2.同样在sequence节点下拉出moveto和wait两个节点,但是要修改moveto节点的目标值为targetactor
七、最后一步,编写功能代码,让ai可以识别玩家并且跟随。
#include "MyAIController.h"
#include "AIController.h"
#include "BehaviorTree/BlackboardComponent.h"
#include "Kismet/GameplayStatics.h"
#include "GameFramework/Character.h"
void AMyAIController::BeginPlay()
{
Super::BeginPlay();//加载父类
if (ensure(MyBehaviorTree))//防止空指针
{
RunBehaviorTree(MyBehaviorTree);//直接运行
}
UBlackboardComponent* temBB = GetBlackboardComponent();
ACharacter *player = UGameplayStatics::GetPlayerCharacter(GetWorld(),0);//拿到玩家实例
if (ensure(temBB))
{
temBB->SetValueAsObject("TargetActor", player);
}
}
到这里,我们的AI就能够识别玩家了,但是,这时候运行是不可能跟随我们的,为什么呢?因为我们还没有添加NavMeshBoundsVolume组件给地面
拖到场景中,是一个正方体,调节他的大小。
如何查看地面有没有烘焙好呢?点击左上角的show,打开navigation,绿色的就是ai能到达的地方
运行,发现AI能够随时跟随我们。
我们可以查看行为树的运行情况:
至此,一个简易的AI就完成了。
下一篇记录让AI增加巡逻,和视野功能。