using UnityEngine; using Bolt; /// /// 蓝图管理器 /// 蓝图分为两种,不用保存中间状态的直接执行,执行后销毁入池;需要保存状态的返回对象,由创建者销毁入池 /// namespace Game { public enum EBpState { Enter, Update, Leave, } public class BlueprintBasicData { public int Entity; public int Target; public int Owner; } public class BlueprintPoolItem : ObjectPoolItemBase { public GameObject m_GameObject; public FlowMachine m_FlowMachine; public VariableDeclarations m_Variables; protected override void OnCreate() { base.OnCreate(); } protected override void OnDestroy() { base.OnDestroy(); } } public class BlueprintPoolManager : ObjectPoolBase { private readonly string m_BlueprintPath = "Blueprint/"; private BlueprintBasicData m_DefaultBlueprintBasicData = new BlueprintBasicData(); public void Run(string name, string trigger, BlueprintBasicData data) { var bp = CreateBlueprint(name); SetData(bp, data); bp.m_FlowMachine.TriggerUnityEvent(trigger); bp.Destroy(); } private void SetData(BlueprintPoolItem bpItem, BlueprintBasicData data) { if (data == null) { data = m_DefaultBlueprintBasicData; } var obj = bpItem.m_Variables; obj.Set("entity", data.Entity); obj.Set("target", data.Target); obj.Set("owner", data.Owner); obj.Set("data", data); } private BlueprintPoolItem CreateBlueprint(string name) { var bpNew = Create(name, (item) => { var go = new GameObject(name); var flowMacro = EnsureGetBulletFlowMacro(name); var flowMachine = go.AddComponent(); flowMachine.nest.SwitchToMacro(flowMacro); item.m_FlowMachine = flowMachine; item.m_Variables = Variables.Object(go); go.transform.SetParent(BlueprintPoolManager.Instance.Root.transform); item.m_GameObject = go; }); return bpNew; } private FlowMacro EnsureGetBulletFlowMacro(string path) { var pathReal = $"{m_BlueprintPath}{path}"; return Util.Load(pathReal); } } public abstract partial class Util { public static void RunBp(string name, string trigger) { BlueprintPoolManager.Instance.Run(name, trigger, null); } } }