Files
ft/Client/Assets/Scripts/EventMowForTreasure/Act/EventMowForTreasureToolCell.cs
2026-06-29 21:18:33 +08:00

89 lines
3.1 KiB
C#

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<PlayableDirector>();
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<PlayableDirector> _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;
}
}
}