TH1/My project/Assets/Scripts/Logic/Editor/AIConfigEditowWindow.cs
2025-05-15 17:23:11 +08:00

293 lines
12 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: 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();
}
}
}