unity行为树的简单实现

这篇具有很好参考价值的文章主要介绍了unity行为树的简单实现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

行为树,英文是Behavior Tree,简称BT,是一棵用于控制 AI 决策行为的、包含了层级节点的树结构。 当我们要决策当前这个士兵要做什么样的行为的时候, 我们就会自顶向下的,通过一些条件来搜索这颗树,最终确定需要做的行为(叶节点),并且执行它 ,这就是行为树的基本原理。

正文
话不多说直接上代码,下面是第一个脚本。

using UnityEngine;

namespace MDD.AI {

    //声明一个枚举

    public enum NodeState
    {
        Successufully,
        Failure,
        Running
    }

    // 创建一个 抽象函数 供子类调用
    public abstract class BTNode 
    {
        public abstract NodeState Tick();
    }

    //

    public  abstract class BTBifurcate : BTNode
    {
        protected List<BTNode> ChildNode = new List<BTNode>();

        protected int currentChild = 0;
        /// <summary>
        /// 
        /// </summary>
        /// <param name="chlidNode">BTNode类型的任意多个参数</param>
        /// <returns></returns>
        public virtual BTBifurcate open(params BTNode [] chlidNode) 
        {
            for (int i = 0; i < chlidNode.Length; ++i)
            {
                ChildNode.Add(chlidNode[i]);
            }
            
            return this;
            
        }
    }


    /// <summary>
    ///  顺序节点,依次执行所有的子节点,当有一个子节点主执行失败的时候就不会继续执行后面的节点
    /// </summary>
    public class BTSequential : BTBifurcate
    {
        public override NodeState Tick()
        {
            var childNode = ChildNode[currentChild].Tick();

            switch (childNode) 
            {
                case NodeState.Successufully:
                    currentChild++;
                    if (currentChild == ChildNode.Count) {
                        currentChild = 0;
                    }
                    return NodeState.Successufully;
                case NodeState.Failure:
                    currentChild = 0;
                    return NodeState.Failure;
                case NodeState.Running:
                    return NodeState.Running;
            }
            return NodeState.Successufully;
        }
    }

    /// <summary>
    /// 选择节点,依次执行所有的节点, 只要有一个节点执行成功就不执行后续的节点了
    /// </summary>
    public class BTSelect : BTBifurcate
    {
        public override NodeState Tick()
        {
            var childNode = ChildNode[currentChild].Tick();

            switch (childNode)
            {
                case NodeState.Successufully:
                    currentChild = 0;
                    return NodeState.Successufully;
                case NodeState.Failure:
                    currentChild++;
                    if (currentChild == ChildNode.Count)
                    {
                        currentChild = 0;
                    }
                    return NodeState.Failure;
                case NodeState.Running:
                    return NodeState.Running;
            }
            return NodeState.Failure;
        }
    }
    //循环一直进行循环可以一直执行某一个行为知道条件改变
    public class BTLoopNode : BTBifurcate
    {
        public override NodeState Tick()
        {
            var childNode = ChildNode[currentChild].Tick();
            while (true) 
            {
                switch (childNode)
                {
                    case NodeState.Running:
                        return NodeState.Running;
                    default:
                        currentChild++;
                        if (currentChild == ChildNode.Count)
                        {
                            currentChild = 0;
                            return NodeState.Successufully;
                        }
                   continue;
                }
            }

        }
    }

// 条件
    public abstract class BTconditionNode : BTNode { }
//动作/行为
    public abstract class BTActionNode : BTNode { }
}

接下来是第二个脚本

using UnityEngine;
using MDD.AI;

public class BehaviourTree : MonoBehaviour
{
    protected BTLoopNode m_Root;

    protected virtual void Start()
    {
        m_Root = new BTLoopNode();
    }

    protected virtual void Update()
    {
        m_Root.Tick();
    }

    protected void AddNode(params BTNode[] child) 
    {
        m_Root.open(child);
    }
}

写到这里也就大致将行为树写完了,接下来是测试脚本。
在这里我准备了两个行为脚本和一个条件脚本。

using System;
using UnityEngine;
using MDD.AI;
public class BTAction_01 : BTActionNode
{
//行为脚本
   /// <summary>
    /// 把这个函数当作mono的一个动作
    /// </summary>
    /// <returns></returns>
    public override NodeState Tick()
    {
        OnAction();
        return NodeState.Successufully;
    }

    private void OnAction() 
    {
        Debug.Log("动作11");
    }
}
using System;
using UnityEngine;
using MDD.AI;


public class BTAction_02 : BTActionNode
{
 //行为脚本
    /// <summary>
    /// 把这个函数当作mono的一个动作
    /// </summary>
    /// <returns></returns>
    public override NodeState Tick()
    {
        OnAction();
        return NodeState.Successufully;
    }
    private void OnAction()
    {
        Debug.Log("动作22");
    }
}
using System;
using UnityEngine;
using MDD.AI;
public class BTconNode : BTconditionNode
{
//声明一个委托
    private Func<bool> func;

    public BTconNode(Func<bool> _func)
    {
        func = _func;
    }
    public override NodeState Tick()
    {
        if (func != null)
        {
            return (func.Invoke()) ? NodeState.Successufully : NodeState.Failure;
        }
        return NodeState.Failure;
    }
}

接下来就是正是的测试脚本了

using System;
using MDD.AI;
using UnityEngine;

