一文足矣: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&行为树(三)
一文足矣:Unity&行为树
180 1
一文足矣:Unity&行为树(三)
|
人工智能 搜索推荐 图形学
一文足矣:Unity&行为树(一)
一文足矣:Unity&行为树
575 1
一文足矣:Unity&行为树(一)
|
人工智能 数据可视化 图形学
Unity火爆插件Behavior Designer行为树插件学习
如果要让游戏里的角色或者NPC能执行预设的AI逻辑,最简单的用IF..ELSE...神器既可以实现, 但是再复杂的一般用经典的状态机来切换状态,但是写起来比较麻烦。相对的,行为树(Behavior Tree)理解和编辑起来就非常简单了。
|
4月前
|
C# 图形学
【Unity 3D】元宇宙案例之虚拟地球信息射线实战(附源码、演示视频和步骤 超详细)
【Unity 3D】元宇宙案例之虚拟地球信息射线实战(附源码、演示视频和步骤 超详细)
48 0
|
4月前
|
人工智能 自然语言处理 区块链
【Unity 3D】元宇宙概念、应用前景、价值链等概述
【Unity 3D】元宇宙概念、应用前景、价值链等概述
45 0
|
4月前
|
vr&ar C# 图形学
【Unity 3D】VR飞机拆装后零件说明功能案例实战(附源码和演示视频 超详细)
【Unity 3D】VR飞机拆装后零件说明功能案例实战(附源码和演示视频 超详细)
33 0
|
4月前
|
vr&ar C# 图形学
【Unity 3D】VR飞机动态拆装及引擎开关控制案例(附源码和演示视频 超详细)
【Unity 3D】VR飞机动态拆装及引擎开关控制案例(附源码和演示视频 超详细)
36 0
|
4月前
|
vr&ar 图形学
【Unity 3D】VR飞机起飞喷火游戏案例实战(附源码和演示视频 超详细)
【Unity 3D】VR飞机起飞喷火游戏案例实战(附源码和演示视频 超详细)
42 0
|
4月前
|
vr&ar 开发工具 图形学
【Unity 3D】使用EasyAR实现单图识别的AR增强现实功能(附实现步骤)
【Unity 3D】使用EasyAR实现单图识别的AR增强现实功能(附实现步骤)
79 0
|
4月前
|
图形学
【Unity 3D】3D游戏跑酷小子实战教学(附源码和步骤 超详细)
【Unity 3D】3D游戏跑酷小子实战教学(附源码和步骤 超详细)
78 0