备份CatanBuilding瘦身独立工程

This commit is contained in:
JSD\13999
2026-05-26 16:15:54 +08:00
commit 2d0e6a61b7
12001 changed files with 2431925 additions and 0 deletions

View File

@@ -0,0 +1,486 @@
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using HexGrid.Math;
using UnityEditor;
using UnityEditor.SceneManagement;
using UnityEngine;
using UnityEngine.SceneManagement;
namespace HexGrid.Editor
{
public class HexMapEditorWindow: EditorWindow
{
private const string WindowName = "HexMapEditor";
//
private GameObject _tileRoot;
//
private GameObject _prefabTileRoot;
private Transform _rootForDelTrans;
// 当前的数量
private int buttonCount = 0;
private int selectedButton = 0;
private string[] buttonLabels = {"选项1", "选项2", "选项3", "选项4"};
private int selectedIndex = 0;
private List<string> buttonList = new List<string>();
private string newButtonName = "新按钮";
[MenuItem("Tools/HexMap/Editor")]
static void OpenWindow()
{
// 创建窗口
var window = GetWindow<HexMapEditorWindow>(WindowName);
window.Show();
}
private void OnGUI()
{
HexMath.SetHexMapOrigin(Vector3.zero);
HexMath.SetGridSize(1.52f);
//EditorGUILayout.Label("编辑器设置", EditorStyles.boldLabel);
// GUILayout.Label("编辑器设置", EditorStyles.boldLabel);
// PrefabStage prefabStage = PrefabStageUtility.GetCurrentPrefabStage();
PrefabStage prefabStage = PrefabStageUtility.GetCurrentPrefabStage();
GameObject mapRootGo;
if (!prefabStage)
{
var sceneName = SceneManager.GetActiveScene().name;
GUILayout.Label($"场景名: {sceneName}",EditorStyles.boldLabel);
_tileRoot = EditorGUILayout.ObjectField("地图节点",_tileRoot,typeof(GameObject),true) as GameObject;
mapRootGo = _tileRoot;
_rootForDelTrans = null;
}
else
{
var prefabName = PrefabStageUtility.GetCurrentPrefabStage()?.prefabContentsRoot?.name?? "";
GUILayout.Label("Prefab 编辑模式");
GUILayout.Label($"prefabName: {prefabName}",EditorStyles.boldLabel);
_prefabTileRoot = EditorGUILayout.ObjectField("Prefab地图节点",_prefabTileRoot,typeof(GameObject),true) as GameObject;
mapRootGo = _prefabTileRoot;
_rootForDelTrans = PrefabStageUtility.GetCurrentPrefabStage().prefabContentsRoot.transform;
}
EditorGUILayout.Space(5f);
EditorGUILayout.Space(10);
if (GUILayout.Button("检查",GUILayout.Height(30)))
{
if (!mapRootGo)
{
EditorUtility.DisplayDialog("提示", "请设置地图节点", "确定");
return;
}
CheckFatherTile(mapRootGo.transform);
}
EditorGUILayout.Space();
if (GUILayout.Button("添加到Top",GUILayout.Height(30)))
{
if (!mapRootGo)
{
EditorUtility.DisplayDialog("提示", "请设置地图节点", "确定");
return;
}
// ApplySettings(mapRootGo);
MoveTerrainToMap(mapRootGo.transform);
}
EditorGUILayout.Space();
if (GUILayout.Button("从Top移除父类",GUILayout.Height(30)))
{
if (!_tileRoot)
{
EditorUtility.DisplayDialog("提示", "请设置地图节点", "确定");
return;
}
RemoveFromTop();
}
// EditorGUILayout.Space(10);
// GUILayout.Label("动态按钮创建示例", EditorStyles.boldLabel);
// EditorGUILayout.Space(5);
//
//
// GUILayout.Label("动态 Selection Grid 示例", EditorStyles.boldLabel);
//
// // 添加按钮的控制区域
// GUILayout.BeginHorizontal();
// newButtonName = GUILayout.TextField(newButtonName, GUILayout.Width(150));
// if (GUILayout.Button("添加按钮", GUILayout.Width(80)))
// {
// AddButton(newButtonName);
// }
// GUILayout.EndHorizontal();
//
// GUILayout.Space(10);
//
// // 只有当列表中有按钮时才显示 SelectionGrid
// if (buttonList.Count > 0)
// {
// // 将 List 转换为数组传给 SelectionGrid[1][2]
// selectedIndex = GUILayout.SelectionGrid(
// selectedIndex,
// buttonList.ToArray(), // 转换为数组
// 3, // 每行3个按钮
// GUILayout.Height(100)
// );
//
// // 确保选中索引在有效范围内
// if (selectedIndex >= buttonList.Count)
// {
// selectedIndex = buttonList.Count - 1;
// }
//
// GUILayout.Space(10);
// GUILayout.Label($"当前选中: {buttonList[selectedIndex]} (索引: {selectedIndex})");
//
// // 删除选中的按钮
// if (GUILayout.Button("删除选中的按钮"))
// {
// RemoveSelectedButton();
// }
// }
// else
// {
// GUILayout.Label("暂无按钮,请添加新按钮");
// }
//
// // 清空所有按钮
// if (buttonList.Count > 0 && GUILayout.Button("清空所有"))
// {
// ClearAll();
// }
// // 主按钮 - 用于创建新按钮
// if (GUILayout.Button("点击创建新按钮", GUILayout.Height(30)))
// {
// CreateNewButton();
// }
//
// // 使用ScrollView以防按钮过多
// if (buttonCount > 0)
// {
// GUILayout.Label($"已创建 {buttonCount} 个按钮:");
//
// // 显示所有动态创建的按钮
// for (int i = 0; i < buttonCount; i++)
// {
// int index = i; // 捕获当前索引
// if (GUILayout.Button($"动态按钮 #{index + 1}", GUILayout.Height(25)))
// {
// OnDynamicButtonClick(index);
// }
// }
// }
//
// EditorGUILayout.Space(10);
// // 清除所有按钮
// if (buttonCount > 0 && GUILayout.Button("清除所有按钮"))
// {
// buttonCount = 0;
// Repaint();
// }
//
// // 使用水平布局
// GUILayout.BeginHorizontal();
// if (GUILayout.Button("创建普通按钮", GUILayout.Width(120),GUILayout.Height(120)))
// {
// // CreateButton("普通");
// }
// if (GUILayout.Button("创建特殊按钮", GUILayout.Width(120)))
// {
// // CreateButton("特殊");
// }
// GUILayout.EndHorizontal();
// // 使用SelectionGrid创建按钮组
// int selected = GUILayout.SelectionGrid(-1, new string[] {"按钮1", "按钮2", "按钮3","按钮4"}, 3,
// GUILayout.Width(300), // 设置总宽度为200
// GUILayout.Height(100) // 设置总高度为100
// );
//
// if (selected >= 0)
// {
// Debug.Log($"选择了按钮 {selected + 1}");
// }
//
// GUILayout.Label("带样式的 Selection Grid");
//
// // 创建自定义样式
// GUIStyle gridStyle = new GUIStyle(GUI.skin.button);
//
// // 未选中按钮样式
// gridStyle.normal.textColor = Color.gray;
//
// // 选中按钮样式on前缀表示选中状态
// gridStyle.onNormal.textColor = Color.cyan;
// gridStyle.fontStyle = FontStyle.Bold;
//
// // 创建带自定义样式的选择网格
// selectedButton = GUILayout.SelectionGrid(
// selectedButton,
// buttonLabels,
// 3, // 每行2个按钮
// gridStyle, // 使用自定义样式[1][2]
// GUILayout.Width(300),
// GUILayout.Height(100)
// );
//
// GUILayout.Space(10);
// GUILayout.Label($"当前选中: {buttonLabels[selectedButton]}");
}
void AddButton(string name)
{
buttonList.Add($"{name} {buttonList.Count + 1}");
Repaint();
}
void RemoveSelectedButton()
{
if (selectedIndex >= 0 && selectedIndex < buttonList.Count)
{
buttonList.RemoveAt(selectedIndex);
// 调整选中索引
if (selectedIndex >= buttonList.Count && buttonList.Count > 0)
{
selectedIndex = buttonList.Count - 1;
}
Repaint();
}
}
void ClearAll()
{
buttonList.Clear();
selectedIndex = 0;
Repaint();
}
private void CreateNewButton()
{
buttonCount++;
Debug.Log($"创建了新按钮,当前按钮总数:{buttonCount}");
Repaint(); // 重绘窗口以显示新按钮
}
private void OnDynamicButtonClick(int index)
{
Log($"点击了动态按钮 #{index + 1}");
}
private static void Log(string s)
{
Debug.Log($"<color=yellow>FishingChallengeManager -> {s} </color>");
}
private void RemoveFromTop()
{
if (Selection.gameObjects.Length == 0)
{
Debug.LogWarning("请先选择一个或多个对象");
return;
}
var list = new List<Object>();
foreach (var t in Selection.gameObjects)
{
var paGameObj = t.transform.parent?.gameObject;
if (paGameObj && paGameObj.name.StartsWith("top"))
{
Undo.SetTransformParent(t.transform, null, "Remove Parent of " + t.gameObject.name ?? "");
t.transform.SetParent(_rootForDelTrans, true);
list.Add(t);
}
}
Selection.objects = list.ToArray();
FocusSelectinHierarchy();
}
private void Test()
{
// var enumerable = Selection.gameObjects.Select(elem => elem.transform).ToList();
// var mapRoot = _tileRoot.transform;
// foreach (var child in enumerable)
// {
// // child.SetParent(mapRoot,true);
// Undo.SetTransformParent(child,mapRoot,$"Reparent {child.gameObject.name}");
// child.SetParent(mapRoot,true);
// }
// var obj = Selection.activeGameObject;
// EditorApplication.delayCall += () =>
// {
// EditorGUIUtility.PingObject(obj);
// Selection.activeGameObject = obj;
// };
}
private void CheckFatherTile(Transform mapRoot)
{
var mapTiles = mapRoot.GetComponentsInChildren<Transform>(true);
var list = new List<Object>();
var enumerable = Selection.gameObjects.Where(elem => elem.transform != mapRoot).Select(elem => elem.transform).ToList();
foreach (var pos in enumerable.Select(child => HexMath.PixelToAxial(child.position)))
{
foreach (Transform tile in mapTiles)
{
// if(tile.Equals(mapRoot)) continue;
// if()
var hexGridController = tile.GetComponent<HexGridTiler>();
if(!hexGridController) continue;
var tilePos = HexMath.PixelToAxial(tile.position);
if (tilePos.Equals(pos))
{
var onTop = tile.Find("on/top");
ExpandParentHierarchy(onTop);
list.Add(tile.gameObject);
break;
}
}
}
list.AddRange(Selection.objects);
Selection.objects = list.ToArray();
FocusSelectinHierarchy();
}
//
private void MoveTerrainToMap(Transform mapRoot)
{
Undo.IncrementCurrentGroup();
Undo.SetCurrentGroupName("Reparent");
var mapTiles = mapRoot.GetComponentsInChildren<Transform>(true);
var list = new List<GameObject>();
var enumerable = Selection.gameObjects.Select(elem => elem.transform).ToList();
foreach (var child in enumerable)
{
var pos = HexMath.PixelToAxial(child.position);
foreach (Transform tile in mapTiles)
{
var tilePos = HexMath.PixelToAxial(tile.position);
if (tilePos.Equals(pos))
{
var onTop = tile.Find("on/top");
Undo.SetTransformParent(child,onTop,$"$Reparent {child.gameObject.name}");
child.SetParent(onTop,true);
list.Add(child.gameObject);
break;
}
}
// var tile = HexMath.PixelToAxial(terr.position)
}
Selection.objects = list.ToArray();
FocusSelectinHierarchy();
}
private static void ExpandParentHierarchy(Transform target)
{
if (!target) return;
List<GameObject> path = new List<GameObject>();
Transform current = target;
// 收集从目标到根的路径
path.Add(current.gameObject);
// 从根到目标依次展开
for (int i = path.Count - 1; i >= 0; i--)
{
// 使用内部方法展开 Hierarchy 中的对象
var type = typeof(EditorWindow).Assembly.GetType("UnityEditor.SceneHierarchyWindow");
var window = EditorWindow.GetWindow(type);
var expandMethod = type.GetMethod("SetExpandedRecursive");
if (expandMethod != null)
{
expandMethod.Invoke(window, new object[] { path[i].GetInstanceID(), true });
}
}
}
private void FocusSelectinHierarchy()
{
SceneView sceneView = SceneView.lastActiveSceneView;
sceneView.Focus();
sceneView.FrameSelected();
var selected = Selection.activeGameObject;
if (selected)
{
// EditorGUIUtility.PingObject(selected);
EditorApplication.delayCall += () =>
{
// ExpandParentHierarchy(selected.transform);
EditorGUIUtility.PingObject(selected);
};
}
}
private void ApplySettings(Transform mapRoot)
{
MoveTerrainToMap(mapRoot);
// PrefabStage prefabStage = PrefabStageUtility.GetCurrentPrefabStage();
//
// GameObject prefabRoot = prefabStage.prefabContentsRoot;
//
// Debug.Log($"当前Prefab根节点: {prefabRoot.name}");
// // 选中根节点
// Selection.activeGameObject = prefabRoot;
// 检查是否在Prefab模式
// PrefabStage prefabStage = PrefabStageUtility.GetCurrentPrefabStage();
// if (prefabStage != null)
// {
// // 在Prefab模式中
// GameObject prefabRoot = prefabStage.prefabContentsRoot;
// Debug.Log($"Prefab根节点: {prefabRoot.name}");
// Selection.activeGameObject = prefabRoot;
// }
// else
// {
// // 在场景模式中
// Scene activeScene = SceneManager.GetActiveScene();
// GameObject[] sceneRoots = activeScene.GetRootGameObjects();
//
// Debug.Log($"场景 '{activeScene.name}' 的根节点:");
// foreach (var root in sceneRoots)
// {
// Debug.Log($"- {root.name}");
// }
// Selection.objects = sceneRoots;
// }
// GameObject[] rootGameObjects = SceneManager.GetActiveScene().GetRootGameObjects();
//
// foreach (GameObject root in rootGameObjects)
// {
// Debug.Log("根节点: " + root.name);
// }
// if (Selection.activeGameObject)
// {
// Undo.RecordObject(Selection.activeGameObject, "Apply Settings");
// // 应用设置到选中的对象
// // Selection.activeGameObject.name = objectName;
// }
}
}
}

