using System; using cfg; using UnityEngine; using UnityEngine.Playables; namespace EventMowForTreasure { public class EventMowForTreasureToolCell:MonoBehaviour { [SerializeField] private float offsetPositionY = 2f; [SerializeField][Min(0)] private float maxRotationY = 30f; [SerializeField] [Min(0)]private float delayDropTime = 0.3f; [SerializeField] [Min(0)][Tooltip("道具2或3走一个格子的速度")] private float toolMoveTimeOneGrid = 0.35f; [SerializeField] private PlayableAsset ongoingTimeLine; [SerializeField] private PlayableAsset showTimeLine; [SerializeField] private PlayableAsset toolDamageTimeLine; private PlayableDirector _director; private void Start() { _director = this.GetComponentInChildren(); if(_director) _director.playOnAwake = false; } public float GetMoveTime() { return toolMoveTimeOneGrid; } public void PlayShowTimeLine() { this.transform.position = new Vector3(transform.position.x, transform.position.y - offsetPositionY, transform.position.z); if(showTimeLine==null) return; if(!_director) return; if(_director.state==PlayState.Playing&&_director.playableAsset==showTimeLine) return; _director.extrapolationMode = DirectorWrapMode.Loop; _director.Play(showTimeLine); } public void StopTimeLine() { _director?.Stop(); } public void SetRotation(float offset) { transform.rotation = Quaternion.Euler(transform.eulerAngles.x,maxRotationY*offset,transform.eulerAngles.z); } public void PlayOngoingEffect(bool isDefaultTool,Transform obstacleCell,out float time) { time =this.delayDropTime; if(isDefaultTool)return; if(!obstacleCell) return; gameObject.SetActive(true); var position = obstacleCell.position; transform.rotation = Quaternion.Euler(0, 0, 0); transform.position = new Vector3(position.x, position.y, position.z - 2f); PlayOngoingTimeLine(); } private void PlayOngoingTimeLine() { if(ongoingTimeLine==null) return; if(!_director) return; if(_director.state==PlayState.Playing&&_director.playableAsset==showTimeLine) return; _director.extrapolationMode = DirectorWrapMode.None; _director.Play(ongoingTimeLine); } private Action _stopped; public void PlayToolDamageTimeLine(Action action) { if(toolDamageTimeLine==null) return; if(!_director) return; _director.extrapolationMode = DirectorWrapMode.None; _director.Play(toolDamageTimeLine); if (action == null) return; _director.stopped -= _stopped; _stopped = delegate { action?.Invoke(); }; _director.stopped += _stopped; } } }