[unreal] 寻路:随机漫游的实现

42人阅读 评论(0) 收藏 举报
分类:

reference: https://forums.unrealengine.com/community/general-discussion/1377-ue4-pathfinding-basic-ai?1270-UE4-Pathfinding-basic-AI=

by : UE developer,IceWraith

        随机漫游的效果可以有很多种实现方法,这取决于你想要使用哪种系统。

        最好的(也是最复杂的)方法是准备行为树,不过你需要在编辑器首选项(菜单:编辑->编辑器偏好设置->试验性功能)中开启它们。你可以依照上面提到的教程,或者也可以按照以下步骤执行:

        (1) 创建新的黑板资源(右键人工智能->黑板),用来存储目标点:只包含的单一的键,键的类型设置为BlackbordKeyType_Vector。

        (2) 创建新的行为树任务,用以挑选随机的位置,这既可以在蓝图中完成,也可以在C++中完成。

        蓝图:新建一个蓝图(父类为BTTask_BlueprintBase), 重点在于:添加一个BlackboardKeySelector类型的变量,并且设置它的属性为public(点击变量旁边的眼睛,设置=public)


        C++:新建一个继承自UBTTask_BlackboardBase的类,实现你自己的ExecuteTask()函数。

        代码:

EBTNodeResult::Type UBTTask_FindLocation::ExecuteTask(class UBehaviorTreeComponent* OwnerComp, uint8* NodeMemory)
{
	UNavigationSystem* NavSys = UNavigationSystem::GetCurrent(OwnerComp);
	AAIController* MyAI = Cast<AAIController>(OwnerComp->GetOwner());
	if (NavSys && MyAI && MyAI->GetPawn())
	{
		const float SearchRadius = 1000.0f;
		FNavLocation RandomPt;
		
		const bool bFound = NavSys->GetRandomPointInRadius(MyAI->GetPawn()->GetActorLocation(), SearchRadius, RandomPt);
		if (bFound)
		{
			OwnerComp->GetBlackboardComponent()->SetValueAsVector(GetSelectedBlackboardKey(), RandomPt.Location);
			return EBTNodeResult::Succeeded;
		}	
	}

	return EBTNodeResult::Failed;
}

        (3) 创建新的行为树,在root属性中设置你的黑板。你可以从包含两个节点的序列组合开始:FindSpot(在步骤2中做的)和MoveTo,它们共同访问黑板中的同一个键。


        (4) 新建一个AI,并在里面运行刚才的行为树。最简单的方法是在关卡蓝图中调用SpawnAI


        正如我所说的,这是最复杂的方法,但是为你之后的修改提供了一个最好的出发点。

        下面是蓝图中比较简单的设置:

        1. 调用AIController中的MoveToLocation和MoveToActor方法。

        2. 绑定AIController中的ReceiveMoveCompleted事件,来检测是否达到了目的地。

        3. 调用GetRandomPoint / GetRandomPointInRadius函数(NavData和FilterClass都设为空),在navmesh中选择随机目标点。


        对于蓝图还有更为简单的设置:

        1. 调用AI MoveTo函数,它会为你执行结束时的事件。

        2. 调用GetRandomPoint / GetRandomPointInRadius函数(NavData和FilterClass都设为空),在navmesh中选择随机目标点。


       最后,是C++的版本:

        1.调用AIController中的MoveToLocation / MoveToActor函数。

        2. 重写AIController的OnMoveCompleted来检测下一个目标点。

        3. 访问导航系统中随机一个位置的方法如上所示。


        这时候,让我们讨论一下怎样修改寻路的影响因子。你可以定义包含不同行程或者耗费的导航区域,使用C++或者是蓝图。新建继承自NavArea的蓝图/c++类。我强烈建议将遍历耗费(初始耗费属性)设置为大于等于1。区域通常由NavModifierVolume或者静态网格构造的动态障碍物来完成的(为了了解更多的细节,可以查看静态网格的NavCollision属性)

        此外,你可能还需要检查额外的两个actor: ANavLinkProxy(例如跳转链接)和ANavigationTestingActor (寻路调试工具,包括单步显示)

        希望能够给你带来帮助!

查看评论

Camera Path Animator

  • 2018年02月02日 15:04
  • 551KB
  • 下载

【UE4】 第11讲 【MOBA制作日记】 HTC Vive设备安装使用及手柄控制漫游

HTC Vive是由HTC与Valve联合开发的一款VR头显(虚拟现实头戴式显示器)产品,于2015年3月在MWC2015上发布。由于有Valve的SteamVR提供的技术支持, 因此在Steam平台...
  • Nanhu2012
  • Nanhu2012
  • 2017-04-13 11:53:23
  • 741

游戏寻路算法的简单实现

提到寻路算法,大家都会想到A*算法。 在度娘找了不少代码,看了不少教程之后,尤其是这个文章中提到的总结:http://www.cppblog.com/christanxw/archive/2006/...
  • Gnorth
  • Gnorth
  • 2013-06-19 14:53:58
  • 2614

Unreal Engine 4 C++ AI 简单巡逻BehaviorTree的构建

Unreal Eegine 4 C AI 简单巡逻BehaviorTree的构建 行为树BehaviorTree介绍 行为树BehaviorTree详解 Unreal Eegine 4 C++ AI...
  • qq_20309931
  • qq_20309931
  • 2016-11-04 11:44:35
  • 804

遗传算法解决迷宫寻路问题(Java实现)

1.什么是遗传算法? 就个人理解,遗传算法是模拟神奇的大自然中生物“优胜劣汰”原则指导下的进化过程,好的基因有更多的机会得到繁衍,这样一来,随着繁衍的进行,生物种群会朝着一个趋势收敛。而生物繁衍过程...
  • mynameis121
  • mynameis121
  • 2017-06-18 17:14:39
  • 748

unity c# ai 随机漫游 攻击 避让

unity c# ai 随机漫游 攻击 避让
  • xiazaicsd55
  • xiazaicsd55
  • 2017-02-17 08:18:22
  • 180

高效游戏地图寻路,提供算法以及源码

  • 2010年05月25日 16:04
  • 638KB
  • 下载

游戏编程中的寻路算法研究

近年来,游戏产业的快速发展带动了游戏中人工智能(Artificial Intelligence,简称AI)的发展,越来越多的游戏采用人工智能技术提高游戏的可玩性。在电子游戏中,玩家操控主要角色,而其他...
  • ityuany
  • ityuany
  • 2010-04-21 09:11:00
  • 9450

游戏中的跨场景寻路

  年前写过一个跨场景寻路的程序。我们的游戏用鼠标点那种,不是像WOW那种前后左右。在同一场景中使用A*寻路,策划现在的需求是这样呢的,在任务中NPC,杀怪等需要自动寻路能走到其他场景中的NPC或者怪...
  • ericchn007
  • ericchn007
  • 2010-05-23 23:56:00
  • 2737

简单稳定能取得最优解的寻路算法

现有的寻路算法有许多, A* 寻路, 随机寻路, 广度优先的遍历算法,还有遗传算法寻路, 以上的算法在网上介绍很多, 在这里不详细介绍了。 A* 是比较有名的寻路算法, 简单,高效, 但缺点也很明显,...
  • wangzhe1945
  • wangzhe1945
  • 2010-11-03 15:59:00
  • 1004
    个人资料
    持之以恒
    等级:
    访问量: 37万+
    积分: 5620
    排名: 5853
    最新评论