293 lines
12 KiB
C#
293 lines
12 KiB
C#
/*
|
||
* @Author: 白哉
|
||
* @Description: AI 编辑器
|
||
* @Date: 2025年04月22日 星期二 15:04:14
|
||
* @Modify:
|
||
*/
|
||
|
||
|
||
using System.Collections.Generic;
|
||
using Logic.AI;
|
||
using RuntimeData;
|
||
using UnityEditor;
|
||
using UnityEngine;
|
||
|
||
|
||
namespace Logic.Editor
|
||
{
|
||
public enum EditorType
|
||
{
|
||
Asset,
|
||
Tech,
|
||
ScoreShow,
|
||
}
|
||
|
||
|
||
public class AIConfigEditowWindow : EditorWindow
|
||
{
|
||
// 滑条
|
||
private Vector2 _barPosition;
|
||
|
||
// 背景
|
||
private GUIStyle _redBoxStyle;
|
||
private GUIStyle _whiteBoxStyle;
|
||
|
||
private AIConfigAsset _asset;
|
||
private AIActionScoreCalculator _calculator;
|
||
private Main _main;
|
||
private CalculateResult _result;
|
||
private uint _curPlayerId;
|
||
private EditorType _editorType;
|
||
|
||
|
||
[MenuItem("Tools/AI 编辑器")]
|
||
private static void ShowWindow()
|
||
{
|
||
var window = CreateWindow<AIConfigEditowWindow>();
|
||
window.titleContent = new GUIContent("AI 编辑器");
|
||
window.Show();
|
||
window.minSize = new Vector2(500, 600);
|
||
}
|
||
|
||
protected virtual void OnEnable()
|
||
{
|
||
|
||
}
|
||
|
||
private void OnDisable()
|
||
{
|
||
|
||
}
|
||
|
||
private void OnGUI()
|
||
{
|
||
if (_calculator == null) _calculator = new AIActionScoreCalculator();
|
||
if (!_asset)
|
||
{
|
||
var path = $"Assets/Resources/DataAssets/AIConfig.asset";
|
||
_asset = AssetDatabase.LoadAssetAtPath<AIConfigAsset>(path);
|
||
if (!_asset)
|
||
{
|
||
_asset = CreateInstance<AIConfigAsset>();
|
||
AssetDatabase.CreateAsset(_asset, path);
|
||
AssetDatabase.SaveAssets();
|
||
AssetDatabase.Refresh();
|
||
}
|
||
}
|
||
if (_redBoxStyle == null)
|
||
{
|
||
_redBoxStyle = InspectorUtils.GetHelpBoxStyle();
|
||
InspectorUtils.AddBorder(_redBoxStyle, new Color(0.5f, 0.4f, 0.4f, 0.6f));
|
||
}
|
||
if (_whiteBoxStyle == null)
|
||
{
|
||
_whiteBoxStyle = InspectorUtils.GetHelpBoxStyle();
|
||
InspectorUtils.AddBorder(_whiteBoxStyle, new Color(1f, 1f, 1f, 0.2f));
|
||
}
|
||
|
||
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();
|
||
|
||
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($"<b>{techInfo.TechType} 系数</b>");
|
||
techInfo.Ratio = EditorGUILayout.FloatField(techInfo.Ratio);
|
||
EditorGUILayout.EndHorizontal();
|
||
EditorGUILayout.Space();
|
||
}
|
||
}
|
||
|
||
private void OnGUIEditorAsset()
|
||
{
|
||
EditorGUILayout.BeginHorizontal();
|
||
InspectorUtils.InspectorTextWidthRich($"<b>钱评分系数</b>");
|
||
_asset.MoneyScore = EditorGUILayout.FloatField(_asset.MoneyScore);
|
||
EditorGUILayout.EndHorizontal();
|
||
|
||
EditorGUILayout.BeginHorizontal();
|
||
InspectorUtils.InspectorTextWidthRich($"<b>小兵评分系数</b>");
|
||
_asset.UnitScore = EditorGUILayout.FloatField(_asset.UnitScore);
|
||
EditorGUILayout.EndHorizontal();
|
||
|
||
EditorGUILayout.BeginHorizontal();
|
||
InspectorUtils.InspectorTextWidthRich($"<b>城市评分系数</b>");
|
||
_asset.CityScore = EditorGUILayout.FloatField(_asset.CityScore);
|
||
EditorGUILayout.EndHorizontal();
|
||
|
||
EditorGUILayout.BeginHorizontal();
|
||
InspectorUtils.InspectorTextWidthRich($"<b>城市防守评分系数</b>");
|
||
_asset.CityDefendScore = EditorGUILayout.FloatField(_asset.CityDefendScore);
|
||
EditorGUILayout.EndHorizontal();
|
||
|
||
EditorGUILayout.BeginHorizontal();
|
||
InspectorUtils.InspectorTextWidthRich($"<b>每个可达地块的评分</b>");
|
||
_asset.OneCanMoveGridMaxScore = EditorGUILayout.FloatField(_asset.OneCanMoveGridMaxScore);
|
||
EditorGUILayout.EndHorizontal();
|
||
|
||
EditorGUILayout.BeginHorizontal();
|
||
InspectorUtils.InspectorTextWidthRich($"<b>每个视野地块的评分</b>");
|
||
_asset.OneSightGridMaxScore = EditorGUILayout.FloatField(_asset.OneSightGridMaxScore);
|
||
EditorGUILayout.EndHorizontal();
|
||
|
||
EditorGUILayout.BeginHorizontal();
|
||
InspectorUtils.InspectorTextWidthRich($"<b>小兵进攻评分系数</b>");
|
||
_asset.UnitAttackScore = EditorGUILayout.FloatField(_asset.UnitAttackScore);
|
||
EditorGUILayout.EndHorizontal();
|
||
|
||
EditorGUILayout.BeginHorizontal();
|
||
InspectorUtils.InspectorTextWidthRich($"<b>小兵回防评分系数</b>");
|
||
_asset.UnitDefendScore = EditorGUILayout.FloatField(_asset.UnitDefendScore);
|
||
EditorGUILayout.EndHorizontal();
|
||
|
||
EditorGUILayout.BeginHorizontal();
|
||
InspectorUtils.InspectorTextWidthRich($"<b>小兵探索未知区域评分</b>");
|
||
_asset.UnitExploreScore = EditorGUILayout.FloatField(_asset.UnitExploreScore);
|
||
EditorGUILayout.EndHorizontal();
|
||
|
||
EditorGUILayout.BeginHorizontal();
|
||
InspectorUtils.InspectorTextWidthRich($"<b>探索村庄评分</b>");
|
||
_asset.UnitExploreCityCenterScore = EditorGUILayout.FloatField(_asset.UnitExploreCityCenterScore);
|
||
EditorGUILayout.EndHorizontal();
|
||
|
||
EditorGUILayout.BeginHorizontal();
|
||
InspectorUtils.InspectorTextWidthRich($"<b>探索遗迹评分</b>");
|
||
_asset.UnitExploreTreasureScore = EditorGUILayout.FloatField(_asset.UnitExploreTreasureScore);
|
||
EditorGUILayout.EndHorizontal();
|
||
|
||
EditorGUILayout.BeginHorizontal();
|
||
InspectorUtils.InspectorTextWidthRich($"<b>探索海星评分</b>");
|
||
_asset.UnitExploreStarfishScore = EditorGUILayout.FloatField(_asset.UnitExploreStarfishScore);
|
||
EditorGUILayout.EndHorizontal();
|
||
|
||
EditorGUILayout.BeginHorizontal();
|
||
InspectorUtils.InspectorTextWidthRich($"<b>未来预期收益评分系数</b>");
|
||
_asset.FutureScoreTransformValue = EditorGUILayout.FloatField(_asset.FutureScoreTransformValue);
|
||
EditorGUILayout.EndHorizontal();
|
||
}
|
||
|
||
private void OnGUIRunTime()
|
||
{
|
||
if (!Application.isPlaying) return;
|
||
if (!_main)
|
||
{
|
||
var obj = GameObject.Find("Main");
|
||
if (!obj) return;
|
||
_main = obj.GetComponent<Main>();
|
||
if (!_main) return;
|
||
}
|
||
|
||
if (_calculator == null) _calculator = new AIActionScoreCalculator();
|
||
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);
|
||
}
|
||
}
|
||
else
|
||
{
|
||
if (InspectorUtils.InspectorButtonWithTextWidth($"玩家{player.Id}"))
|
||
{
|
||
_curPlayerId = player.Id;
|
||
_result = _calculator.CalculateScore(_main.MapData, player, _asset);
|
||
}
|
||
}
|
||
}
|
||
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();
|
||
InspectorUtils.InspectorTextWidthRich($"小兵{kv.Key.Id}评分: {kv.Value}");
|
||
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();
|
||
}
|
||
}
|
||
} |