This commit is contained in:
daixiawu 2025-07-02 14:57:56 +08:00
commit 6b8eb03283
79 changed files with 3607 additions and 3292 deletions

File diff suppressed because it is too large Load Diff

View File

@ -24,7 +24,7 @@ namespace NodeCanvas.Tasks.Actions
{
get { return string.Format($"评分策略为 {CalculateTypes[0]}"); }
}
protected override void OnExecute()
{
// 直接从Blackboard获取AICalculatorData

View File

@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 46072d5970f6458b94306b0607d49a88
timeCreated: 1751359768

View File

@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 4e8d7d5a710d46259e05462669ed730b
timeCreated: 1751359826

View File

@ -0,0 +1,69 @@
/*
* @Author:
* @Description:
* @Date: 20250701 17:07:13
* @Modify:
*/
using Logic.Timeline;
using NodeCanvas.Framework;
using ParadoxNotion.Design;
using UnityEngine;
namespace FSMNodeCanvas.Action
{
[Category("FSMAction")]
public class FSMAttackAction : ActionTask
{
public float Duration;
private float _startTime;
protected override string info
{
get { return string.Format($"原地攻击"); }
}
protected override void OnUpdate()
{
if (Time.time > _startTime + Duration)
{
var data = blackboard.GetVariable<FSMData>("Data");
if (data?.value == null)
{
EndAction(true);
return;
}
EndAction(true);
}
}
protected override void OnExecute()
{
_startTime = Time.time;
var data = blackboard.GetVariable<FSMData>("Data");
if (data?.value == null) return;
data.value.OriginPlayer.TurnNoAttack = 0;
data.value.OriginPlayer.CurAttackPlayers.Add(data.value.TargetPlayer.Id);
data.value.TargetPlayer.CurAttackPlayers.Add(data.value.OriginPlayer.Id);
//设置unit1 attackendermark和相关参数
data.value.Origin.AttackRenderMark = true;
data.value.Origin.AttackRenderMarkAttackAnimType = data.value.Origin.GetAttackRange() switch
{
1 => AttackAnimType.Melee, 2 => AttackAnimType.Arrow, 3 => AttackAnimType.Bomb,
_ => AttackAnimType.None
};
data.value.Origin.AttackRenderMarkTargetPos = Table.Instance.GridToWorld(data.value.TargetGrid,"isUnit");
data.value.Origin.AttackRenderMarkNeedBack = true;
// 播动画
// 移动逻辑
}
}
}

View File

@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: b67f4cc92e5342f0930b5f6e3b6b584e
timeCreated: 1751367674

View File

@ -0,0 +1,40 @@
/*
* @Author:
* @Description:
* @Date: 20250701 17:07:13
* @Modify:
*/
using NodeCanvas.Framework;
using ParadoxNotion.Design;
using UnityEngine;
namespace FSMNodeCanvas.Action
{
[Category("FSMAction")]
public class FSMAttackBackAction : ActionTask
{
public float Duration;
private float _startTime;
protected override string info
{
get { return string.Format($"移动攻击"); }
}
protected override void OnUpdate()
{
if (Time.time > _startTime + Duration) EndAction(true);
}
protected override void OnExecute()
{
_startTime = Time.time;
// 播动画
// 移动逻辑
}
}
}

View File

@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: bfb8c3bd250c4e1fa0be358df1478fe0
timeCreated: 1751367745

View File

@ -0,0 +1,64 @@
/*
* @Author:
* @Description:
* @Date: 20250701 17:07:13
* @Modify:
*/
using Logic;
using Logic.Timeline;
using NodeCanvas.Framework;
using ParadoxNotion.Design;
using UnityEngine;
namespace FSMNodeCanvas.Action
{
[Category("FSMAction")]
public class FSMMoveAttackAction : ActionTask
{
public float Duration;
private float _startTime;
protected override string info
{
get { return string.Format($"移动攻击"); }
}
protected override void OnUpdate()
{
if (Time.time > _startTime + Duration)
{
var data = blackboard.GetVariable<FSMData>("Data");
if (data?.value == null) return;
data.value.OriginPlayer.TurnNoAttack = 0;
data.value.OriginPlayer.CurAttackPlayers.Add(data.value.TargetPlayer.Id);
data.value.TargetPlayer.CurAttackPlayers.Add(data.value.OriginPlayer.Id);
EndAction(true);
}
}
protected override void OnExecute()
{
_startTime = Time.time;
var data = blackboard.GetVariable<FSMData>("Data");
if (data?.value == null) return;
//设置unit1 attackendermark和相关参数
data.value.Origin.AttackRenderMark = true;
data.value.Origin.AttackRenderMarkAttackAnimType = data.value.Origin.GetAttackRange() switch
{
1 => AttackAnimType.Melee, 2 => AttackAnimType.Arrow, 3 => AttackAnimType.Bomb,
_ => AttackAnimType.None
};
data.value.Origin.AttackRenderMarkTargetPos = Table.Instance.GridToWorld(data.value.TargetGrid,"isUnit");
data.value.Origin.AttackRenderMarkNeedBack = true;
// 播动画
// 移动逻辑
}
}
}

View File

@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 655c5e08e0b74257a8bbe8c1667e9b3d
timeCreated: 1751362805

View File

@ -0,0 +1,39 @@
/*
* @Author:
* @Description:
* @Date: 20250701 17:07:13
* @Modify:
*/
using NodeCanvas.Framework;
using ParadoxNotion.Design;
using UnityEngine;
namespace FSMNodeCanvas.Action
{
[Category("FSMAction")]
public class FSMMoveAction : ActionTask
{
public float Duration;
private float _startTime;
protected override string info
{
get { return string.Format($"移动击杀"); }
}
protected override void OnUpdate()
{
if (Time.time > _startTime + Duration) EndAction(true);
}
protected override void OnExecute()
{
_startTime = Time.time;
// 播动画
// 移动逻辑
}
}
}

View File

@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 9aec0b4eb4d24d63a8253fdd5a0613ea
timeCreated: 1751361309

View File

@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 84a571f336c74537bccba9bad6f2ea5b
timeCreated: 1751359812

View File

@ -0,0 +1,34 @@
/*
* @Author:
* @Description:
* @Date: 20250701 17:07:13
* @Modify:
*/
using Logic.Timeline;
using NodeCanvas.Framework;
using ParadoxNotion.Design;
namespace FSMNodeCanvas.Action
{
[Category("FSMCondition")]
public class FSMCanKillCondition : ConditionTask
{
protected override string info {
get { return "能否杀死"; }
}
protected override bool OnCheck()
{
var data = blackboard.GetVariable<FSMData>("Data");
if (data?.value == null) return false;
int dmg = Table.Instance.CalcDamage(data.value.Map, data.value.Origin, data.value.Target);
if (dmg < data.value.Target.Health) return false;
if (!data.value.Target.CanBeKilled(data.value.Map)) return false;
return true;
}
}
}

View File

@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 00906759e0744bcab9330d63a5da7517
timeCreated: 1751362857

View File

@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: dd2d84be244e4bd0bd57eaf408fd62cc
timeCreated: 1751359789

View File

@ -0,0 +1,27 @@
/*
* @Author:
* @Description:
* @Date: 20250701 16:07:30
* @Modify:
*/
using RuntimeData;
namespace Logic.Timeline
{
public class FSMData
{
// 核心数据
public MapData Map;
public PlayerData OriginPlayer;
public PlayerData TargetPlayer;
public UnitData Origin;
public UnitData Target;
public GridData OriginGrid;
public GridData TargetGrid;
public bool IsFinished;
}
}

View File

@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 14eaba056ed143f78052869973509186
timeCreated: 1751360306

View File

@ -0,0 +1,50 @@
/*
* @Author:
* @Description:
* @Date: 20250701 11:07:48
* @Modify:
*/
using System.Collections.Generic;
using NodeCanvas.Framework;
using NodeCanvas.StateMachines;
namespace Logic.Timeline
{
public enum FSMActionType
{
Attack,
}
public class FSMManager
{
public static FSMManager Instance = new FSMManager();
private FSMManager() { }
private Dictionary<FSMActionType, FSMOwner> _ownerDict;
public void ExcuteFSMAction(FSMActionType actionType, FSMData fsmData)
{
if (!_ownerDict.TryGetValue(actionType, out var owner)) return;
if (owner.isRunning) return;
var data = owner.blackboard.GetVariable<FSMData>("Data");
data.value = fsmData;
owner.StartBehaviour();
}
public void Update()
{
foreach (var kv in _ownerDict)
{
if (!kv.Value.isRunning) continue;
var data = kv.Value.blackboard.GetVariable<FSMData>("Data");
if (data == null) continue;
if (!data.value.IsFinished) continue;
kv.Value.StopBehaviour();
}
}
}
}

View File

@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 6fbbbb8536eb4ff6a7fc80581b8c4f18
timeCreated: 1751359837

View File

@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: fb6e090259f44668ad2bcdd1e69106f9
timeCreated: 1751370115

View File

@ -0,0 +1,40 @@
/*
* @Author:
* @Description:
* @Date: 20250701 19:07:32
* @Modify:
*/
using RuntimeData;
using TH1Renderer;
namespace Logic.Event
{
public interface IEventEnter
{
public void PlayEffectEvent(GridVFXParams para, GridData grid);
}
public class ServerEventClient : IEventEnter
{
public void PlayEffectEvent(GridVFXParams para, GridData grid)
{
}
}
public class EventManager
{
public static EventManager Instance = new EventManager();
public IEventEnter EventEnter;
public EventManager()
{
EventEnter = new ServerEventClient();
}
}
}

View File

@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: ccbcadf6f91a42409c44e897dcdad600
timeCreated: 1751370135

View File

@ -158,6 +158,7 @@ namespace Logic
Timer.Instance.Update();
AudioManager.Instance.Update();
TimelineManager.Instance.Update();
FSMManager.Instance.Update();
}
public bool HasArchive()

