首页 > 其他分享 >Unity 的行为决策树的技术原理

Unity 的行为决策树的技术原理

时间:2024-01-26 09:35:08浏览次数:23  
标签:游戏 public Unity 原理 行为 节点 决策树

Unity的行为决策树是一种强大的工具,用于创建复杂的游戏人工智能(AI)。行为决策树是一种图形化的编程工具,它可以将游戏角色的行为和决策过程可视化,从而使开发人员更容易理解和调试游戏AI。在本文中,我们将详细讲解Unity的行为决策树的技术原理,并给出相应的代码实现。

对啦!这里有个游戏开发交流小组里面聚集了一帮热爱学习游戏的零基础小白,也有一些正在从事游戏开发的技术大佬,欢迎你来交流学习。

一、行为决策树的基本概念

行为决策树是一种树形结构,用于描述游戏角色的行为和决策过程。它由一系列节点组成,每个节点代表一个行为或决策。节点之间通过连接线相连,形成一个有向无环图(DAG),从而描述了游戏角色的行为和决策过程。

行为决策树的节点有多种类型,包括条件节点、动作节点、选择节点、序列节点等。条件节点表示一个条件,如“是否有敌人在视野范围内”;动作节点表示一个行为,如“向目标移动”;选择节点表示一个选择,如“选择攻击还是逃跑”;序列节点表示一个序列,如“先向目标移动,再进行攻击”。

行为决策树的执行过程是从根节点开始,逐级向下遍历,直到找到一个叶子节点为止。叶子节点表示一个行为,执行该行为并返回结果。如果该行为执行成功,则向上返回成功;否则向上返回失败。节点之间的连接线有多种类型,包括顺序连接、选择连接、并行连接等。顺序连接表示节点之间的顺序关系,如“先执行A节点,再执行B节点”;选择连接表示节点之间的选择关系,如“如果条件成立,则执行A节点,否则执行B节点”;并行连接表示节点之间的并行关系,如“同时执行A节点和B节点”。

二、行为决策树的实现

Unity中提供了一个行为决策树插件——Behavior Designer,它可以帮助开发人员创建复杂的游戏AI。Behavior Designer提供了一系列节点类型,包括条件节点、动作节点、选择节点、序列节点等。开发人员可以根据游戏需求自定义节点类型,并将它们添加到行为决策树中。

Behavior Designer的节点脚本使用C#编写,每个节点脚本继承自BehaviorDesigner.Runtime.Tasks.Task类。每个节点脚本都实现了一个Execute方法,该方法用于执行节点的行为或决策过程。在节点的Execute方法中,开发人员可以访问游戏对象的属性和方法,从而实现游戏AI的行为和决策过程。

Behavior Designer的行为决策树使用Unity的序列化机制进行保存和加载。开发人员可以将行为决策树保存为一个.asset文件,并在游戏中加载它。在游戏中加载行为决策树后,可以通过Behavior Designer提供的API来执行行为决策树并获取结果。

三、行为决策树的实例

下面我们来看一个简单的行为决策树实例,该实例描述了一个游戏角色的巡逻行为。

首先我们需要创建一个行为决策树,并添加一个序列节点。在序列节点中添加两个动作节点,分别表示“向目标移动”和“等待一段时间”。在“向目标移动”节点中,我们需要访问游戏对象的位置属性,并计算出与目标位置的距离。如果距离小于一定值,则返回成功;否则返回运行状态。在“等待一段时间”节点中,我们需要使用协程来实现等待功能。代码如下:

using UnityEngine;
using BehaviorDesigner.Runtime;
using BehaviorDesigner.Runtime.Tasks;
using System.Collections;

public class MoveToTarget : Action
{
    public SharedGameObject target;
    public float moveSpeed = 5f;
    public float stoppingDistance = 1f;

    private Transform targetTransform;
    private Transform agentTransform;

    public override void OnStart()
    {
        targetTransform = target.Value.transform;
        agentTransform = transform;
    }

    public override TaskStatus OnUpdate()
    {
        float distance = Vector3.Distance(targetTransform.position, agentTransform.position);
        if (distance < stoppingDistance)
        {
            return TaskStatus.Success;
        }
        else
        {
            agentTransform.position = Vector3.MoveTowards(agentTransform.position, targetTransform.position, moveSpeed * Time.deltaTime);
            return TaskStatus.Running;
        }
    }
}

public class WaitForSeconds : Action
{
    public float waitTime = 1f;

    public override IEnumerator GetEnumerator()
    {
        yield return new UnityEngine.WaitForSeconds(waitTime);
        yield return TaskStatus.Success;
    }
}

 

在上面的代码中,MoveToTarget节点表示“向目标移动”行为,WaitForSeconds节点表示“等待一段时间”行为。我们可以将这两个节点添加到行为决策树中,并设置相应的参数。

最后,我们需要将行为决策树添加到游戏对象上,并在游戏中执行它。代码如下:

