From 587beca60dfe3130d1f3e30c592d2951866115c3 Mon Sep 17 00:00:00 2001 From: wuwenbo Date: Mon, 28 Jul 2025 15:03:45 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8Dbug=EF=BC=8C=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E7=9E=AC=E6=97=B6=E6=94=BB=E5=87=BB=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../BTNodeCanvas/AIActionRecoveryAndNoMove.cs | 2 +- .../Scripts/BTNodeCanvas/AIExcuteAction.cs | 1 + Unity/Assets/Scripts/Data/UnitData.cs | 13 ++------ Unity/Assets/Scripts/Logic/AI/AIActionBase.cs | 21 ++++++++++--- .../Logic/AI/AIActionScoreCalculator.cs | 4 +-- Unity/Assets/Scripts/Logic/AI/AILogic.cs | 31 +++---------------- .../Scripts/Logic/Action/ActionLogic.cs | 28 ++++++++--------- Unity/Assets/Scripts/Logic/Main/GameLogic.cs | 2 ++ Unity/Assets/Scripts/Logic/Unit/IUnitLogic.cs | 2 +- Unity/Assets/Scripts/Logic/Unit/UnitLogic.cs | 16 +++++----- Unity/Assets/Scripts/UI/BottomInfoUI.cs | 2 +- .../Assets/Scripts/UI/CityUpgradeActionUI.cs | 2 +- 12 files changed, 54 insertions(+), 70 deletions(-) diff --git a/Unity/Assets/Scripts/BTNodeCanvas/AIActionRecoveryAndNoMove.cs b/Unity/Assets/Scripts/BTNodeCanvas/AIActionRecoveryAndNoMove.cs index c3ec713b5..5d18bccda 100644 --- a/Unity/Assets/Scripts/BTNodeCanvas/AIActionRecoveryAndNoMove.cs +++ b/Unity/Assets/Scripts/BTNodeCanvas/AIActionRecoveryAndNoMove.cs @@ -40,7 +40,7 @@ namespace NodeCanvas.Tasks.Actions var action = ActionLogicFactory.GetActionLogic(actionId); if (action.CheckCan(data.value.TargetParam)) { - action.Execute(data.value.TargetParam); + action.Execute(data.value.TargetParam, false); EndAction(true); return; } diff --git a/Unity/Assets/Scripts/BTNodeCanvas/AIExcuteAction.cs b/Unity/Assets/Scripts/BTNodeCanvas/AIExcuteAction.cs index 1c1c7522b..6a2dc5665 100644 --- a/Unity/Assets/Scripts/BTNodeCanvas/AIExcuteAction.cs +++ b/Unity/Assets/Scripts/BTNodeCanvas/AIExcuteAction.cs @@ -35,6 +35,7 @@ namespace NodeCanvas.Tasks.Actions data.value.MaxAiAction.Param.MapData = data.value.Map; data.value.MaxAiAction.Param.RefreshParams(); data.value.MaxAiAction.CheckIsActionInPlayerSight(); + data.value.MaxAiAction.CheckIsActionDuration(); if (data.value.MaxAiAction.IsInSight) data.value.MaxAiAction.ActionLogic.CameraControl(data.value.MaxAiAction.Param); EndAction(true); diff --git a/Unity/Assets/Scripts/Data/UnitData.cs b/Unity/Assets/Scripts/Data/UnitData.cs index e48bd3d4e..72e73f30e 100644 --- a/Unity/Assets/Scripts/Data/UnitData.cs +++ b/Unity/Assets/Scripts/Data/UnitData.cs @@ -84,12 +84,7 @@ namespace RuntimeData { var units = new HashSet(); map.GetUnitDataListByPlayerId(player.Id, units); - - foreach (var unit in UnitList) - { - if (!units.Contains(unit)) continue; - unit.OnTurnStart(map); - } + foreach (var unit in units) unit.OnTurnStart(map); } public void OnTurnEnd(MapData map, PlayerData player) @@ -97,11 +92,7 @@ namespace RuntimeData var units = new HashSet(); map.GetUnitDataListByPlayerId(player.Id, units); - foreach (var unit in UnitList) - { - if (!units.Contains(unit)) continue; - unit.OnTurnEnd(map); - } + foreach (var unit in units) unit.OnTurnEnd(map); } // 新建小兵 diff --git a/Unity/Assets/Scripts/Logic/AI/AIActionBase.cs b/Unity/Assets/Scripts/Logic/AI/AIActionBase.cs index bda549b91..fadd76a5c 100644 --- a/Unity/Assets/Scripts/Logic/AI/AIActionBase.cs +++ b/Unity/Assets/Scripts/Logic/AI/AIActionBase.cs @@ -1776,11 +1776,6 @@ namespace Logic.AI public void CheckIsActionInPlayerSight() { IsInSight = true; - if (ActionLogic.ActionId.ActionType == CommonActionType.UnitAttack) - { - Duration = ActionLogic.Duration; - return; - } var player = Param.MapData.PlayerMap.SelfPlayerData; if (Param.MapData.GridMap.GetGridDataByGid(Param.GridId, out var grid) && player.Sight.CheckIsInSight(grid.Id)) return; @@ -1793,6 +1788,22 @@ namespace Logic.AI IsInSight = false; } + public void CheckIsActionDuration() + { + if (!IsInSight) + { + Duration = 0.04f; + return; + } + + if (ActionLogic.ActionId.ActionType == CommonActionType.UnitAttack) + { + Duration = ActionLogic.Duration; + return; + } + Duration = Table.Instance.AnimDataAssets.AIBeforeAnimWaitTime; + } + public string DebugInfo() { if (ActionLogic.ActionId.ActionType == CommonActionType.Gain || ActionLogic.ActionId.ActionType == CommonActionType.Build || ActionLogic.ActionId.ActionType == CommonActionType.BuildWonder) diff --git a/Unity/Assets/Scripts/Logic/AI/AIActionScoreCalculator.cs b/Unity/Assets/Scripts/Logic/AI/AIActionScoreCalculator.cs index d6a848cc3..b1b5ede15 100644 --- a/Unity/Assets/Scripts/Logic/AI/AIActionScoreCalculator.cs +++ b/Unity/Assets/Scripts/Logic/AI/AIActionScoreCalculator.cs @@ -117,7 +117,7 @@ namespace Logic.AI calMap.DeepCopy(mapData); aiAction.Param.MapData = calMap; aiAction.Param.RefreshParams(); - aiAction.ActionLogic.Execute(aiAction.Param); + aiAction.ActionLogic.Execute(aiAction.Param, true); aiAction.Result = CalculateScore(aiAction.Param.MapData, player, cfg); // 科技类行为要计算下科技额外收益 @@ -573,7 +573,7 @@ namespace Logic.AI calMap.DeepCopy(data.Map); aiAction.Param.MapData = calMap; aiAction.Param.RefreshParams(); - aiAction.ActionLogic.Execute(aiAction.Param); + aiAction.ActionLogic.Execute(aiAction.Param, true); aiAction.Result = CalculateAIActionScore(data, aiAction.Param, types); var scoreOffset = aiAction.Result.GetAllScore() - startResult.GetAllScore(); diff --git a/Unity/Assets/Scripts/Logic/AI/AILogic.cs b/Unity/Assets/Scripts/Logic/AI/AILogic.cs index ed8a23087..8b285224f 100644 --- a/Unity/Assets/Scripts/Logic/AI/AILogic.cs +++ b/Unity/Assets/Scripts/Logic/AI/AILogic.cs @@ -43,7 +43,6 @@ namespace Logic.AI public AILogicState AILogicState; private float _targetTime; - private float _excuteTime; private AIActionScoreCalculator _scoreCalculator; private AIActionGenerator _generator; @@ -104,23 +103,6 @@ namespace Logic.AI { if (AILogicState == AILogicState.Finished || AILogicState == AILogicState.Prepare) return; - if (AILogicState == AILogicState.PrePlay) - { - if (Time.time < _excuteTime) return; - if (_data.MaxAiAction == null) - { - AILogicState = AILogicState.Playing; - return; - } - _data.MaxAiAction.ActionLogic.Execute(_data.MaxAiAction.Param); - var animTime = _data.MaxAiAction.ActionLogic.GetAnimTime(_data.MaxAiAction.Param); - if (!_data.MaxAiAction.IsInSight) _targetTime = Time.time + 0.04f; - else _targetTime = Time.time + animTime; - MainEditor.Instance.OnActionExcuted(); - _data.MaxAiAction = null; - AILogicState = AILogicState.Pausing; - } - if (AILogicState == AILogicState.Pausing) { if (Time.time > _targetTime) AILogicState = AILogicState.Playing; @@ -152,14 +134,11 @@ namespace Logic.AI if (_data.MaxAiAction == null || index > 100) AILogicState = AILogicState.Finished; else { - if (_data.MaxAiAction.IsInSight) - { - if (_data.MaxAiAction.Duration == 0) - _excuteTime = Time.time + Table.Instance.AnimDataAssets.AIBeforeAnimWaitTime; - else _excuteTime = Time.time + _data.MaxAiAction.Duration; - } - else _excuteTime = Time.time; - AILogicState = AILogicState.PrePlay; + _data.MaxAiAction.ActionLogic.Execute(_data.MaxAiAction.Param, !_data.MaxAiAction.IsInSight); + _targetTime = Time.time + _data.MaxAiAction.Duration; + MainEditor.Instance.OnActionExcuted(); + _data.MaxAiAction = null; + AILogicState = AILogicState.Pausing; } } diff --git a/Unity/Assets/Scripts/Logic/Action/ActionLogic.cs b/Unity/Assets/Scripts/Logic/Action/ActionLogic.cs index f3bb2b513..5d741e084 100644 --- a/Unity/Assets/Scripts/Logic/Action/ActionLogic.cs +++ b/Unity/Assets/Scripts/Logic/Action/ActionLogic.cs @@ -674,7 +674,7 @@ namespace Logic.Action return 1f; } - public abstract bool Execute(CommonActionParams actionParams); + public abstract bool Execute(CommonActionParams actionParams, bool isMoment); public abstract bool CheckCan(CommonActionParams actionParams); @@ -694,7 +694,7 @@ namespace Logic.Action } - public override bool Execute(CommonActionParams actionParams) + public override bool Execute(CommonActionParams actionParams, bool isMoment) { if(!actionParams.MapData.GetCityDataByTerritoryGid(actionParams.GridData.Id,out var city)) return false; @@ -804,7 +804,7 @@ namespace Logic.Action } - public override bool Execute(CommonActionParams actionParams) + public override bool Execute(CommonActionParams actionParams, bool isMoment) { CityData cityData = actionParams.CityData; if (cityData == null) @@ -912,7 +912,7 @@ namespace Logic.Action } - public override bool Execute(CommonActionParams actionParams) + public override bool Execute(CommonActionParams actionParams, bool isMoment) { CityData cityData = actionParams.CityData; //鲁棒性用 @@ -1413,7 +1413,7 @@ namespace Logic.Action } - public override bool Execute(CommonActionParams actionParams) + public override bool Execute(CommonActionParams actionParams, bool isMoment) { if (_actionId.UnitType == UnitType.None) return false; @@ -1788,7 +1788,7 @@ namespace Logic.Action } - public override bool Execute(CommonActionParams actionParams) + public override bool Execute(CommonActionParams actionParams, bool isMoment) { //鲁棒性判断 if (actionParams.UnitData == null) return false; @@ -2370,7 +2370,7 @@ namespace Logic.Action } - public override bool Execute(CommonActionParams actionParams) + public override bool Execute(CommonActionParams actionParams, bool isMoment) { //鲁棒性判断 if (actionParams.CityData == null) return false; @@ -2507,7 +2507,7 @@ namespace Logic.Action { } - public override bool Execute(CommonActionParams actionParams) + public override bool Execute(CommonActionParams actionParams, bool isMoment) { if (actionParams.MapData.GetGridDataByUnitId(actionParams.UnitData.Id, out var unitGrid)) { @@ -2551,9 +2551,9 @@ namespace Logic.Action { } - public override bool Execute(CommonActionParams actionParams) + public override bool Execute(CommonActionParams actionParams, bool isMoment) { - Main.UnitLogic.Attack(actionParams.MapData, actionParams.UnitData, actionParams.TargetUnitData, out _duration); + Main.UnitLogic.Attack(actionParams.MapData, actionParams.UnitData, actionParams.TargetUnitData, out _duration, isMoment); return true; } @@ -2598,7 +2598,7 @@ namespace Logic.Action { } - public override bool Execute(CommonActionParams actionParams) + public override bool Execute(CommonActionParams actionParams, bool isMoment) { return false; } @@ -2620,7 +2620,7 @@ namespace Logic.Action { } - public override bool Execute(CommonActionParams actionParams) + public override bool Execute(CommonActionParams actionParams, bool isMoment) { return false; } @@ -2643,7 +2643,7 @@ namespace Logic.Action } - public override bool Execute(CommonActionParams actionParams) + public override bool Execute(CommonActionParams actionParams, bool isMoment) { if (actionParams.PlayerData == null || actionParams.GridData == null) return false; @@ -2870,7 +2870,7 @@ namespace Logic.Action { } - public override bool Execute(CommonActionParams actionParams) + public override bool Execute(CommonActionParams actionParams, bool isMoment) { if (actionParams.MainObjectType != MainObjectType.Player) return false; diff --git a/Unity/Assets/Scripts/Logic/Main/GameLogic.cs b/Unity/Assets/Scripts/Logic/Main/GameLogic.cs index 639ac394e..9e5b10484 100644 --- a/Unity/Assets/Scripts/Logic/Main/GameLogic.cs +++ b/Unity/Assets/Scripts/Logic/Main/GameLogic.cs @@ -124,6 +124,7 @@ namespace Logic //gameLogic.EndTurn(); //uiManager.EndTurn(); PlayerPrefs.SetInt("Archive", 1); + PlayerPrefs.Save(); MapData.SaveMapData(Main.MapData); AchievementDataManager.Instance.OnTurnStart(Main.MapData, _curPlayer); @@ -209,6 +210,7 @@ namespace Logic public override void End() { + _curPlayer = null; _aiLogic.FinishAILogic(); TryTurnEndCurPlayerTurn(); } diff --git a/Unity/Assets/Scripts/Logic/Unit/IUnitLogic.cs b/Unity/Assets/Scripts/Logic/Unit/IUnitLogic.cs index 6b9cff498..7925005c1 100644 --- a/Unity/Assets/Scripts/Logic/Unit/IUnitLogic.cs +++ b/Unity/Assets/Scripts/Logic/Unit/IUnitLogic.cs @@ -14,7 +14,7 @@ namespace Logic { bool MoveTo(MapData mapData, UnitData unitData, GridData gridData, MoveType moveType); //unit[uid]移动到grid[pos] - bool Attack(MapData mapData, UnitData unitDataA, UnitData unitDataB, out float duration); + bool Attack(MapData mapData, UnitData unitDataA, UnitData unitDataB, out float duration, bool isMoment=false); //unit[A]攻击unit[B] void Upgrade(MapData mapData, UnitData unitData); //unit[uid]升级 diff --git a/Unity/Assets/Scripts/Logic/Unit/UnitLogic.cs b/Unity/Assets/Scripts/Logic/Unit/UnitLogic.cs index c6c329092..bf62ccf03 100644 --- a/Unity/Assets/Scripts/Logic/Unit/UnitLogic.cs +++ b/Unity/Assets/Scripts/Logic/Unit/UnitLogic.cs @@ -53,7 +53,7 @@ namespace Logic { float[,] MoveInfoCostMap; float[,] MoveInfoMap; - + public UnitLogic() { @@ -204,7 +204,7 @@ namespace Logic return counterAttackBack; } - public bool Attack(MapData mapData, UnitData unit1, UnitData unit2, out float duration) + public bool Attack(MapData mapData, UnitData unit1, UnitData unit2, out float duration, bool isMoment=false) { duration = 0; if (!mapData.GetPlayerDataByUnitId(unit1.Id, out var player1)) return false; @@ -273,8 +273,8 @@ namespace Logic fragment.OriginPlayer = player1; fragment.TargetPlayer = player2; duration = fragment.Duration; - if (mapData == Main.MapData) TimelineManager.Instance.AddFragment(fragment); - else fragment.Excute(); + if (isMoment) fragment.Excute(); + else TimelineManager.Instance.AddFragment(fragment); } else { @@ -291,8 +291,8 @@ namespace Logic fragment.AttackTime = attackWait; fragment.AttackBackTime = attackBack; duration = fragment.Duration; - if (mapData == Main.MapData) TimelineManager.Instance.AddFragment(fragment); - else fragment.Excute(); + if (isMoment) fragment.Excute(); + else TimelineManager.Instance.AddFragment(fragment); } } //如果杀不死对方 @@ -315,8 +315,8 @@ namespace Logic fragment.CounterAttackWait = counterAttackWait; fragment.CounterAttackBack = counterAttackBack; duration = fragment.Duration; - if (mapData == Main.MapData) TimelineManager.Instance.AddFragment(fragment); - else fragment.Excute(); + if (isMoment) fragment.Excute(); + else TimelineManager.Instance.AddFragment(fragment); } return true; } diff --git a/Unity/Assets/Scripts/UI/BottomInfoUI.cs b/Unity/Assets/Scripts/UI/BottomInfoUI.cs index e0a4541dc..7fdfa3d1e 100644 --- a/Unity/Assets/Scripts/UI/BottomInfoUI.cs +++ b/Unity/Assets/Scripts/UI/BottomInfoUI.cs @@ -565,7 +565,7 @@ public class BottomInfoUI// : MonoBehaviour //Debug.Log($"{actionId.ActionType},{actionId.WonderType},{actionId.ResourceType},{actionId.FeatureType},{actionId.UnitType},{actionId.Vegetation}"); //如果成功执行,隐藏当前面板 - if (ActionLogicFactory.GetActionLogic(fakeActionId).Execute(actionParams)) + if (ActionLogicFactory.GetActionLogic(fakeActionId).Execute(actionParams, false)) { SetBottomInfoHide(); _main.MapInteractionLogic.CancelAllHighlight(); diff --git a/Unity/Assets/Scripts/UI/CityUpgradeActionUI.cs b/Unity/Assets/Scripts/UI/CityUpgradeActionUI.cs index 22b312993..3a275e9de 100644 --- a/Unity/Assets/Scripts/UI/CityUpgradeActionUI.cs +++ b/Unity/Assets/Scripts/UI/CityUpgradeActionUI.cs @@ -97,7 +97,7 @@ public class CityUpgradeActionUI var fakeActionId = clickedItem.GetComponent().ActionId; var commonActionParams = new CommonActionParams(mapData:MapData,playerData:MapData.PlayerMap.SelfPlayerData, cityData:_cityData,mainObjectType:MainObjectType.City); - if(ActionLogicFactory.GetActionLogic(fakeActionId).Execute(commonActionParams)) + if(ActionLogicFactory.GetActionLogic(fakeActionId).Execute(commonActionParams, false)) FadeOut(); }