using System; using System.Collections; using System.Collections.Generic; using UnityEngine; namespace BITKit.Entities { public interface IEntityOverride { /// /// 是否正在被覆盖 /// bool IsOvering { get; } /// /// 当前对象,用于判断是否是自己的覆盖 /// object CurrentObject { get; } /// /// 当开始覆盖或者结束覆盖时触发 /// event Action OnOverride; /// /// 添加覆盖 /// void AddOverride(object key,int priority=0); /// /// 移除覆盖 /// void RemoveOverride(object key,int priority=0); } [CustomType(typeof(IEntityOverride))] public class EntityOverride : EntityBehavior,IEntityOverride { [SerializeField,ReadOnly] private bool isOvering; [SerializeField, ReadOnly(HideLabel = true)] private string overrideKeys; public bool IsOvering => _allowOverrideHandle; public object CurrentObject => _prioritySelector.Current; private readonly ValidHandle _allowOverrideHandle = new(); private readonly PrioritySelector _prioritySelector = new(); public void AddOverride(object key,int priority=0) { _prioritySelector.Set(priority,key); _allowOverrideHandle.AddElement(key); } public void RemoveOverride(object key,int priority=0) { _prioritySelector.Remove(priority); _allowOverrideHandle.RemoveElement(key); } public event Action OnOverride; public override void Initialize(IEntity entity) { base.Initialize(entity); UnityEntity.Set(this); } public override void OnAwake() { _allowOverrideHandle.AddListener(Override); _allowOverrideHandle.Invoke(); } private void Override(bool @override) { OnOverride?.Invoke(@override); isOvering=@override; overrideKeys = _allowOverrideHandle.ToString(); } } }