using UnityEngine;
using BehaviorDesigner.Runtime;

public class Patrol : MonoBehaviour
{
    public BehaviorTree behaviorTree;

    void Start()
    {
        behaviorTree = GetComponent<BehaviorTree>();
        behaviorTree.EnableBehavior();
    }
}

 

在上面的代码中,Patrol脚本用于将行为决策树添加到游戏对象上,并在游戏中执行它。我们可以将该脚本添加到游戏对象上,并设置相应的参数。

标签:游戏,public,Unity,原理,行为,节点,决策树
From: https://www.cnblogs.com/bycw/p/17988613

相关文章

  • unity打造基于增量断点更新的下载框架与代码实现
    Unity是目前最流行的游戏引擎之一,它可以用来制作各种类型的游戏,例如2D和3D游戏。在游戏开发过程中,我们通常需要使用一些下载框架来帮助我们管理和更新游戏资源。其中,增量断点更新是一种非常重要的技术,它可以大大减少游戏下载和更新的时间和流量。对啦!这里有个游戏开发交流小组里......
  • Vue 3高级响应式数据探秘:原理、用法详解与实战示例!
     在Vue3中,数据的变化通过响应式系统来实现,该系统基于ES6的Proxy对象。Proxy对象允许拦截并自定义操作,因此Vue可以通过代理对象来实现对数据的监听和触发相应的操作。以下是Vue3中监测数据改变的原理、使用方法和步骤的详细描述,以及一个实例代码:原理:Vue3的响应式系统基于P......
  • SPSS Modeler决策树分类模型分析商店顾客消费商品数据
    全文链接:https://tecdat.cn/?p=34926原文出处:拓端数据部落公众号随着大数据时代的来临,数据挖掘和分析在商业决策中扮演着越来越重要的角色。商店的顾客消费行为数据是商业决策的关键信息之一,通过对这些数据的深入分析,可以更好地理解顾客的消费习惯和偏好,从而优化商品销售策略,提......
  • Kafka 的高可用原理
    Kafka集群由若干个Broker组成,Topic由若干个Partition组成,每个Partition可存在不同的Broker上。可以这样说,一个Topic的数据,分散在多个机器上,即每个机器上都存放一部分数据。Kafka0.8以前Kafka0.8以前是没有高可用机制的。假设一个Topic,由3个Partiton组成。......
  • TCP与UDP协议的区别以及原理
    网络(11):TCP与UDP协议的区别以及原理TCP和UDP协议的区别以及原理最近重新认知了一下TCP和UDP的原理以及区别,做一个简单的总结。一、作用首先,tcp和udp都是工作在传输层,用于程序之间传输数据的。数据一般包含:文件类型,视频类型,jpg图片等。二、区别TCP是基于连接的,而UDP是基于非连接......
  • 【完整版教程】iOS混淆加固原理篇
    引言在iOS开发中,应用程序的安全性和保护显得尤为重要。由于iOS系统的开放性,一些逆向工具可以轻松地对应用程序进行反编译和分析,从而导致应用程序源代码、算法和敏感信息的泄露。为了保护应用程序的安全性,我们需要对应用程序进行混淆加固。本文将介绍iOS混淆加固的原理和常见的加......
  • 记一次使用蓝叠模拟器连接Unity profiler的经历
    由于游戏存在卡顿,且在电脑上editor模式下的测试可能不够正确,于是计划在安卓模拟器中使用profiler工具但是profiler还没用,就被拦在连接这一步。好,让我们去看文档第一步:切换这个我想要去切换的文档中所说的这个档位时——unity似乎没有并什么动作,不明所以的我还以为是卡住了,......
  • 申请开启|加入亚马逊云科技 Community Builder,你准备好了吗?
    亚马逊云科技开发者社区为开发者们提供全球的开发技术资源。这里有技术文档、开发案例、技术专栏、培训视频、活动与竞赛等。帮助中国开发者对接世界最前沿技术,观点,和项目,并将中国优秀开发者或技术推荐给全球云社区。如果你还没有关注/收藏,看到这里请一定不要匆匆划过,点这里让它......
  • 袋鼠云数栈产品中 AI+ 实现原理剖析
    我们是袋鼠云数栈UED团队,致力于打造优秀的一站式数据中台产品。我们始终保持工匠精神,探索前端道路,为社区积累并传播经验价值。本文作者:修能生产力工具+AI是不可逆转的趋势,慢慢的大模型能力通过AIAgent落地的工程化能力也开始趋于成熟。作为大数据产品的数栈也必然是......
  • Go语言实现HTTP代理的原理与步骤
    在计算机网络中,代理服务器是一种重要的中间件,它能够帮助客户端和服务器进行通信,并处理各种网络请求和响应。在Go语言中,我们可以使用标准库中的"net/http"包来实现一个简单的HTTP代理服务器。下面我们将介绍实现HTTP代理的原理与步骤。一、代理服务器的工作原理代理服务器的工作原理......