2026-05-15 19:36:39 +08:00

187 lines
6.4 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
* @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);
}
}
}
}