View File

@ -0,0 +1,207 @@
/*
* @Author:
* @Description:
* @Date: 20250701 14:07:05
* @Modify:
*/
using RuntimeData;
using TH1Renderer;
using UnityEngine;
namespace Logic.Timeline
{
public class MoveKill : FragmentBase
{
public MapData Map;
public UnitData Origin;
public UnitData Target;
public GridData OriginGrid;
public GridData TargetGrid;
public PlayerData OriginPlayer;
public PlayerData TargetPlayer;
public int Dmg;
public override void OnStart()
{
//立刻死亡并播放受伤动画,必须先处理死亡再处理移动不然gridToUnit的dict会出错
// 这里改成直接结算,包含了死亡,包含了经验增长和权利奇观记录
Main.UnitLogic.DamageSettlement(Map, Origin, Target, Dmg, DamageType.ActiveAttack);
Origin.AttackRenderMark = false;
//移动过去并更新视野
Main.UnitLogic.MoveTo(Map, Origin, TargetGrid, MoveType.AttackMove);
}
public override void OnFinished()
{
var main = GameObject.Find("Main").GetComponent<Main>();
main.MapRenderer.ROGridMap[TargetGrid.Id].SetBounceAnim();
TargetGrid.VFXRenderMarkHurt = true;
var t = new GridVFXRenderMark(GridVFXType.Damage);
t.Damage = Dmg;
TargetGrid.SetGridVFXRenderMark(t);
TargetGrid.VFXRenderMarkDie = true;
//处理玩家攻击后自动再次点击unit从而连续处理移动或者攻击的情况for MapInteraction
main.MapInteractionLogic.CheckContinuousAction(Map, OriginPlayer, Origin, TargetGrid);
}
public override void OnUpdate(float progressTime)
{
}
}
public class NotMoveKill : FragmentBase
{
public MapData Map;
public UnitData Origin;
public UnitData Target;
public GridData OriginGrid;
public GridData TargetGrid;
public PlayerData OriginPlayer;
public PlayerData TargetPlayer;
public int Dmg;
public float AttackTime;
public float AttackBackTime;
public override void OnStart()
{
}
public override void OnFinished()
{
}
public override void OnUpdate(float progressTime)
{
if (progressTime >= AttackTime)
{
AttackTime = float.MaxValue;
Main.UnitLogic.DamageSettlement(Map, Origin, Target, Dmg, DamageType.ActiveAttack);
Target.RenderMark = true;
TargetGrid.VFXRenderMarkHurt = true;
var t = new GridVFXRenderMark(GridVFXType.Damage);
t.Damage = Dmg;
TargetGrid.SetGridVFXRenderMark(t);
TargetGrid.VFXRenderMarkDie = true;
var main = GameObject.Find("Main").GetComponent<Main>();
main.MapRenderer.ROGridMap[TargetGrid.Id].SetBounceAnim();
}
if (progressTime >= AttackBackTime)
{
AttackBackTime = float.MaxValue;
var main = GameObject.Find("Main").GetComponent<Main>();
//处理玩家攻击后自动再次点击unit从而连续处理移动或者攻击的情况for MapInteraction
if (OriginPlayer.Id != Map.PlayerMap.SelfPlayerId) return;
if (!main.MapRenderer.CheckUnitHasMoveAttackTarget(Origin.Id)) return;
Debug.Log("!!!!!");
main.MapInteractionLogic.OnTileClicked(Map, TargetGrid);
}
}
}
public class AttackAndCounter : FragmentBase
{
public MapData Map;
public UnitData Origin;
public UnitData Target;
public GridData OriginGrid;
public GridData TargetGrid;
public PlayerData OriginPlayer;
public PlayerData TargetPlayer;
public int Dmg1;
public int Dmg2;
public bool CanCounter;
public float AttackAnimTime;
public float CounterAttackStart;
public float CounterAttackWait;
public float CounterAttackBack;
public override void OnStart()
{
}
public override void OnFinished()
{
}
public override void OnUpdate(float progressTime)
{
if (progressTime >= AttackAnimTime)
{
AttackAnimTime = float.MaxValue;
Main.UnitLogic.DamageSettlement(Map, Origin, Target, Dmg1, DamageType.ActiveAttack);
Target.RenderMark = true;
Target.BounceRenderMark = true;
Target.BounceRenderMakrWaitTime = Table.Instance.AnimDataAssets.AttackBounceWaitAnimTime;
TargetGrid.VFXRenderMarkHurt = true;
var t = new GridVFXRenderMark(GridVFXType.Damage);
t.Damage = Dmg1;
TargetGrid.SetGridVFXRenderMark(t);
}
if (CanCounter && progressTime >= CounterAttackStart)
{
CounterAttackStart = float.MaxValue;
Target.AttackRenderMark = CanCounter;
Target.AttackRenderMarkAttackAnimType = Target.GetAttackRange() switch
{
1 => AttackAnimType.Melee, 2 => AttackAnimType.Arrow, 3 => AttackAnimType.Bomb,
_ => AttackAnimType.None
};
Target.AttackRenderMarkTargetPos = Table.Instance.GridToWorld(OriginGrid,"isUnit");
Target.AttackRenderMarkNeedBack = true;
}
if (CanCounter && progressTime >= CounterAttackWait)
{
var settlement = Main.UnitLogic.DamageSettlement(Map, Target, Origin, Dmg2, DamageType.CounterAttack);
if (settlement.IsKill)
{
OriginGrid.VFXRenderMarkHurt = true;
var t = new GridVFXRenderMark(GridVFXType.Damage);
t.Damage = Dmg2;
OriginGrid.SetGridVFXRenderMark(t);
OriginGrid.VFXRenderMarkFog = true;
OriginGrid.VFXRenderMarkDie = true;
}
else
{
Origin.RenderMark = true;
Origin.BounceRenderMark = true;
Origin.BounceRenderMakrWaitTime = Table.Instance.AnimDataAssets.AttackBounceWaitAnimTime;
OriginGrid.VFXRenderMarkHurt = true;
var t = new GridVFXRenderMark(GridVFXType.Damage);
t.Damage = Dmg2;
OriginGrid.SetGridVFXRenderMark(t);
OriginGrid.VFXRenderMarkFog = true;
}
}
if (progressTime >= CounterAttackBack)
{
var main = GameObject.Find("Main").GetComponent<Main>();
//处理玩家攻击后自动再次点击unit从而连续处理移动或者攻击的情况for MapInteraction
if (OriginPlayer.Id == Map.PlayerMap.SelfPlayerId && Origin.Alive &&
main.MapRenderer.CheckUnitHasMoveAttackTarget(Origin.Id))
{
main.MapInteractionLogic.OnTileClicked(Map, OriginGrid);
}
}
}
}
}