View File

@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 1791b26af7cd42d3a08f13f1f73b8038
timeCreated: 1758249532

View File

@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: d0e13fbedff0461faabb401366c92767
timeCreated: 1757930649

View File

@@ -0,0 +1,94 @@
// using NUnit.Framework;
// using UnityEngine;
//
namespace HexGrid.Tests
{
// public class AxialToPixelTests
// {
// // 假设的网格大小和原点位置,应与被测试代码中的值一致
// private const float _gridSize = 1.0f; // 根据实际情况调整
// private static readonly Vector3 _originPos = Vector3.zero; // 根据实际情况调整
//
// [Test]
// public void TestAxialToPixel_Origin()
// {
// // 测试原点坐标 (0, 0)
// Vector3 result = AxialToPixel(0, 0);
// Vector3 expected = _originPos;
// Assert.AreEqual(expected, result, "原点坐标转换不正确");
// }
//
// [Test]
// public void TestAxialToPixel_QDirection()
// {
// // 测试沿Q轴方向的移动
// Vector3 result = AxialToPixel(2, 0);
// Vector3 expected = new Vector3(_gridSize * Mathf.Sqrt(3f) * 2, 0, 0) + _originPos;
// Assert.AreEqual(expected, result, "Q轴方向坐标转换不正确");
// }
//
// [Test]
// public void TestAxialToPixel_RDirection()
// {
// // 测试沿R轴方向的移动
// Vector3 result = AxialToPixel(0, 2);
// Vector3 expected = new Vector3(0, 0, _gridSize * 1.5f * 2) + _originPos;
// Assert.AreEqual(expected, result, "R轴方向坐标转换不正确");
// }
//
// [Test]
// public void TestAxialToPixel_BothDirections()
// {
// // 测试同时沿Q轴和R轴移动
// Vector3 result = AxialToPixel(2, 3);
//
// float expectedX = _gridSize * Mathf.Sqrt(3f) * (2 + 3 / 2f);
// float expectedZ = _gridSize * 1.5f * 3;
// Vector3 expected = new Vector3(expectedX, 0, expectedZ) + _originPos;
//
// Assert.AreEqual(expected, result, "Q+R方向坐标转换不正确");
// }
//
// [Test]
// public void TestAxialToPixel_NegativeValues()
// {
// // 测试负值坐标
// Vector3 result = AxialToPixel(-2, -3);
//
// float expectedX = _gridSize * Mathf.Sqrt(3f) * (-2 + -3 / 2f);
// float expectedZ = _gridSize * 1.5f * -3;
// Vector3 expected = new Vector3(expectedX, 0, expectedZ) + _originPos;
//
// Assert.AreEqual(expected, result, "负值坐标转换不正确");
// }
//
// [Test]
// public void TestAxialToPixel_WithDifferentGridSize()
// {
// // 如果_gridSize可配置测试不同的网格大小
// // 注意这需要你能修改_gridSize的值
// // float originalGridSize = _gridSize;
// // _gridSize = 2.0f;
//
// // Vector3 result = AxialToPixel(1, 1);
// // float expectedX = 2.0f * Mathf.Sqrt(3f) * (1 + 1 / 2f);
// // float expectedZ = 2.0f * 1.5f * 1;
// // Vector3 expected = new Vector3(expectedX, 0, expectedZ) + _originPos;
//
// // Assert.AreEqual(expected, result, "不同网格大小下的坐标转换不正确");
//
// // _gridSize = originalGridSize; // 恢复原始值
//
// // 如果_gridSize不可修改可以跳过这个测试或添加注释说明
// Assert.Pass("网格大小不可配置,跳过此测试");
// }
//
// // 这是被测试的函数副本,用于测试
// public static Vector3 AxialToPixel(int q, int r)
// {
// var x = _gridSize * Mathf.Sqrt(3f) * (q + r / 2f);
// var z = _gridSize * 1.5f * r;
// return new Vector3(x, 0, z) + _originPos;
// }
// }
}

View File

@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: efbe296c664a45f79d6e940de63e03fe
timeCreated: 1757930665