89 lines
3.1 KiB
C#
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;
|
|
}
|
|
}
|
|
} |