View File

@ -6,18 +6,10 @@
*/
using UnityEngine;
namespace Logic.Timeline
{
public enum FragmentType
{
Move,
ActiveAttack,
CounterAttack,
AttackBack,
Kill,
ActionEvent,
}
public enum FragmentState
{
Prepare,
@ -26,10 +18,16 @@ namespace Logic.Timeline
}
public interface IFragment
public abstract class FragmentBase
{
public void OnStart();
public void OnFinished();
public void OnUpdate(float time);
public FragmentState State;
public float StartTime;
public float Duration;
public abstract void OnStart();
public abstract void OnFinished();
public abstract void OnUpdate(float progressTime);
}
}

View File

@ -1,3 +0,0 @@
fileFormatVersion: 2
guid: c35df220d5c2428b9e46c33733f2945f
timeCreated: 1751340751

View File

@ -1,83 +0,0 @@
/*
* @Author:
* @Description:
* @Date: 20250701 11:07:18
* @Modify:
*/
using RuntimeData;
namespace Logic.Timeline
{
public abstract class LogicFragmentBase : IFragment
{
public TimeParam Param;
public FragmentType Type;
public FragmentState State;
public float StartTime;
public float Duration;
public abstract bool Check();
public abstract void OnStart();
public abstract void OnFinished();
public abstract void OnUpdate(float time);
}
public class ActiveAttackFragment : LogicFragmentBase
{
public override bool Check()
{
if (Param?.Map == null) return false;
if (Param.Origin == null || Param.Target == null) return false;
return true;
}
public override void OnStart()
{
}
public override void OnFinished()
{
var dmg = Table.Instance.CalcDamage(Param.Map, Param.Origin, Param.Target);
Main.UnitLogic.DamageSettlement(Param.Map, Param.Origin, Param.Target, 0, DamageType.ActiveAttack);
}
public override void OnUpdate(float time)
{
}
}
public class MoveFragment : LogicFragmentBase
{
public override bool Check()
{
if (Param?.Map == null) return false;
if (Param.Origin == null) return false;
if (Param.Grid == null) return false;
return true;
}
public override void OnStart()
{
}
public override void OnFinished()
{
}
public override void OnUpdate(float time)
{
}
}
}

