You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
	
	
		
			94 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			C#
		
	
		
		
			
		
	
	
			94 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			C#
		
	
| 
											2 years ago
										 | using UnityEngine; | ||
|  | using Bolt; | ||
|  | 
 | ||
|  | /// <summary> | ||
|  | /// 蓝图管理器 | ||
|  | /// 蓝图分为两种,不用保存中间状态的直接执行,执行后销毁入池;需要保存状态的返回对象,由创建者销毁入池 | ||
|  | /// </summary> | ||
|  | 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<BlueprintPoolManager> | ||
|  |     { | ||
|  |         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<BlueprintPoolItem>(name, (item) => | ||
|  |             { | ||
|  |                 var go = new GameObject(name); | ||
|  |                 var flowMacro = EnsureGetBulletFlowMacro(name); | ||
|  |                 var flowMachine = go.AddComponent<FlowMachine>(); | ||
|  |                 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<FlowMacro>(pathReal); | ||
|  |         } | ||
|  | 
 | ||
|  |     } | ||
|  | 
 | ||
|  |     public abstract partial class Util | ||
|  |     { | ||
|  |         public static void RunBp(string name, string trigger, BlueprintBasicData data) | ||
|  |         { | ||
|  |             BlueprintPoolManager.Instance.Run(name, trigger, data); | ||
|  |         } | ||
|  |         public static void RunBp(string name, string trigger) | ||
|  |         { | ||
|  |             BlueprintPoolManager.Instance.Run(name, trigger, null); | ||
|  |         } | ||
|  |     } | ||
|  | } |