public class TestBT : BehaviourTree
{

    public bool b;
    protected override void Start()
    {
        base.Start();

        AddNode(new BTSelect().open(new BTSequential().open(new BTconNode(testBool),new BTAction_01()),new BTAction_02()));
    }

    public bool testBool() 
    {
        Debug.Log("我是test");
        return b;
    }
}

可以在inspector上更改b的值来观察打印数值 以便更好的理解上述的简单的行为树。文章来源地址https://www.toymoban.com/news/detail-735709.html

到了这里,关于unity行为树的简单实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Unity 简单跑酷游戏策划与实现

    游戏名称:无尽探险跑酷(Endless Adventure Runner) 游戏类型:无尽跑酷 游戏背景 在一个充满未知和奇迹的世界中,玩家将扮演一名勇敢的探险家,穿越各种神秘的地域,躲避重重障碍,收集宝藏,并挑战自己的极限。 核心玩法 跑酷冒险 :玩家控制角色在无尽的道路上不断前

    2024年02月03日
    浏览(47)
  • 【Unity实战】实现一款简单的FPS游戏

    实现一款FPS游戏需要以下步骤: 1.创建场景:在Unity中创建3D场景,设定地形、灯光、天气等环境,新增角色、武器等道具。 2.角色控制:创建角色,并添加Unity内置的角色控制器或自定义控制器脚本,处理角色的移动、射击、跳跃、动作等。 3.武器系统:创建武器模型,添加

    2024年02月06日
    浏览(43)
  • 简单的Unity中设置游戏死亡界面并实现跳转

    在Unity中设置游戏死亡界面可以通过以下步骤完成: 创建新的场景:在Unity的菜单栏中选择“File”,然后选择“New Scene”。这将创建一个新的、空的场景。 创建游戏死亡UI:在新的场景中创建一个游戏死亡界面。可以使用Unity的UI工具来创建UI元素,例如文本、按钮、背景等。

    2024年02月06日
    浏览(96)
  • Unity 游戏开发、01 基础知识大全、简单功能脚本实现

    Unity默认窗口布局 Hierarchy 层级窗口 Scene 场景窗口,3D视图窗口 Game 游戏播放窗口 Inspector 检查器窗口,属性窗口 Project 项目窗口 Console 控制台窗口 恢复默认布局 Window | Layouts | Default 调大页面字体 Preference | UI Scaling 新项目默认创建了 SampleScene 场景 {摄像机,平行光} SampleScen

    2024年02月09日
    浏览(60)
  • Unity 游戏开发、01 基础篇 | 知识大全、简单功能脚本实现

    Unity默认窗口布局 Hierarchy 层级窗口 Scene 场景窗口,3D视图窗口 Game 游戏播放窗口 Inspector 检查器窗口,属性窗口 Project 项目窗口 Console 控制台窗口 恢复默认布局 Window | Layouts | Default 调大页面字体 Preference | UI Scaling 新项目默认创建了 SampleScene 场景 {摄像机,平行光} SampleScen

    2024年02月09日
    浏览(57)
  • 【制作100个unity实战之2】实现一款简单的FPS游戏

    实现一款FPS游戏需要以下步骤: 1.创建场景:在Unity中创建3D场景,设定地形、灯光、天气等环境,新增角色、武器等道具。 2.角色控制:创建角色,并添加Unity内置的角色控制器或自定义控制器脚本,处理角色的移动、射击、跳跃、动作等。 3.武器系统:创建武器模型,添加

    2024年02月04日
    浏览(64)
  • 十八、Unity游戏引擎入门

    1、下载     首先需要下载Unity Hub,下载网址:https://unity.com/cn。     然后在其中下载Unity编辑器并安装,可选择最新版本。     接着需要选择适合的开发环境,例如Android Studio或Xcode,以便进行手机游戏开发。在安装完Unity后,需要根据项目需求下载对应的模块和插件,例

    2024年02月16日
    浏览(77)
  • 使用团结引擎开发Unity 3D射击游戏

           本案例是初级案例,意在引导想使用unity的初级开发者能较快的入门,体验unity开发的方便性和简易性能。       本次我们将使用团结引擎进行开发,帮助想体验团结引擎的入门开发者进行较快的环境熟悉。      本游戏是一个俯视角度的射击游戏。主角始终位于屏幕

    2024年01月19日
    浏览(74)
  • Unity、UE、Cocos游戏开发引擎的区别

    Unity、Unreal Engine(UE)和Cocos引擎是三个常用的游戏开发引擎,它们在功能和特性上有一些区别。以下是它们之间的主要区别: 编程语言:Unity使用C#作为主要的编程语言,开发者可以使用C#脚本进行游戏逻辑编写。Unreal Engine主要使用C++作为编程语言,但也支持蓝图系统,允许

    2024年02月22日
    浏览(64)
  • 30分钟了解所有引擎组件,132个Unity 游戏引擎组件速通!【收藏 == 学会】

    🎬 博客主页:https://xiaoy.blog.csdn.net 🎥 本文由 呆呆敲代码的小Y 原创,首发于 CSDN 🙉 🎄 学习专栏推荐:Unity系统学习专栏 🌲 游戏制作专栏推荐:游戏制作 🌲Unity实战100例专栏推荐:Unity 实战100例 教程 🏅 欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正! 📆 未来很长

    2024年02月11日
    浏览(71)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包