View File

@ -1,55 +0,0 @@
/*
* @Author:
* @Description:
* @Date: 20250701 11:07:44
* @Modify:
*/
using System.Collections.Generic;
using RuntimeData;
namespace Logic.Timeline
{
public enum TimeGroupState
{
Prepare,
Playing,
Finished,
}
public class TimeParam
{
public MapData Map;
public UnitData Origin;
public UnitData Target;
public GridData Grid;
public DamageType DamageType;
public SettlementInfo Info;
}
public class TimeGroup
{
public TimeGroupState State;
public List<IFragment> Fragments;
public TimeGroup()
{
State = TimeGroupState.Prepare;
Fragments = new List<IFragment>();
}
public void Update()
{
if (Fragments.Count == 0)
{
State = TimeGroupState.Finished;
return;
}
}
}
}

View File

@ -1,3 +0,0 @@
fileFormatVersion: 2
guid: 8b96044a07cb457f8a0b397218b46d89
timeCreated: 1751340341

View File

@ -7,6 +7,7 @@
using System.Collections.Generic;
using UnityEngine;
namespace Logic.Timeline
@ -16,26 +17,40 @@ namespace Logic.Timeline
public static TimelineManager Instance = new TimelineManager();
private TimelineManager() { }
private List<TimeGroup> _groups;
private List<FragmentBase> _fragments;
public TimeGroup CreateTimeGroup()
public void AddFragment(FragmentBase fragment)
{
var group = new TimeGroup();
_groups.Add(group);
return group;
_fragments.Add(fragment);
}
public void Update()
{
foreach (var group in _groups)
foreach (var fragment in _fragments)
{
group.Update();
if (fragment.State == FragmentState.Prepare)
{
fragment.OnStart();
fragment.StartTime = Time.time;
fragment.State = FragmentState.Playing;
}
if (fragment.State == FragmentState.Playing)
{
fragment.OnUpdate(Time.time - fragment.StartTime);
if (Time.time > fragment.StartTime + fragment.Duration)
{
fragment.OnFinished();
fragment.State = FragmentState.Finished;
}
}
}
for (int i = _groups.Count - 1; i >= 0; i--)
for (int i = _fragments.Count - 1; i >= 0; i--)
{
if (_groups[i].State != TimeGroupState.Finished) continue;
_groups.RemoveAt(i);
if (_fragments[i].State != FragmentState.Finished) continue;
_fragments.RemoveAt(i);
}
}
}

