一文足矣:Unity&行为树(二)

简介: 一文足矣:Unity&行为树

DataBase


数据库作为存放所有数据的地方,能够通过key-Value的方式去调取任意数据,你可以理解为全局变量黑板,我们可以手动添加数据,并通过节点来访问数据:

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System;
/// <summary>
/// Database is the blackboard in a classic blackboard system. 
/// (I found the name "blackboard" a bit hard to understand so I call it database ;p)
/// 
/// It is the place to store data from local nodes, cross-tree nodes, and even other scripts.
/// Nodes can read the data inside a database by the use of a string, or an int id of the data.
/// The latter one is prefered for efficiency's sake.
/// </summary>
public class Database : MonoBehaviour {
  // _database & _dataNames are 1 to 1 relationship
  private List<object> _database = new List<object>();
  private List<string> _dataNames = new List<string>();
  // Should use dataId as parameter to get data instead of this
  public T GetData<T> (string dataName) {
    int dataId = IndexOfDataId(dataName);
    if (dataId == -1) Debug.LogError("Database: Data for " + dataName + " does not exist!");
    return (T) _database[dataId];
  }
  // Should use this function to get data!
  public T GetData<T> (int dataId) {
    if (BT.BTConfiguration.ENABLE_DATABASE_LOG) {
      Debug.Log("Database: getting data for " + _dataNames[dataId]);
    }
    return (T) _database[dataId];
  }
  public void SetData<T> (string dataName, T data) {
    int dataId = GetDataId(dataName);
    _database[dataId] = (object) data;
  }
  public void SetData<T> (int dataId, T data) {
    _database[dataId] = (object) data;
  }
  public int GetDataId (string dataName) {
    int dataId = IndexOfDataId(dataName);
    if (dataId == -1) {
      _dataNames.Add(dataName);
      _database.Add(null);
      dataId = _dataNames.Count - 1;
    }
    return dataId;
  }
  private int IndexOfDataId (string dataName) {
    for (int i=0; i<_dataNames.Count; i++) {
      if (_dataNames[i].Equals(dataName)) return i;
    }
    return -1;
  }
  public bool ContainsData (string dataName) {
    return IndexOfDataId(dataName) != -1;
  }
}
// IMPORTANT: users may want to put Jargon in a separate file
//public enum Jargon {
//  ShouldReset = 1,
//}

行为树入口


之前的代码都是行为树框架本身,现在,我们需要通过节点去构建这个行为树入口,以能够真正的使用:

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using BT;
// How to use:
// 1. Initiate values in the database for the children to use.
// 2. Initiate BT _root
// 3. Some actions & preconditions that will be used later
// 4. Add children nodes
// 5. Activate the _root, including the children nodes' initialization
public abstract class BTTree : MonoBehaviour {
  protected BTNode _root = null;
  [HideInInspector]
  public Database database;
  [HideInInspector]
  public bool isRunning = true;
  public const string RESET = "Rest";
  private static int _resetId;
  void Awake () {
    Init();
    _root.Activate(database);
  }
  void Update () {
    if (!isRunning) return;
    if (database.GetData<bool>(RESET)) {
      Reset();  
      database.SetData<bool>(RESET, false);
    }
    // Iterate the BT tree now!
    if (_root.Evaluate()) {
      _root.Tick();
    }
  }
  void OnDestroy () {
    if (_root != null) {
      _root.Clear();
    }
  }
  // Need to be called at the initialization code in the children.
  protected virtual void Init () {
    database = GetComponent<Database>();
    if (database == null) {
      database = gameObject.AddComponent<Database>();
    }
    _resetId = database.GetDataId(RESET);
    database.SetData<bool>(_resetId, false);
  }
  protected void Reset () {
    if (_root != null) {
      _root.Clear();  
    }
  }
}

行为树的事件GraphEvent


当发送一个事件时,场景里的所有的owener都可以同时响应这个事件。

也可以通过脚本来发送事件,做受击响应可行。

发送事件


image.png

监听事件


image.png

脚本发送事件


image.png

目录
相关文章
|
人工智能 定位技术 图形学
【unity实战】制作敌人的AI,使用有限状态机、继承和抽象类多态 定义不同状态的敌人行为
【unity实战】制作敌人的AI,使用有限状态机、继承和抽象类多态 定义不同状态的敌人行为
933 1
|
图形学
【unity小技巧】手戳代码程序化绘制地形Terrain树和预制体物品、动物
【unity小技巧】手戳代码程序化绘制地形Terrain树和预制体物品、动物
389 0
|
图形学
【推荐100个unity插件之17】具有可破坏/砍倒unity地形树木能力的破坏系统,实现unity砍树效果 —— DestroyIt - Destruction System
【推荐100个unity插件之17】具有可破坏/砍倒unity地形树木能力的破坏系统,实现unity砍树效果 —— DestroyIt - Destruction System
1068 0
|
人工智能 数据可视化 程序员
【推荐100个unity插件之7】使用BehaviorDesigner插件制作BOSS的AI行为树
【推荐100个unity插件之7】使用BehaviorDesigner插件制作BOSS的AI行为树
1723 0
|
人工智能 程序员 图形学
一文足矣:Unity&行为树(三)
一文足矣:Unity&行为树
430 1
一文足矣:Unity&行为树(三)
|
人工智能 搜索推荐 图形学
一文足矣:Unity&行为树(一)
一文足矣:Unity&行为树
1842 1
一文足矣:Unity&行为树(一)
|
图形学
Unity Metaverse(二)、Mixamo & Animator 混合树与动画融合
Blend Tree混合树的使用与动画融合的实现
710 1
Unity Metaverse(二)、Mixamo & Animator 混合树与动画融合
|
5月前
|
机器学习/深度学习 人工智能 图形学
卓伊凡的第一款独立游戏-详细介绍游戏开发引擎unity-以及详细介绍windows和mac的安装步骤【01】
卓伊凡的第一款独立游戏-详细介绍游戏开发引擎unity-以及详细介绍windows和mac的安装步骤【01】
525 9
|
5月前
|
小程序 PHP 图形学
热门小游戏源码(Python+PHP)下载-微信小程序游戏源码Unity发实战指南​
本文详解如何结合Python、PHP与Unity开发并部署小游戏至微信小程序。涵盖技术选型、Pygame实战、PHP后端对接、Unity转换适配及性能优化,提供从原型到发布的完整指南,助力开发者快速上手并发布游戏。
|
图形学 C#
超实用!深度解析Unity引擎,手把手教你从零开始构建精美的2D平面冒险游戏,涵盖资源导入、角色控制与动画、碰撞检测等核心技巧,打造沉浸式游戏体验完全指南
【8月更文挑战第31天】本文是 Unity 2D 游戏开发的全面指南,手把手教你从零开始构建精美的平面冒险游戏。首先,通过 Unity Hub 创建 2D 项目并导入游戏资源。接着,编写 `PlayerController` 脚本来实现角色移动,并添加动画以增强视觉效果。最后,通过 Collider 2D 组件实现碰撞检测等游戏机制。每一步均展示 Unity 在 2D 游戏开发中的强大功能。
1240 6

热门文章

最新文章