BITKit/Src/Unity/Scripts/Entity/Core/EntityOverride.cs

72 lines
2.2 KiB
C#

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace BITKit.Entities
{
public interface IEntityOverride
{
/// <summary>
/// 是否正在被覆盖
/// </summary>
bool IsOvering { get; }
/// <summary>
/// 当前对象,用于判断是否是自己的覆盖
/// </summary>
object CurrentObject { get; }
/// <summary>
/// 当开始覆盖或者结束覆盖时触发
/// </summary>
event Action<bool> OnOverride;
/// <summary>
/// 添加覆盖
/// </summary>
void AddOverride(object key,int priority=0);
/// <summary>
/// 移除覆盖
/// </summary>
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<object> _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<bool> OnOverride;
public override void Initialize(IEntity entity)
{
base.Initialize(entity);
UnityEntity.Set<IEntityOverride>(this);
}
public override void OnAwake()
{
_allowOverrideHandle.AddListener(Override);
_allowOverrideHandle.Invoke();
}
private void Override(bool @override)
{
OnOverride?.Invoke(@override);
isOvering=@override;
overrideKeys = _allowOverrideHandle.ToString();
}
}
}