diff --git a/My project/Assets/Scripts/Logic/AI/AIActionBase.cs b/My project/Assets/Scripts/Logic/AI/AIActionBase.cs index 1f7ef0ff9..869b0e1dd 100644 --- a/My project/Assets/Scripts/Logic/AI/AIActionBase.cs +++ b/My project/Assets/Scripts/Logic/AI/AIActionBase.cs @@ -28,6 +28,7 @@ namespace Logic.AI EmergencyDefend, Retreat, Common, + None, } @@ -327,19 +328,15 @@ namespace Logic.AI // 计算科技对国家的资源分 public int CalCountryTechResourceScore(TechType techType) { - HashSet cityList = Map.GetCityDataSetByPlayerId(Player.Id); + var gridSet = Map.GetPlayerTerritoryGridIdSet(Player.Id); int score = 0; - foreach(var city in cityList) + foreach(var gid in gridSet) { - HashSet gridList = new HashSet(); - city.Territory.GetAllTerritoryArea(gridList); - foreach(var gid in gridList) - { - if (!Map.GridMap.GetGridDataByGid(gid, out var grid)) continue; - //计算每一种techActions在grid下的资源分 - score += CalcGridTechResourceScore(techType, grid); - } + if (!Map.GridMap.GetGridDataByGid(gid, out var grid)) continue; + //计算每一种techActions在grid下的资源分 + score += CalcGridTechResourceScore(techType, grid); } + return score; } @@ -358,7 +355,6 @@ namespace Logic.AI } if (t.ActionType == CommonActionType.Build) { - if (!Table.Instance.GridAndResourceDataAssets.GetResourceInfo(t.ResourceType, out var resourceInfo)) continue; score += t.ResourceType switch @@ -1232,24 +1228,6 @@ namespace Logic.AI foreach (var city in selfCity) CityStrategy.TryAdd(city, CountryStrategy); } - - public Strategy GetPlayerStrategy() - { - return CountryStrategy; - } - - public Strategy GetUnitStrategy(uint id) - { - if (!Map.UnitMap.GetUnitDataByUnitId(id, out var unit)) return Strategy.Common; - if (FreeUnitStrategy.TryGetValue(unit, out var strategy)) return strategy; - return LegionStrategy.GetValueOrDefault(unit.LegionId, Strategy.Common); - } - - public Strategy GetCityStrategy(uint id) - { - if (!Map.CityMap.GetCityById(id, out var city)) return Strategy.Common; - return CityStrategy.GetValueOrDefault(city, Strategy.Common); - } } public class MatchResult diff --git a/My project/Assets/Scripts/Logic/Editor/AIConfigEditowWindow.cs b/My project/Assets/Scripts/Logic/Editor/AIConfigEditowWindow.cs index 59a8a22cb..abd87810b 100644 --- a/My project/Assets/Scripts/Logic/Editor/AIConfigEditowWindow.cs +++ b/My project/Assets/Scripts/Logic/Editor/AIConfigEditowWindow.cs @@ -31,16 +31,9 @@ namespace Logic.Editor // 背景 private GUIStyle _redBoxStyle; private GUIStyle _whiteBoxStyle; - - private AIConfigAsset _asset; - private AIActionScoreCalculator _calculator; - private Main _main; + private PlayerData _player; - private CalculateResult _result; - private uint _curPlayerId; - private EditorType _editorType; - private bool _isShowTechScore; - private AITechScoreCalculator _techCalculator; + private Main _main; [MenuItem("Tools/AI 编辑器")] @@ -64,19 +57,6 @@ namespace Logic.Editor private void OnGUI() { - if (_calculator == null) _calculator = new AIActionScoreCalculator(); - if (!_asset) - { - var path = $"Assets/Resources/DataAssets/AIConfig.asset"; - _asset = AssetDatabase.LoadAssetAtPath(path); - if (!_asset) - { - _asset = CreateInstance(); - AssetDatabase.CreateAsset(_asset, path); - AssetDatabase.SaveAssets(); - AssetDatabase.Refresh(); - } - } if (_redBoxStyle == null) { _redBoxStyle = InspectorUtils.GetHelpBoxStyle(); @@ -90,130 +70,13 @@ namespace Logic.Editor GUI.skin.button.wordWrap = true; _barPosition = EditorGUILayout.BeginScrollView(_barPosition); - - EditorGUILayout.BeginHorizontal(); - if (InspectorUtils.InspectorButtonWithTextWidth("保存")) - { - EditorUtility.SetDirty(_asset); - AssetDatabase.SaveAssets(); - AssetDatabase.Refresh(); - } - if (InspectorUtils.InspectorButtonWithTextWidth("保存游戏进度")) - { - MapData.SaveMapData(_main.MapData); - } - if (InspectorUtils.InspectorButtonWithTextWidth("评分系数编辑")) - { - _editorType = EditorType.Asset; - } - if (InspectorUtils.InspectorButtonWithTextWidth("科技系数编辑")) - { - _editorType = EditorType.Tech; - } - if (InspectorUtils.InspectorButtonWithTextWidth("评分得分展示")) - { - _editorType = EditorType.ScoreShow; - } - EditorGUILayout.EndHorizontal(); - - if(_editorType == EditorType.Asset) OnGUIEditorAsset(); - if(_editorType == EditorType.Tech) OnGUIEditorTechInfo(); - if(_editorType == EditorType.ScoreShow) OnGUIRunTime(); + OnGUIRunTime(); + OnShowPlayerInfo(); + EditorGUILayout.EndScrollView(); } - - private void OnGUIEditorTechInfo() - { - EditorGUILayout.BeginHorizontal(); - if (InspectorUtils.InspectorButtonWithTextWidth("初始化科技系数")) - { - _asset.TechInfoList.Clear(); - for (int i = (int)TechType.Climbing; i <= (int)TechType.EgyptSakuya; i++) - { - _asset.TechInfoList.Add(new AICalculatorTechInfo((TechType)i, 1)); - } - } - EditorGUILayout.EndHorizontal(); - - foreach (var techInfo in _asset.TechInfoList) - { - EditorGUILayout.BeginHorizontal(); - InspectorUtils.InspectorTextWidthRich($"{techInfo.TechType} 系数"); - techInfo.Ratio = EditorGUILayout.FloatField(techInfo.Ratio); - EditorGUILayout.EndHorizontal(); - EditorGUILayout.Space(); - } - } - - private void OnGUIEditorAsset() - { - EditorGUILayout.BeginHorizontal(); - InspectorUtils.InspectorTextWidthRich($"钱评分系数"); - _asset.MoneyScore = EditorGUILayout.FloatField(_asset.MoneyScore); - EditorGUILayout.EndHorizontal(); - - EditorGUILayout.BeginHorizontal(); - InspectorUtils.InspectorTextWidthRich($"小兵评分系数"); - _asset.UnitScore = EditorGUILayout.FloatField(_asset.UnitScore); - EditorGUILayout.EndHorizontal(); - - EditorGUILayout.BeginHorizontal(); - InspectorUtils.InspectorTextWidthRich($"城市评分系数"); - _asset.CityScore = EditorGUILayout.FloatField(_asset.CityScore); - EditorGUILayout.EndHorizontal(); - - EditorGUILayout.BeginHorizontal(); - InspectorUtils.InspectorTextWidthRich($"城市防守评分系数"); - _asset.CityDefendScore = EditorGUILayout.FloatField(_asset.CityDefendScore); - EditorGUILayout.EndHorizontal(); - - EditorGUILayout.BeginHorizontal(); - InspectorUtils.InspectorTextWidthRich($"每个可达地块的评分"); - _asset.OneCanMoveGridMaxScore = EditorGUILayout.FloatField(_asset.OneCanMoveGridMaxScore); - EditorGUILayout.EndHorizontal(); - - EditorGUILayout.BeginHorizontal(); - InspectorUtils.InspectorTextWidthRich($"每个视野地块的评分"); - _asset.OneSightGridMaxScore = EditorGUILayout.FloatField(_asset.OneSightGridMaxScore); - EditorGUILayout.EndHorizontal(); - - EditorGUILayout.BeginHorizontal(); - InspectorUtils.InspectorTextWidthRich($"小兵进攻评分系数"); - _asset.UnitAttackScore = EditorGUILayout.FloatField(_asset.UnitAttackScore); - EditorGUILayout.EndHorizontal(); - - EditorGUILayout.BeginHorizontal(); - InspectorUtils.InspectorTextWidthRich($"小兵回防评分系数"); - _asset.UnitDefendScore = EditorGUILayout.FloatField(_asset.UnitDefendScore); - EditorGUILayout.EndHorizontal(); - - EditorGUILayout.BeginHorizontal(); - InspectorUtils.InspectorTextWidthRich($"小兵探索未知区域评分"); - _asset.UnitExploreScore = EditorGUILayout.FloatField(_asset.UnitExploreScore); - EditorGUILayout.EndHorizontal(); - - EditorGUILayout.BeginHorizontal(); - InspectorUtils.InspectorTextWidthRich($"探索村庄评分"); - _asset.UnitExploreCityCenterScore = EditorGUILayout.FloatField(_asset.UnitExploreCityCenterScore); - EditorGUILayout.EndHorizontal(); - - EditorGUILayout.BeginHorizontal(); - InspectorUtils.InspectorTextWidthRich($"探索遗迹评分"); - _asset.UnitExploreTreasureScore = EditorGUILayout.FloatField(_asset.UnitExploreTreasureScore); - EditorGUILayout.EndHorizontal(); - - EditorGUILayout.BeginHorizontal(); - InspectorUtils.InspectorTextWidthRich($"探索海星评分"); - _asset.UnitExploreStarfishScore = EditorGUILayout.FloatField(_asset.UnitExploreStarfishScore); - EditorGUILayout.EndHorizontal(); - - EditorGUILayout.BeginHorizontal(); - InspectorUtils.InspectorTextWidthRich($"未来预期收益评分系数"); - _asset.FutureScoreTransformValue = EditorGUILayout.FloatField(_asset.FutureScoreTransformValue); - EditorGUILayout.EndHorizontal(); - } - + private void OnGUIRunTime() { if (!Application.isPlaying) return; @@ -224,94 +87,56 @@ namespace Logic.Editor _main = obj.GetComponent
(); if (!_main) return; } - - if (_calculator == null) _calculator = new AIActionScoreCalculator(); + if (_main?.MapData == null) return; EditorGUILayout.BeginHorizontal(); foreach (var player in _main.MapData.PlayerMap.PlayerDataList) { - if (player.Id == _main.MapData.PlayerMap.SelfPlayerId) - { - if (InspectorUtils.InspectorButtonWithTextWidth($"主玩家{player.Id}")) - { - _curPlayerId = player.Id; - _result = _calculator.CalculateScore(_main.MapData, player, _asset); - _player = player; - } - } - else - { - if (InspectorUtils.InspectorButtonWithTextWidth($"玩家{player.Id}")) - { - _curPlayerId = player.Id; - _result = _calculator.CalculateScore(_main.MapData, player, _asset); - _player = player; - } - } + if (player.Id == _main.MapData.PlayerMap.SelfPlayerId) continue; + if (InspectorUtils.InspectorButtonWithTextWidth($"玩家{player.Id}")) _player = player; } EditorGUILayout.EndHorizontal(); - - if (_result == null) return; - foreach (var kv in _calculator.UnitScore) - { - if (!_main.MapData.GetPlayerIdByUnitId(kv.Key.Id, out var owner)) continue; - if (owner != _curPlayerId) continue; - var target = _calculator.UnitTargetMap.GetUnitTargetByUnitId(kv.Key.Id); - EditorGUILayout.BeginHorizontal(); - var pos = _main.MapData.GetGridDataByUnitId(kv.Key.Id, out var grid); - InspectorUtils.InspectorTextWidthRich($"小兵{kv.Key.Id}评分: {kv.Value}, 位置为 {grid.Pos.X}, {grid.Pos.Y}"); - if (target != null) InspectorUtils.InspectorTextWidthRich($" 目标为:{target.TargetType}, 位置为:{target.Grid.Pos.X}, {target.Grid.Pos.Y}"); - EditorGUILayout.EndHorizontal(); - } - - foreach (var kv in _calculator.CityScore) - { - if (!_main.MapData.GetPlayerIdByCityId(kv.Key.Id, out var owner)) continue; - if (owner != _curPlayerId) continue; - EditorGUILayout.BeginHorizontal(); - InspectorUtils.InspectorTextWidthRich($"城市{kv.Key.Id}评分: {kv.Value}"); - EditorGUILayout.EndHorizontal(); - } - - foreach (var kv in _calculator.CityDefendScore) - { - if (!_main.MapData.GetPlayerIdByCityId(kv.Key.Id, out var owner)) continue; - if (owner != _curPlayerId) continue; - EditorGUILayout.BeginHorizontal(); - InspectorUtils.InspectorTextWidthRich($"城市{kv.Key.Id}防御评分: {kv.Value}"); - EditorGUILayout.EndHorizontal(); - } - - InspectorUtils.InspectorTextWidthRich($"----------------------------------------------------"); - InspectorUtils.InspectorTextWidthRich($"----------------------------------------------------"); - - foreach (var kv in _result.ScoreDict) - { - EditorGUILayout.BeginHorizontal(); - InspectorUtils.InspectorTextWidthRich($"{kv.Key}策略评分: {kv.Value}"); - EditorGUILayout.EndHorizontal(); - } - - EditorGUILayout.BeginHorizontal(); - InspectorUtils.InspectorTextWidthRich($"策略总评分: {_result.GetAllScore()}"); - EditorGUILayout.EndHorizontal(); - - _isShowTechScore = EditorGUILayout.Toggle(_isShowTechScore, GUILayout.Width(16)); - if (_isShowTechScore) OnGUITechScore(); } - private void OnGUITechScore() + private void OnShowPlayerInfo() { - InspectorUtils.InspectorTextWidthRich($"----------------------------------------------------"); - InspectorUtils.InspectorTextWidthRich($"----------------------------------------------------"); - _techCalculator ??= new AITechScoreCalculator(); - foreach (TechType t in System.Enum.GetValues(typeof(TechType))) + if (_main?.MapData == null || _player == null) return; + + GUI.skin.button.wordWrap = true; + _barPosition = EditorGUILayout.BeginScrollView(_barPosition); + + EditorGUILayout.BeginHorizontal(); + InspectorUtils.InspectorTextWidthRich($"玩家ID: {_player.Id}, 国家战略为: {MainEditor.Instance.GetPlayerStrategy(_player.Id)}"); + EditorGUILayout.EndHorizontal(); + + EditorGUILayout.BeginVertical(_whiteBoxStyle); + InspectorUtils.InspectorTextWidthRich($"城市信息"); + var selfCity = new HashSet(); + _main.MapData.GetCityDataListByPlayerId(_player.Id, selfCity); + foreach (var city in selfCity) { - if (t == TechType.None) continue; - var score = _techCalculator.CalculateTechScorePro(_main.MapData, _player, t, _asset); - EditorGUILayout.BeginHorizontal(); - InspectorUtils.InspectorTextWidthRich($"科技 {t} 学习后得分为: {score * _asset.GetTechInfo(t).Ratio}"); - EditorGUILayout.EndHorizontal(); + InspectorUtils.InspectorTextWidthRich($"ID: {city.Id}, 策略: {MainEditor.Instance.GetCityStrategy(city.Id)}"); } + + EditorGUILayout.EndVertical(); + + EditorGUILayout.Space(); + EditorGUILayout.Space(); + + EditorGUILayout.BeginVertical(_whiteBoxStyle); + InspectorUtils.InspectorTextWidthRich($"小兵信息"); + var selfUnits = new HashSet(); + _main.MapData.GetUnitDataListByPlayerId(_player.Id, selfUnits); + foreach (var unit in selfUnits) + { + var strategy = MainEditor.Instance.GetUnitStrategy(unit.Id, unit.LegionId, _player.Id); + InspectorUtils.InspectorTextWidthRich(unit.LegionId == 0 + ? $"ID: {unit.Id}, 自由人, 策略: {strategy}" + : $"ID: {unit.Id}, 军团ID:{unit.LegionId}, 策略: {strategy}"); + } + + EditorGUILayout.EndVertical(); + + EditorGUILayout.EndScrollView(); } } } \ No newline at end of file diff --git a/My project/Assets/Scripts/Logic/Main/MainEditor.cs b/My project/Assets/Scripts/Logic/Main/MainEditor.cs index 138f5a310..27105d26a 100644 --- a/My project/Assets/Scripts/Logic/Main/MainEditor.cs +++ b/My project/Assets/Scripts/Logic/Main/MainEditor.cs @@ -5,6 +5,7 @@ * @Modify: */ +using System.Collections.Generic; using Logic.AI; using UnityEngine; @@ -15,9 +16,37 @@ namespace Logic public bool IsEditor = false; public bool IsGo = false; public AICalculatorData Data; + private Dictionary _playerStrategy; + private Dictionary _cityStrategy; + private Dictionary _unitStrategy; + private Dictionary _legionStrategy; public static MainEditor Instance = new MainEditor(); + public MainEditor() + { + _playerStrategy = new Dictionary(); + _cityStrategy = new Dictionary(); + _unitStrategy = new Dictionary(); + _legionStrategy = new Dictionary(); + } + + public Strategy GetPlayerStrategy(uint pid) + { + return _playerStrategy.GetValueOrDefault(pid, Strategy.None); + } + + public Strategy GetUnitStrategy(uint uid, uint legion, uint playerId) + { + if (legion == 0) return _unitStrategy.GetValueOrDefault(uid, Strategy.None); + return _legionStrategy.GetValueOrDefault(legion * 10000 + playerId, Strategy.None); + } + + public Strategy GetCityStrategy(uint cid) + { + return _cityStrategy.GetValueOrDefault(cid, Strategy.None); + } + public void Update() { if (Input.GetKeyDown(KeyCode.F10)) @@ -35,6 +64,13 @@ namespace Logic IsGo = true; Debug.LogWarning("Space"); } + + if (Data == null) return; + if (Data.Player == null) return; + _playerStrategy[Data.Player.Id] = Data.CountryStrategy; + foreach (var kv in Data.CityStrategy) _cityStrategy[kv.Key.Id] = kv.Value; + foreach (var kv in Data.FreeUnitStrategy) _unitStrategy[kv.Key.Id] = kv.Value; + foreach (var kv in Data.LegionStrategy) _legionStrategy[kv.Key * 10000 + Data.Player.Id] = kv.Value; } } } \ No newline at end of file