187 lines
6.4 KiB
C#
187 lines
6.4 KiB
C#
/*
|
||
* @Author: 白哉
|
||
* @Description:
|
||
* @Date: 2025年07月01日 星期二 14:07:05
|
||
* @Modify:
|
||
*/
|
||
|
||
|
||
using Logic.Audio;
|
||
using RuntimeData;
|
||
using TH1_Anim.UnitAtomAnim;
|
||
using TH1_DataAssetsScript;
|
||
using TH1_Logic.Core;
|
||
using TH1_Renderer.UnitAtomAnim;
|
||
using TH1Renderer;
|
||
|
||
namespace TH1_Anim.Fragments
|
||
{
|
||
|
||
public class FragmentMove : FragmentBase
|
||
{
|
||
public FragmentMoveData Data;
|
||
private bool _step1_move;
|
||
private bool _step2_update;
|
||
|
||
private float _step1_time;
|
||
private float _step2_time;
|
||
|
||
public FragmentMove(FragmentMoveData data) : base()
|
||
{
|
||
Data = data;
|
||
if (Data.UnitRenderer == null || Data.OriginGrid == null || Data.TargetGrid == null)
|
||
{
|
||
State = FragmentState.Wrong;
|
||
return;
|
||
};
|
||
_step1_move = false;
|
||
_step1_time = 0f;
|
||
_step2_time = Table.Instance.AnimDataAssets.MoveAnimTime;
|
||
Duration = _step2_time;
|
||
State = FragmentState.Prepare;
|
||
}
|
||
|
||
|
||
public override bool CheckDone(float progressTime)
|
||
{
|
||
if (!_step1_move || !_step2_update)
|
||
return false;
|
||
if (progressTime <= Duration)
|
||
return false;
|
||
return true;
|
||
}
|
||
|
||
public override void OnFinished()
|
||
{
|
||
|
||
}
|
||
|
||
public override void OnUpdate(float progressTime)
|
||
{
|
||
//Step #0 处理超时情况,2倍时长
|
||
if (progressTime > Duration + 10f)
|
||
{
|
||
_step1_move = true;
|
||
_step2_update = true;
|
||
return;
|
||
}
|
||
|
||
//Step #1 第一个动画,播放move
|
||
if (progressTime >= 0 && !_step1_move)
|
||
{
|
||
_step1_move = true;
|
||
if (Data.OriginGrid == null || Data.TargetGrid == null) return;
|
||
var animData = UnitAtomAnimDataFactory.Create(UnitAtomAnimType.Move,Data.OriginGrid.Pos.V2(), Data.TargetGrid.Pos.V2(),Data.Path);
|
||
Data.UnitRenderer.AnimManager.EnqueueAnim(UnitAtomAnimType.Move,animData);
|
||
//刷新目标城市的状态(比如离开了着火的占领城市)
|
||
Data.OriginGrid.Renderer(Main.MapData).InstantUpdateGrid();
|
||
|
||
//AUDIO 播放移动音效
|
||
AudioManager.Instance.PlayAudio("SFX/UNIT_move");
|
||
|
||
return;
|
||
}
|
||
|
||
//Step #2 第二个动画(瞬时) update表现
|
||
if (progressTime >= _step2_time && !_step2_update)
|
||
{
|
||
_step2_update = true;
|
||
Data.UnitRenderer?.InstantUpdateUnit(true);
|
||
//刷新目标城市的状态(比如占领城市)
|
||
Data.TargetGrid.Renderer(Main.MapData)?.InstantUpdateGrid();
|
||
//重置周围单位的高亮状态
|
||
MapRenderer.Instance.UpdateAroundHighlight(Main.MapData,Data.TargetGrid);
|
||
}
|
||
}
|
||
}
|
||
|
||
|
||
|
||
public class FragmentMoveTeleport : FragmentBase
|
||
{
|
||
public FragmentMoveData Data;
|
||
private bool _step1_disappear;
|
||
private bool _step2_show;
|
||
|
||
private float _step1_time;
|
||
private float _step2_time;
|
||
|
||
public FragmentMoveTeleport(FragmentMoveData data) : base()
|
||
{
|
||
Data = data;
|
||
if (Data.UnitRenderer == null || Data.OriginGrid == null || Data.TargetGrid == null)
|
||
{
|
||
State = FragmentState.Wrong;
|
||
return;
|
||
};
|
||
_step1_disappear = false;
|
||
_step1_time = 0f;
|
||
_step2_time = Table.Instance.AnimDataAssets.MoveAnimTime * 3;
|
||
Duration = _step2_time;
|
||
State = FragmentState.Prepare;
|
||
}
|
||
|
||
|
||
public override bool CheckDone(float progressTime)
|
||
{
|
||
if (!_step1_disappear || !_step2_show)
|
||
return false;
|
||
if (progressTime <= Duration)
|
||
return false;
|
||
return true;
|
||
}
|
||
|
||
public override void OnFinished()
|
||
{
|
||
|
||
}
|
||
|
||
public override void OnUpdate(float progressTime)
|
||
{
|
||
//Step #0 处理超时情况,2倍时长
|
||
if (progressTime > Duration + 10f)
|
||
{
|
||
_step1_disappear = true;
|
||
_step2_show = true;
|
||
return;
|
||
}
|
||
|
||
//Step #1 第一个动画,播放move
|
||
if (progressTime >= 0 && !_step1_disappear)
|
||
{
|
||
_step1_disappear = true;
|
||
if (Data.OriginGrid == null || Data.TargetGrid == null) return;
|
||
//起始格子播放fog
|
||
Data.OriginGrid.Renderer(Main.MapData)?.PlayVFXInSight(new GridVFXParams(GridVFXType.Fog));
|
||
//消失不见
|
||
Data.UnitRenderer.InstantDisappear();
|
||
//刷新目标城市的状态(比如离开了着火的占领城市)
|
||
Data.OriginGrid.Renderer(Main.MapData).InstantUpdateGrid();
|
||
|
||
//AUDIO 播放移动音效
|
||
AudioManager.Instance.PlayAudio("SFX/UNIT_move");
|
||
|
||
return;
|
||
}
|
||
|
||
//Step #2 第二个动画(瞬时) update表现
|
||
if (progressTime >= _step2_time && !_step2_show)
|
||
{
|
||
_step2_show = true;
|
||
//先同步位置,避免在过期格子上闪现
|
||
Data.UnitRenderer?.InstantUpdateUnitPos();
|
||
//再按视野判定显隐+刷新外观;视野内时会自行SetActive(true),视野外保持隐藏
|
||
//不能再调用InstantShow()无条件SetActive(true),否则联机时敌方在迷雾中也会看到瞬移目标
|
||
Data.UnitRenderer?.InstantUpdateUnit(true);
|
||
//刷新目标城市的状态(比如占领城市)
|
||
//终点格子播放fog和treasure
|
||
Data.TargetGrid.Renderer(Main.MapData)?.PlayVFXInSight(new GridVFXParams(GridVFXType.Fog));
|
||
Data.TargetGrid.Renderer(Main.MapData)?.PlayVFXInSight(new GridVFXParams(GridVFXType.Treasure));
|
||
Data.TargetGrid.Renderer(Main.MapData)?.InstantUpdateGrid();
|
||
//重置周围单位的高亮状态
|
||
MapRenderer.Instance.UpdateAroundHighlight(Main.MapData,Data.TargetGrid);
|
||
}
|
||
}
|
||
}
|
||
|
||
} |