开启辅助访问
 找回密码
 注册帐号

扫一扫,访问微社区

蛮牛译馆

关注:566

当前位置:游戏蛮牛 技术专区 蛮牛译馆

查看: 1251|回复: 8

[Unreal教程] UE4教程-C++实现简单AI

[复制链接]  [移动端链接]
排名
7824
昨日变化
7

245

主题

283

帖子

1465

积分

Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15

UID
159865
好友
9
蛮牛币
3709
威望
0
注册时间
2016-8-1
在线时间
615 小时
最后登录
2017-9-22

蛮牛译员

发表于 2017-1-12 17:18:08 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?注册帐号

x
本帖最后由 manew_JR 于 2017-1-12 17:19 编辑

UnrealEngine是一个非常强大的引擎,UE4基于DirectX11,拥有新的材料流水线、蓝图视觉化脚本、直观蓝图调试、内容浏览器、人物动画、Matinee影院级工具集、后期处理效果、热重载、模拟与沉浸式视角、实时游戏预览、AI人工智能、音频、中间件集成等一系列全新特性。

下面是用C++结合蓝图实现一个简单的AI功能。效果如下图

01.gif

· 首先创建一个C++的第三人称工程,UE4的工程有很多类型,我们可以根据自己的需要选择。

· 然后新建需要的C++文件,包括AIPatrol、AIPatrolController、AI巡逻的目标点AITargetPoint,类型分别为Character、Controller、TargetPoint。

· 将上述三个文件扩展成蓝图,这样C++和蓝图可以结合起来,比较方便的实现一些功能。

新建BehaviorTree、Blackboard。行为树用来实现AI的逻辑。
02.png

在AIPatrol上加BehaviorTree:
[C++] 纯文本查看 复制代码
UPROPERTY(EditAnywhere,Category=AI)//add behavior to character    class UBehaviorTree* BehaviorTree;


· 配置character的参数
03.png

04.png

AIPatrolController
.h文件:
[C++] 纯文本查看 复制代码
/*behavior tree component*/
           UBehaviorTreeComponent* BehaviorComp;

            /*Our blackboard component*/
            UBlackboardComponent* BlackboardComp;

            /*Blackboard keys*/
            UPROPERTY(EditDefaultsOnly, Category = AI)
                   FName LocationToGoKey;

            UPROPERTY(EditDefaultsOnly, Category = AI)
                   FName PlayerKey;

            //store all TargetPoints
            TArray<AActor*> PatrolPoints;

            virtual void Possess(APawn* Pawn) override;public:
     AAIPatrolController();

     void SetPlayerCaught(APawn* Pawn);//caught:捕捉

     /*Inline getter functions*/
     FORCEINLINE UBlackboardComponent* GetBlackboardComp() const { return BlackboardComp; }
     FORCEINLINE TArray<AActor* > GetPatrolPoints() const { return PatrolPoints; }

.cpp文件:
[C++] 纯文本查看 复制代码
AAIPatrolController::AAIPatrolController()
{
       /*initialize blackboard and behavior tree*/
       BehaviorComp = CreateDefaultSubobject<UBehaviorTreeComponent>(TEXT("BehaviorComp"));
       BlackboardComp = CreateDefaultSubobject<UBlackboardComponent>(TEXT("BlackboardComp"));

       /*Initialize blackboard keys*/
       PlayerKey = "Target";
       LocationToGoKey = "LocationToGo";
}

void AAIPatrolController::SetPlayerCaught(APawn* MyPawn)
{
       if (BlackboardComp)
       {
              BlackboardComp->SetValueAsObject(PlayerKey, MyPawn);
       }
}

void AAIPatrolController::Possess(APawn* MyPawn)
{
       Super::Possess(MyPawn);

       /*Get reference to the character*/
       AAIPatrol* AICharacter = Cast<AAIPatrol>(MyPawn);
       if (AICharacter)
       {
              if (AICharacter->BehaviorTree->BlackboardAsset)
              {
                     BlackboardComp->InitializeBlackboard(*(AICharacter->BehaviorTree->BlackboardAsset));
              }

              /*Populate patrol point array*/
              UGameplayStatics::GetAllActorsOfClass(GetWorld(), AAIpPatrolPoint::StaticClass(), PatrolPoints);

              BehaviorComp->StartTree(*AICharacter->BehaviorTree);

       }
}

