//- 路上的点
//
using System;
using System.Threading.Tasks;
using UnityEngine;
using UnityEngine.Playables;
namespace GampPlay.ChallengeMatch.Road
{
//-
public class ChallengeRegionRoad : MonoBehaviour
{
[Header("Timeline配置")]
public PlayableDirector AppearTimeline;//出现表现timeline
public PlayableDirector BreakTimeline;//销毁表现timeline
[Header("下一段路")]
public ChallengeRegionRoad NextRegionRoad;
[Header("破坏障碍物的时间")]
public float AppearJumpDelay = 2f;//播放出现表现timeline同时,延迟多久播放头像动画
//-
private float _speed = 1.0f;
#region Game Logic
private async Task OnUnLocking()
{
ELog("OnUnlocking");
AppearTimeline.initialTime = 0;
AppearTimeline.Play();
await Awaiters.Seconds(SpeedUpSeconds(AppearJumpDelay));
}
public float SpeedUpSeconds(float seconds)
{
return _speed * seconds;
}
private async Task OnBreaking()
{
ELog("OnBreaking");
BreakTimeline.initialTime = 0;
BreakTimeline?.Play();
NextRegionRoad?.Prepare();
// await Awaiters.Seconds(SpeedUpSeconds(AppearJumpDelay));
}
private void OnLocked()
{
ELog("OnLocked-> ");
gameObject.SetActive(true);
//-
AppearTimeline.initialTime = 0;
AppearTimeline.Evaluate();
// AppearTimeline.Stop();
// /
BreakTimeline.time = BreakTimeline.duration;
BreakTimeline.Evaluate();
// BreakTimeline.Stop();
}
private void OnUnlocked()
{
ELog($"OnUnlocked-> {BreakTimeline.duration}");
gameObject.SetActive(true);
AppearTimeline.time = AppearTimeline.duration;
AppearTimeline.Evaluate();
// AppearTimeline.Stop();
AppearTimeline.Pause(); // 暂停,保持不动
BreakTimeline.time = BreakTimeline.duration;
// BreakTimeline.time = BreakTimeline.duration;
BreakTimeline.Evaluate();
// BreakTimeline.Stop();
BreakTimeline.Pause();
NextRegionRoad?.Prepare();
}
public void Prepare()
{
gameObject.SetActive(true);
// BreakTimeline.initialTime = 0;
BreakTimeline.time = 0;
BreakTimeline.Evaluate();
// BreakTimeline.Stop();
BreakTimeline.Pause();
}
private void OnBroken()
{
ELog("OnBroken");
gameObject.SetActive(false);
}
public async Task UpdateState(CBoxState state)
{
ELog($"UpdateState -> {state}");
switch (state)
{
case CBoxState.UnLocked:
OnUnlocked();
break;
case CBoxState.Broken:
OnBroken();
break;
case CBoxState.Locked:
OnLocked();
break;
case CBoxState.UnLocking:
await OnUnLocking();
break;
case CBoxState.Attacking:
await OnBreaking();
break;
default:
throw new ArgumentOutOfRangeException(nameof(state), state, null);
}
}
public void UpdateTimeController(ChallengeSetAnimationEvent e)
{
_speed = e.speed;
}
#endregion
#region Log
public void ELog(string message)
{
#if UNITY_EDITOR
Debug.Log($" {nameof(ChallengeRegionRoad)}: {gameObject.name} => {message} ");
#endif
}
public void Log(string message)
{
Debug.Log($" {nameof(ChallengeRegionRoad)} : {gameObject.name} => {message} ");
}
#endregion
}
}