一文足矣: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

目录
相关文章
|
5月前
|
人工智能 定位技术 图形学
【unity实战】制作敌人的AI,使用有限状态机、继承和抽象类多态 定义不同状态的敌人行为
【unity实战】制作敌人的AI,使用有限状态机、继承和抽象类多态 定义不同状态的敌人行为
145 1
|
5月前
|
图形学
【unity小技巧】手戳代码程序化绘制地形Terrain树和预制体物品、动物
【unity小技巧】手戳代码程序化绘制地形Terrain树和预制体物品、动物
52 0
|
5月前
|
图形学
【推荐100个unity插件之17】具有可破坏/砍倒unity地形树木能力的破坏系统,实现unity砍树效果 —— DestroyIt - Destruction System
【推荐100个unity插件之17】具有可破坏/砍倒unity地形树木能力的破坏系统,实现unity砍树效果 —— DestroyIt - Destruction System
143 0
|
5月前
|
人工智能 数据可视化 程序员
【推荐100个unity插件之7】使用BehaviorDesigner插件制作BOSS的AI行为树
【推荐100个unity插件之7】使用BehaviorDesigner插件制作BOSS的AI行为树
212 0
|
人工智能 程序员 图形学
一文足矣:Unity&行为树(三)
一文足矣:Unity&行为树
253 1
一文足矣:Unity&行为树(三)
|
人工智能 搜索推荐 图形学
一文足矣:Unity&行为树(一)
一文足矣:Unity&行为树
900 1
一文足矣:Unity&行为树(一)
|
图形学
Unity Metaverse(二)、Mixamo & Animator 混合树与动画融合
Blend Tree混合树的使用与动画融合的实现
313 1
Unity Metaverse(二)、Mixamo & Animator 混合树与动画融合
|
3月前
|
图形学 C#
超实用!深度解析Unity引擎,手把手教你从零开始构建精美的2D平面冒险游戏,涵盖资源导入、角色控制与动画、碰撞检测等核心技巧,打造沉浸式游戏体验完全指南
【8月更文挑战第31天】本文是 Unity 2D 游戏开发的全面指南,手把手教你从零开始构建精美的平面冒险游戏。首先,通过 Unity Hub 创建 2D 项目并导入游戏资源。接着,编写 `PlayerController` 脚本来实现角色移动,并添加动画以增强视觉效果。最后,通过 Collider 2D 组件实现碰撞检测等游戏机制。每一步均展示 Unity 在 2D 游戏开发中的强大功能。
183 6
|
2月前
|
测试技术 C# 图形学
掌握Unity调试与测试的终极指南:从内置调试工具到自动化测试框架,全方位保障游戏品质不踩坑,打造流畅游戏体验的必备技能大揭秘!
【9月更文挑战第1天】在开发游戏时,Unity 引擎让创意变为现实。但软件开发中难免遇到 Bug,若不解决,将严重影响用户体验。调试与测试成为确保游戏质量的最后一道防线。本文介绍如何利用 Unity 的调试工具高效排查问题,并通过 Profiler 分析性能瓶颈。此外,Unity Test Framework 支持自动化测试,提高开发效率。结合单元测试与集成测试,确保游戏逻辑正确无误。对于在线游戏,还需进行压力测试以验证服务器稳定性。总之,调试与测试贯穿游戏开发全流程,确保最终作品既好玩又稳定。
112 4
|
3月前
|
图形学 缓存 算法
掌握这五大绝招,让您的Unity游戏瞬间加载完毕,从此告别漫长等待,大幅提升玩家首次体验的满意度与留存率!
【8月更文挑战第31天】游戏的加载时间是影响玩家初次体验的关键因素,特别是在移动设备上。本文介绍了几种常见的Unity游戏加载优化方法,包括资源的预加载与异步加载、使用AssetBundles管理动态资源、纹理和模型优化、合理利用缓存系统以及脚本优化。通过具体示例代码展示了如何实现异步加载场景,并提出了针对不同资源的优化策略。综合运用这些技术可以显著缩短加载时间,提升玩家满意度。
180 5
下一篇
无影云桌面