using cfg; using DG.Tweening; using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.Events; namespace game { public class OperatingToolsBase : MonoBehaviour { [Tooltip("工具ID")] public int m_ID = 0; [Tooltip("工具操作前的准备时间,常用于移到指定位置等。")] public float m_PreparationTime = 0.1f; //[Tooltip("初始Transform")] [HideInInspector] public Transform InitTransfom; #region Transform变换相关 /// /// 跳转到展示区(即:初始Transform : m_InitTransfom) /// public void JumpToExhibition() { if (InitTransfom is null) return; this.transform.parent = InitTransfom.parent; this.transform.SetParent(InitTransfom.parent, false); this.transform.localScale = InitTransfom.localScale; this.transform.rotation = InitTransfom.rotation; this.transform.position = InitTransfom.position; } /// /// 移动到指定 Transform /// /// public void MoveToTransform(Transform transform) { if (transform is null) return; this.transform.DOKill(); this.transform.DOMove(transform.position, m_PreparationTime).SetEase(Ease.OutQuad); this.transform.DOScale(transform.localScale, m_PreparationTime).SetEase(Ease.Linear); this.transform.DORotateQuaternion(transform.rotation, m_PreparationTime).SetEase(Ease.Linear); } /// /// 返回到展示区(即:初始Transform : m_InitTransfom) /// public virtual void MoveToExhibition() { // 停止播放操作动画 StopPlayOperationAnimation(); // 停止播放准备动画 StopPlayPrepareAnimation(); if (InitTransfom == null) return; MoveToTransform(InitTransfom); m_Status = EventWashingActionStatus.Invalid; } #endregion #region 动画相关 protected bool m_IsAuthorizedAnimation = true; public bool IsAuthorizedAnimation { get => m_IsAuthorizedAnimation; } public void AuthorizedAnimation() { m_IsAuthorizedAnimation = true; } public void NotAuthorizedAnimation() { m_IsAuthorizedAnimation = false; } /// /// 播放工具操作动画 /// protected virtual void PlayOperationAnimation() { } /// /// 停止播放工具操作动画 /// protected virtual void StopPlayOperationAnimation() { } /// /// 播放准备动画 /// protected virtual void PlayPrepareAnimation() { } /// /// 停止播放准备动画 /// protected virtual void StopPlayPrepareAnimation() { } #endregion #region 行为相关 /// /// 开始工具操作行为 /// /// public virtual void StartExecuting() { m_Status = EventWashingActionStatus.Executing; m_PrepareCumulativeTime = 0f; // 播放操作动画 if (m_IsAuthorizedAnimation) PlayOperationAnimation(); } /// /// 操作前的准备行为,如:移动等 /// /// public void PrepareAction(Transform transform, UnityAction readyAction, params object[] args) { m_Status = EventWashingActionStatus.Preparing; m_PrepareCumulativeTime = 0f; m_ReadyAction = readyAction; MoveToTransform(transform); if (m_IsAuthorizedAnimation) PlayPrepareAnimation(); } /// /// 停止操作行为 /// public virtual void StopExecuting() { if (m_Status == EventWashingActionStatus.Executing) { MoveToExhibition(); StopPlayOperationAnimation(); } m_Status = EventWashingActionStatus.Stopping; } public virtual void Enter1stStage() { } public virtual void Exit1stStage() { } public virtual void Enter2ndStage() { } public virtual void Exit2ndStage() { } #endregion #region 事件 /// /// 准备结束事件 /// UnityAction m_ReadyAction = null; #endregion #region 状态&数据等 /// /// 状态 /// protected EventWashingActionStatus m_Status = EventWashingActionStatus.Invalid; public EventWashingActionStatus Status { get { return m_Status; } } /// /// 准备操作累计时间,用以本地计时 /// protected float m_PrepareCumulativeTime = 0f; protected EventWashingTool m_Type = EventWashingTool.None; // 工具类型 public EventWashingTool ToolType { get { return m_Type; } } public int ToolID { get { return m_ID; } } #endregion #region 生命周期 /// /// 初始化工具 /// public virtual void InitTool() { m_Type = EventWashingTool.None; m_PrepareCumulativeTime = 0f; m_Status = EventWashingActionStatus.Invalid; JumpToExhibition(); this.gameObject.SetActive(false); } // Start is called before the first frame update protected virtual void Start() { m_PrepareCumulativeTime = 0f; m_Status = EventWashingActionStatus.Invalid; } // Update is called once per frame protected virtual void Update() { if (m_Status == EventWashingActionStatus.Preparing) { m_PrepareCumulativeTime += Time.deltaTime; if (m_PrepareCumulativeTime >= m_PreparationTime) { if (m_ReadyAction != null) { m_ReadyAction.Invoke(this); } m_PrepareCumulativeTime = 0f; m_Status = EventWashingActionStatus.Executing; StopPlayPrepareAnimation(); } } } #endregion } }