namespace ChivaXR.Op { using System.Collections; using System.Collections.Generic; using UnityEngine; using Sirenix.OdinInspector; /// /// 操作点类型 /// public enum OperationDataType { Play, //播放 -激活后直接执行,结束后关闭激活 Trigger, //监听触发类型 -监听触发 Toggle, //选择状态类型 -开关(off/on)等状态 Value //完成量完成程度 -0-1 } /// /// 操作点状态 /// public enum OperationDataStatus { InActive, //未激活 Listening, //激活监听状态 Playing, //激活播放状态 } public enum OperationDisActiveMode { once, loop } public interface IDataState { //设置当前数据状态值 0=false;1=true void SetDataStateValue(float value); } public struct OperationEventArgs { public OperationDataBase opData; } public delegate void OperationDataEventHandle(object sender, OperationEventArgs e); /// /// 操作点数据基类 /// public abstract class OperationDataBase : MonoBehaviour { private float opValue; [ReadOnly] [PropertyOrder(-2)] public string guid; [PropertyOrder(-2)] [LabelText("操作名称")] public string operationName; [PropertyOrder(-2)] [LabelText("操作描述")] [TextArea] public string operationDescription; [LabelText("操作模式")] public OperationDisActiveMode operationDisActioveMode = OperationDisActiveMode.once; public float OpValue { get { return opValue; } set { if (opValue != value) { opValue = value; OnValueChanged(); CheckOperationDataDisActive(); } } } [SerializeField] [HideInInspector] private OperationDataStatus operationDataStatus; public virtual OperationDataType OperationType { get; } [LabelText("操作点状态")] [ShowInInspector] [PropertyOrder(0)] public OperationDataStatus OperationStatus { get { return operationDataStatus; } set { if (operationDataStatus != value) { operationDataStatus = value; OperationDataStatusChanged(operationDataStatus); } } } /// /// 操作点激活状态改变 /// public event OperationDataEventHandle OperationStatusChanged; public event OperationDataEventHandle OperationValueChanged; public void Update() { if (OperationStatus == OperationDataStatus.Listening) { PlayUpdata(); } } public virtual void OnValueChanged() { OperationValueChanged?.Invoke(this, new OperationEventArgs() { opData = this }); } public abstract void SetDataStateValue(float value); /// /// 当操作点状态改变时 /// protected void OperationDataStatusChanged(OperationDataStatus status) { OperationStatusChanged?.Invoke(this, new OperationEventArgs() { opData = this }); OnOperationDataStatusChanged(status); if (OperationStatus == OperationDataStatus.InActive) { if (OperationType == OperationDataType.Play || OperationType == OperationDataType.Trigger) { //关闭激活情况下不调用改变 opValue = 0; return; } } if (OperationStatus != OperationDataStatus.InActive) { PlayOneShot(); } } protected virtual void OnOperationDataStatusChanged(OperationDataStatus status) { } /// /// 激活时执行一次 /// protected virtual void PlayOneShot() { } /// /// 激活后每帧执行 /// protected virtual void PlayUpdata() { } protected virtual void CheckOperationDataDisActive() { switch (operationDisActioveMode) { case OperationDisActiveMode.once: OperationStatus = OperationDataStatus.InActive; break; case OperationDisActiveMode.loop: break; } } [PropertyOrder(1)] public bool isRegister = false; [HideIf("isRegister")] [Button("注册操作信息")] public void RegisterData() { if (string.IsNullOrEmpty(guid)) guid = System.Guid.NewGuid().ToString(); isRegister = OperationManager.Instance.RegisterOpData(this); } [ShowIf("isRegister")] [Button("移除操作信息")] public void RemoveRegisterData() { isRegister = !OperationManager.Instance.RemoveOpData(this); } /// /// 关闭提示 /// public virtual void CloseHint() { } /// /// 打开提示 /// public virtual void OpenHint() { } /// /// 自动填写对应的信息 /// [ContextMenu("自动填写名称及描述")] public void FillInInfo() { operationName = transform.name; operationDescription = transform.name.Split('_').Length <= 1 ? transform.name : transform.name.Split('_')[1]; } } }