mirror of
https://gitee.com/jisol/jisol-game/
synced 2025-06-26 11:24:46 +00:00
97 lines
2.5 KiB
C#
97 lines
2.5 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using UnityEngine;
|
|
namespace BehaviorTreeSlayer
|
|
{
|
|
/// <summary>
|
|
/// Agent of behavior tree,
|
|
/// This class is not required.
|
|
/// You only need to call Entry.update in the right place to drive the behavior tree to run
|
|
/// use event drive method to communicate data with outside
|
|
/// </summary>
|
|
public class BehaviorTree : MonoBehaviour
|
|
{
|
|
System.Random rd = new System.Random();
|
|
public System.Random MyRandom => rd;//random inside behavior tree call
|
|
public bool AutoRun;
|
|
|
|
Dictionary<string, Action<object>> actions = new Dictionary<string, Action<object>>();
|
|
public void Regist(string key, Action<object> onEvent)
|
|
{
|
|
if (actions.ContainsKey(key))
|
|
{
|
|
actions[key] = onEvent;
|
|
}
|
|
else
|
|
{
|
|
actions.Add(key, onEvent);
|
|
}
|
|
}
|
|
public void UnRegist(string key)
|
|
{
|
|
actions.Remove(key);
|
|
}
|
|
public void Dispatch(string key, object obj)
|
|
{
|
|
if (actions.ContainsKey(key))
|
|
{
|
|
actions[key].Invoke(obj);
|
|
}
|
|
}
|
|
public TextAsset config;
|
|
Entry Entry;
|
|
public List<GameObject> Obj = new List<GameObject>();
|
|
Dictionary<string, object> blackBoard = new Dictionary<string, object>();
|
|
|
|
public object this[string key]
|
|
{
|
|
get
|
|
{
|
|
|
|
if (blackBoard.TryGetValue(key, out object v))
|
|
{
|
|
return v;
|
|
}
|
|
GameObject obj = Obj.Find(o => o.name.Equals(key));
|
|
return obj;
|
|
}
|
|
set
|
|
{
|
|
if (blackBoard.ContainsKey(key))
|
|
{
|
|
blackBoard[key] = value;
|
|
}
|
|
else
|
|
{
|
|
blackBoard.Add(key, value);
|
|
}
|
|
}
|
|
}
|
|
public void Remove(string key)
|
|
{
|
|
blackBoard.Remove(key);
|
|
}
|
|
|
|
|
|
|
|
private void Start()
|
|
{
|
|
Load();
|
|
if (AutoRun) Entry?.Enter(this);
|
|
}
|
|
|
|
public Entry Load()
|
|
{
|
|
if (Entry == null && config != null)
|
|
{
|
|
Entry = XmlUtils.DeSerialize<Entry>(config.text);
|
|
}
|
|
return Entry;
|
|
}
|
|
|
|
private void Update()
|
|
{
|
|
Entry?.Tick(Time.deltaTime, this);
|
|
}
|
|
}
|
|
} |