View File

@ -1,3 +0,0 @@
fileFormatVersion: 2
guid: 990036c664354e82aec2526199dc3839
timeCreated: 1751340798

View File

@ -1,40 +0,0 @@
/*
* @Author:
* @Description:
* @Date: 20250701 11:07:18
* @Modify:
*/
namespace Logic.Timeline
{
public abstract class ViewFragmentBase : IFragment
{
public LogicFragmentBase LogicFragment;
public FragmentType Type;
public FragmentState State;
public abstract void OnStart();
public abstract void OnFinished();
public abstract void OnUpdate(float time);
}
public class ActiveAttackFragmentView : ViewFragmentBase
{
public override void OnStart()
{
}
public override void OnFinished()
{
}
public override void OnUpdate(float time)
{
}
}
}

View File

@ -1,3 +0,0 @@
fileFormatVersion: 2
guid: 08ed9b107bb543289e1b28f2f8a2cc76
timeCreated: 1751341003

View File

@ -10,7 +10,9 @@ using System;
using System.Collections.Generic;
using System.Linq;
using Animancer;
using Logic.Event;
using Logic.Skill;
using Logic.Timeline;
using UnityEngine;
using RuntimeData;
using TH1Renderer;
@ -20,7 +22,7 @@ namespace Logic
public enum DamageType
{
ActiveAttack,
PassiveAttack,
CounterAttack,
FollowAttack,
Splash,
True,
@ -244,196 +246,57 @@ namespace Logic
if (TestKillUnit(mapData,unit1,unit2,dmg1)) //如果伤害直接够杀死对方
{
//攻击+移动:如果是近战且目标位置不是山或者有山的科技,且目标不在水里
if (unit1.GetAttackRange() == 1 && grid2.Terrain == TerrainType.Land
&& (grid2.Feature != TerrainFeature.Mountain || player1.TechTree.CheckIfHasTech(TechType.Climbing)))
{
//立刻死亡并播放受伤动画,必须先处理死亡再处理移动不然gridToUnit的dict会出错
unit2.Health = 0;
Main.UnitLogic.Die(mapData, unit2);
//unit2.Health -= dmg1;
//RunDamageSkillGroup(mapData,unit1,unit2,dmg1);
//Main.UnitLogic.Die(mapData, unit2);
unit1.AttackRenderMark = false;
//移动过去并更新视野
MoveTo(mapData, unit1, grid2,MoveType.AttackMove);
//杀死对方并移动过去的时刻触发的事件
Timer.Instance.TimerRegister(unit2, () =>
{
var main = GameObject.Find("Main").GetComponent<Main>();
main.MapRenderer.ROGridMap[grid2.Id].SetBounceAnim();
grid2.VFXRenderMarkHurt = true;
var t = new GridVFXRenderMark(GridVFXType.Damage);
t.Damage = dmg1;
grid2.SetGridVFXRenderMark(t);
grid2.VFXRenderMarkDie = true;
//处理玩家攻击后自动再次点击unit从而连续处理移动或者攻击的情况for MapInteraction
main.MapInteractionLogic.CheckContinuousAction(mapData,player1,unit1,grid2);
//权力奇观记录
player1.TotalKill++;
//如果没有STATIC技能那么就可以增加小兵经验
if (!Table.Instance.QueryUnitHasSkill(unit1.UnitType, SkillType.STATIC)) unit1.Exp++;
},Table.Instance.AnimDataAssets.MoveAnimTime);
var fragment = new MoveKill();
fragment.Duration = Table.Instance.AnimDataAssets.MoveAnimTime;
fragment.Origin = unit1;
fragment.Target = unit2;
fragment.Dmg = dmg1;
fragment.OriginGrid = grid1;
fragment.TargetGrid = grid2;
fragment.OriginPlayer = player1;
fragment.TargetPlayer = player2;
TimelineManager.Instance.AddFragment(fragment);
}
else
{
//对方延迟死亡
Timer.Instance.TimerRegister(unit2, () =>
{
Main.UnitLogic.Die(mapData, unit2);
unit2.RenderMark = true;
grid2.VFXRenderMarkHurt = true;
var t = new GridVFXRenderMark(GridVFXType.Damage);
t.Damage = dmg1;
grid2.SetGridVFXRenderMark(t);
grid2.VFXRenderMarkDie = true;
var main = GameObject.Find("Main").GetComponent<Main>();
main.MapRenderer.ROGridMap[grid2.Id].SetBounceAnim();
},attackWait);
//处理攻击到对方的时刻
Timer.Instance.TimerRegister(unit2, () =>
{
Main.UnitLogic.Die(mapData, unit2);
unit2.RenderMark = true;
grid2.VFXRenderMarkHurt = true;
var t = new GridVFXRenderMark(GridVFXType.Damage);
t.Damage = dmg1;
grid2.SetGridVFXRenderMark(t);
grid2.VFXRenderMarkDie = true;
var main = GameObject.Find("Main").GetComponent<Main>();
main.MapRenderer.ROGridMap[grid2.Id].SetBounceAnim();
},attackWait);
//处理已经攻击返回的时刻
Timer.Instance.TimerRegister(this, () =>
{
var main = GameObject.Find("Main").GetComponent<Main>();
//处理玩家攻击后自动再次点击unit从而连续处理移动或者攻击的情况for MapInteraction
if (player1.Id == mapData.PlayerMap.SelfPlayerId &&
main.MapRenderer.CheckUnitHasMoveAttackTarget(unit1.Id))
{
Debug.Log("!!!!!");
main.MapInteractionLogic.OnTileClicked(mapData,grid2);
}
//权力奇观记录
player1.TotalKill++;
//如果没有STATIC技能那么就可以增加小兵经验
if (!Table.Instance.QueryUnitHasSkill(unit1.UnitType, SkillType.STATIC)) unit1.Exp++;
},attackBack);
var fragment = new NotMoveKill();
fragment.Duration = attackBack;
fragment.Origin = unit1;
fragment.Target = unit2;
fragment.Dmg = dmg1;
fragment.OriginGrid = grid1;
fragment.TargetGrid = grid2;
fragment.OriginPlayer = player1;
fragment.TargetPlayer = player2;
fragment.AttackTime = attackWait;
fragment.AttackBackTime = attackBack;
TimelineManager.Instance.AddFragment(fragment);
}
}
//如果杀不死对方
else
{
//在attackAnimTime之后刷新unit2的血量配合动画演出
Timer.Instance.TimerRegister(unit2, () =>
{
unit2.Health -= dmg1;
unit2.RenderMark = true;
unit2.BounceRenderMark = true;
unit2.BounceRenderMakrWaitTime = Table.Instance.AnimDataAssets.AttackBounceWaitAnimTime;
grid2.VFXRenderMarkHurt = true;
var t = new GridVFXRenderMark(GridVFXType.Damage);
t.Damage = dmg1;
grid2.SetGridVFXRenderMark(t);
},
Table.Instance.AnimDataAssets.AttackAnimTime);
//处理反击情况设置unit2的rendermark
if (canCounter)
{
//unit2.AttackRenderMarkWaitTime = counterAttackStart;
Timer.Instance.TimerRegister(unit2, () =>
{
unit2.AttackRenderMark = canCounter;
unit2.AttackRenderMarkAttackAnimType = unit2.GetAttackRange() switch
{
1 => AttackAnimType.Melee, 2 => AttackAnimType.Arrow, 3 => AttackAnimType.Bomb,
_ => AttackAnimType.None
};
unit2.AttackRenderMarkTargetPos = Table.Instance.GridToWorld(grid1,"isUnit");
unit2.AttackRenderMarkNeedBack = true;
},
counterAttackStart);
//如果会被反击至死
if (dmg2 >= unit1.Health)
{
//我方死亡播放对应VFX
Timer.Instance.TimerRegister(unit1, () =>
{
unit1.Health = 0;
Main.UnitLogic.Die(mapData, unit1);
grid1.VFXRenderMarkHurt = true;
var t = new GridVFXRenderMark(GridVFXType.Damage);
t.Damage = dmg2;
grid1.SetGridVFXRenderMark(t);
grid1.VFXRenderMarkFog = true;
grid1.VFXRenderMarkDie = true;
},
counterAttackWait);
if (!Table.Instance.QueryUnitHasSkill(unit2.UnitType, SkillType.STATIC)) unit2.Exp++;
}
//否则,就是双方正常互相消耗血量
else
{
//播放对应VFX
Timer.Instance.TimerRegister(unit1, () =>
{
unit1.Health -= dmg2;
unit1.RenderMark = true;
unit1.BounceRenderMark = true;
unit1.BounceRenderMakrWaitTime = Table.Instance.AnimDataAssets.AttackBounceWaitAnimTime;
grid1.VFXRenderMarkHurt = true;
var t = new GridVFXRenderMark(GridVFXType.Damage);
t.Damage = dmg2;
grid1.SetGridVFXRenderMark(t);
grid1.VFXRenderMarkFog = true;
},
counterAttackWait);
}
}
//在全部攻击结束的时刻触发的事件
Timer.Instance.TimerRegister(this, () =>
{
var main = GameObject.Find("Main").GetComponent<Main>();
//处理玩家攻击后自动再次点击unit从而连续处理移动或者攻击的情况for MapInteraction
if (player1.Id == mapData.PlayerMap.SelfPlayerId && unit1.Alive &&
main.MapRenderer.CheckUnitHasMoveAttackTarget(unit1.Id))
{
main.MapInteractionLogic.OnTileClicked(mapData,grid1);
}
},
counterAttackBack);
var fragment = new AttackAndCounter();
fragment.Duration = counterAttackBack;
fragment.Origin = unit1;
fragment.Target = unit2;
fragment.Dmg1 = dmg1;
fragment.Dmg2 = dmg2;
fragment.OriginGrid = grid1;
fragment.TargetGrid = grid2;
fragment.OriginPlayer = player1;
fragment.TargetPlayer = player2;
fragment.CanCounter = canCounter;
fragment.AttackAnimTime = Table.Instance.AnimDataAssets.AttackAnimTime;
fragment.CounterAttackStart = counterAttackStart;
fragment.CounterAttackWait = counterAttackWait;
fragment.CounterAttackBack = counterAttackBack;
TimelineManager.Instance.AddFragment(fragment);
}
var settlement = new SettlementInfo();
settlement.DamageType = DamageType.ActiveAttack;
settlement.DamageOrigin = unit1;
settlement.DamageTarget = unit2;
settlement.DamageValue = dmg1;
foreach (var skill in unit1.Skills) skill.OnDamageOther(mapData, settlement);
return true;
}
@ -452,15 +315,13 @@ namespace Logic
target.Health -= dmg;
if (type == DamageType.KillSelf)
{
target.Health = 0;
UnitDie(mapData, target, dmg);
settlement.IsKill = true;
Main.UnitLogic.Die(mapData, target);
}
else if (target.CanBeKilled(mapData) && target.Health <= 0)
{
target.Health = 0;
UnitDie(mapData, target, dmg);
settlement.IsKill = true;
Main.UnitLogic.Die(mapData, target);
if (!origin.IsExpLock(mapData)) origin.Exp++;
mapData.GetPlayerDataByUnitId(origin.Id, out var player);
@ -477,6 +338,14 @@ namespace Logic
return settlement;
}
public void UnitDie(MapData map, UnitData unit, int dmg)
{
unit.Health = 0;
Main.UnitLogic.Die(map, unit);
if (!map.GetGridDataByUnitId(unit.Id, out var targetGrid)) return;
DieAnimRenderMarkUpadate(targetGrid, unit, dmg,true);
}
public void DieAnimRenderMarkUpadate(GridData grid2,UnitData unit2,int dmg,bool needRandomWait = false)
{
//TODO 不该这么做,临时凑合一下

View File

@ -5,6 +5,7 @@ using UnityEngine.SceneManagement;
using RuntimeData;
using Logic;
using Logic.Event;
namespace TH1Renderer
{
@ -69,6 +70,7 @@ namespace TH1Renderer
public MapRenderer(Main main, MapData mapData)
{
EventManager.Instance.EventEnter = new ViewEventEnter();
_main = main;
_mapData = mapData;
Scene currentScene = SceneManager.GetActiveScene();
@ -1037,4 +1039,13 @@ namespace TH1Renderer
return false;
}
}
public class ViewEventEnter : IEventEnter
{
public void PlayEffectEvent(GridVFXParams para, GridData grid)
{
//!!!!!!!!!!!!!!!!
}
}
}