玩家被抓住的方法:
AIPatrolController:
[C++] 纯文本查看 复制代码
void AAIPatrolController::SetPlayerCaught(APawn* MyPawn)//玩家被抓住
{
     if (BlackboardComp)
     {
            BlackboardComp->SetValueAsObject(PlayerKey, MyPawn);//给玩家添加key值
     }
}

AIPatrol:
[C++] 纯文本查看 复制代码
AAIPatrol::AAIPatrol()
{
       //Initialize senses
       /**UPawnSensingComponent :
       * SensingComponent encapsulates(封装) sensory(感知) (ie sight and hearing) settings and functionality for an Actor,
       * allowing the actor to see/hear Pawns in the world. It does nothing on network clients.
       */
       PawnSensingComp = CreateDefaultSubobject<UPawnSensingComponent>(TEXT("PawnSensingComp"));
       PawnSensingComp->SetPeripheralVisionAngle(90.0f);

}
// Called when the game starts or when spawned
void AAIPatrol::BeginPlay()
{
       Super::BeginPlay();

       if (PawnSensingComp)
       {
              /** OnSeePawn : Delegate to execute when we see a Pawn. */
              PawnSensingComp->OnSeePawn.AddDynamic(this, &AAIPatrol::OnplayerCaught);
       }
}

void AAIPatrol::OnplayerCaught(APawn* Pawn)
{
       /*Get a reference to the palyer controller*/
       AAIPatrolController* AIController = Cast<AAIPatrolController>(GetController());
       if (AIController)
       {
              GEngine->AddOnScreenDebugMessage(-1, 5.0f, FColor::Red, TEXT("You having been caught!"));
              AIController->SetPlayerCaught(Pawn);
       }
}

* 创建BTTask的C++文件,命名为BTSelectPatrolPoint。注意,这时要在Source文件夹中找到ProjectName.Build.cs文件,添加GameplayTasks到PublicDependencyModuleName中。.build.cs文件是编译文件,位于游戏性模块的根目录中,它定义了UnrealBuildTool编译该模块时要使用的一些信息。
BTTask:
[C++] 纯文本查看 复制代码
EBTNodeResult::Type UBTSelectPatrolPoint::ExecuteTask(UBehaviorTreeComponent & OwnerComp, uint8 * NodeMemory)
{

       //get AIPatrolController
       AAIPatrolController* AICon = Cast<AAIPatrolController>(OwnerComp.GetAIOwner());

       // check the get is successful
       if (AICon)
       {
              //Get Blackboard Component
              UBlackboardComponent* BlackboardComp = AICon->GetBlackboardComp();

              // get patrolPoint
              AAIpPatrolPoint* CurrentPoint = Cast<AAIpPatrolPoint>(BlackboardComp->GetValueAsObject("LocationToGo"));

              TArray<AActor*> AvailablePatrolPoints = AICon->GetPatrolPoints();
              AAIpPatrolPoint* NextPatrolPoint = nullptr;

              // set NextPatrolPoint
              if (AICon->CurrentPatrolPoint != AvailablePatrolPoints.Num() - 1)
              {
                     NextPatrolPoint = Cast<AAIpPatrolPoint>(AvailablePatrolPoints[++AICon->CurrentPatrolPoint]);
              }
              else
              {
                     NextPatrolPoint = Cast<AAIpPatrolPoint>(AvailablePatrolPoints[0]);
                     AICon->CurrentPatrolPoint = 0;
              }

              // set blackboard keyValue
              BlackboardComp->SetValueAsObject("LocationToGo", NextPatrolPoint);
              return EBTNodeResult::Succeeded;
       }
       return EBTNodeResult::Failed;

}


· 将BP_AIPatrol放入场景,摆放好BP_AIPatrolPoints,即AI 要走的路径,编辑BehaviorTree。
05.png

