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

72 lines
2.2 KiB
C#
Raw Normal View History

2023-06-29 14:57:11 +08:00
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace BITKit.Entities
{
2024-03-31 23:31:00 +08:00
2023-06-29 14:57:11 +08:00
public interface IEntityOverride
{
2024-03-31 23:31:00 +08:00
/// <summary>
/// 是否正在被覆盖
/// </summary>
2023-06-29 14:57:11 +08:00
bool IsOvering { get; }
2024-03-31 23:31:00 +08:00
/// <summary>
/// 当前对象,用于判断是否是自己的覆盖
/// </summary>
object CurrentObject { get; }
/// <summary>
/// 当开始覆盖或者结束覆盖时触发
/// </summary>
2023-10-24 23:38:22 +08:00
event Action<bool> OnOverride;
2024-03-31 23:31:00 +08:00
/// <summary>
/// 添加覆盖
/// </summary>
void AddOverride(object key,int priority=0);
/// <summary>
/// 移除覆盖
/// </summary>
void RemoveOverride(object key,int priority=0);
2023-06-29 14:57:11 +08:00
}
2023-10-24 23:38:22 +08:00
[CustomType(typeof(IEntityOverride))]
2023-11-06 01:17:23 +08:00
public class EntityOverride : EntityBehavior,IEntityOverride
2023-06-29 14:57:11 +08:00
{
2023-10-24 23:38:22 +08:00
[SerializeField,ReadOnly] private bool isOvering;
2024-03-31 23:31:00 +08:00
[SerializeField, ReadOnly(HideLabel = true)] private string overrideKeys;
2023-06-29 14:57:11 +08:00
public bool IsOvering => _allowOverrideHandle;
2024-03-31 23:31:00 +08:00
public object CurrentObject => _prioritySelector.Current;
2023-06-29 14:57:11 +08:00
private readonly ValidHandle _allowOverrideHandle = new();
2024-03-31 23:31:00 +08:00
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);
}
2023-10-24 23:38:22 +08:00
public event Action<bool> OnOverride;
2023-11-06 01:17:23 +08:00
public override void Initialize(IEntity entity)
2023-06-29 14:57:11 +08:00
{
2023-11-06 01:17:23 +08:00
base.Initialize(entity);
UnityEntity.Set<IEntityOverride>(this);
2023-06-29 14:57:11 +08:00
}
public override void OnAwake()
{
_allowOverrideHandle.AddListener(Override);
_allowOverrideHandle.Invoke();
}
private void Override(bool @override)
{
2023-10-24 23:38:22 +08:00
OnOverride?.Invoke(@override);
isOvering=@override;
2024-03-31 23:31:00 +08:00
overrideKeys = _allowOverrideHandle.ToString();
2023-06-29 14:57:11 +08:00
}
}
}