BehaviorTree的思路是首先执行BTSelectPatrolPoint,如果没有找到目标,就move to key值为LocationToGo的点,如果找到了Target,就移动到Target处,然后在target处停留1秒。

· 最后,添加自动寻路组件NavMeshBoundsVolume,这样AI在寻路过程中就会自动绕开障碍物。


    》》译馆招募新译员啦!《《
       蛮牛译林军福利多多哦!

155547iluo7umxezrb2ekr.png


评分

参与人数 1鲜花 +1 收起 理由
mycoolmc + 1 赞一个!

查看全部评分


回复

使用道具 举报

排名
51131
昨日变化
561

0

主题

18

帖子

35

积分

Rank: 1

UID
74341
好友
0
蛮牛币
-4
威望
0
注册时间
2015-2-11
在线时间
15 小时
最后登录
2017-1-12
发表于 2017-1-12 19:18:33 | 显示全部楼层
收藏了!

回复

使用道具 举报

排名
51131
昨日变化
561

0

主题

26

帖子

44

积分

Rank: 1

UID
200902
好友
0
蛮牛币
16
威望
0
注册时间
2017-1-11
在线时间
16 小时
最后登录
2017-3-8
发表于 2017-1-12 19:52:32 | 显示全部楼层
原创or转译?

回复

使用道具 举报

3偶尔光临
229/300
排名
9236
昨日变化
11

1

主题

111

帖子

229

积分

Rank: 3Rank: 3Rank: 3

UID
195727
好友
0
蛮牛币
481
威望
0
注册时间
2016-12-23
在线时间
33 小时
最后登录
2017-6-18
发表于 2017-1-12 23:53:24 | 显示全部楼层
kkkkkkkkkjjjjjjj1321jjjjjjjjjjjj

回复 支持 反对

使用道具 举报

4四处流浪
331/500
排名
11009
昨日变化
13

0

主题

222

帖子

331

积分

Rank: 4

UID
181594
好友
0
蛮牛币
133
威望
0
注册时间
2016-11-7
在线时间
47 小时
最后登录
2017-8-2
发表于 2017-1-13 10:16:48 | 显示全部楼层
C++和Csharp哪个好学呀

回复 支持 反对

使用道具 举报

7日久生情
1948/5000
排名
557
昨日变化

0

主题

243

帖子

1948

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
1073
好友
0
蛮牛币
3597
威望
0
注册时间
2013-7-21
在线时间
547 小时
最后登录
2017-7-26

社区QQ达人

发表于 2017-1-15 12:15:44 | 显示全部楼层
萨满狼骑 发表于 2017-1-13 10:16
C++和Csharp哪个好学呀

当然 C Sharp 好学啊。不过你要是玩UE4,你就不得不学C++了

回复 支持 反对

使用道具 举报

排名
51131
昨日变化
561

0

主题

11

帖子

16

积分

Rank: 1

UID
3656
好友
1
蛮牛币
1
威望
0
注册时间
2013-9-11
在线时间
3 小时
最后登录
2017-1-17
发表于 2017-1-17 16:03:39 | 显示全部楼层
不错~~有机会尝试一下虚幻引擎

回复 支持 反对

使用道具 举报

6蛮牛粉丝
1243/1500
排名
2175
昨日变化
15

0

主题

422

帖子

1243

积分

Rank: 6Rank: 6Rank: 6

UID
164723
好友
0
蛮牛币
2525
威望
0
注册时间
2016-8-29
在线时间
313 小时
最后登录
2017-9-26
发表于 2017-1-19 10:39:55 | 显示全部楼层
谢谢分享

回复

使用道具 举报

7日久生情
1775/5000
排名
17062
昨日变化
20

2

主题

1495

帖子

1775

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
185807
好友
0
蛮牛币
2365
威望
0
注册时间
2016-11-22
在线时间
254 小时
最后登录
2017-9-26
发表于 2017-2-23 11:22:36 | 显示全部楼层
不错,不错,谢谢分享

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册帐号

本版积分规则

快速回复 返回顶部 返回列表