From 8cd8aa31da4c2e099569d20a1d552d45687f0b71 Mon Sep 17 00:00:00 2001
From: keshaohong <740612340@qq.com>
Date: Sun, 28 Jun 2026 16:40:11 +0800
Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=B7=A5=E5=85=B7=EF=BC=8C?=
=?UTF-8?q?=E4=BC=98=E5=8C=96=E9=85=8D=E7=BD=AE?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
unity/Assets/Editor.meta | 8 +
unity/Assets/Editor/ElementsAligner.cs | 229 ++++++++++++++++++
unity/Assets/Editor/ElementsAligner.cs.meta | 11 +
unity/Assets/Editor/SceneElementsYSorter.cs | 150 ++++++++++++
.../Editor/SceneElementsYSorter.cs.meta | 11 +
unity/Assets/Editor/YSortBatchAdder.cs | 150 ++++++++++++
unity/Assets/Editor/YSortBatchAdder.cs.meta | 11 +
unity/Assets/Editor/YSortDebugger.cs | 131 ++++++++++
unity/Assets/Editor/YSortDebugger.cs.meta | 11 +
unity/Assets/Editor/YSortEditorWindow.cs | 173 +++++++++++++
unity/Assets/Editor/YSortEditorWindow.cs.meta | 11 +
unity/Assets/Scenes/res/prefab.meta | 8 +
unity/Assets/Scenes/res/prefab/cloud1.prefab | 90 +++++++
.../Scenes/res/prefab/cloud1.prefab.meta | 7 +
unity/Assets/Scenes/res/prefab/cloud2.prefab | 90 +++++++
.../Scenes/res/prefab/cloud2.prefab.meta | 7 +
unity/Assets/Scenes/res/prefab/grass 0.prefab | 90 +++++++
.../Scenes/res/prefab/grass 0.prefab.meta | 7 +
unity/Assets/Scenes/res/prefab/grass 1.prefab | 90 +++++++
.../Scenes/res/prefab/grass 1.prefab.meta | 7 +
unity/Assets/Scenes/res/prefab/grass2.prefab | 90 +++++++
.../Scenes/res/prefab/grass2.prefab.meta | 7 +
unity/Assets/Scenes/res/prefab/grass3.prefab | 90 +++++++
.../Scenes/res/prefab/grass3.prefab.meta | 7 +
unity/Assets/Scenes/res/prefab/groot1.prefab | 90 +++++++
.../Scenes/res/prefab/groot1.prefab.meta | 7 +
.../Assets/Scenes/res/prefab/mountain1.prefab | 90 +++++++
.../Scenes/res/prefab/mountain1.prefab.meta | 7 +
unity/Assets/Scenes/res/prefab/stone1.prefab | 90 +++++++
.../Scenes/res/prefab/stone1.prefab.meta | 7 +
unity/Assets/Scenes/res/prefab/stone2.prefab | 90 +++++++
.../Scenes/res/prefab/stone2.prefab.meta | 7 +
unity/Assets/Scenes/res/prefab/stone3.prefab | 90 +++++++
.../Scenes/res/prefab/stone3.prefab.meta | 7 +
unity/Assets/Scenes/res/prefab/tree1.prefab | 90 +++++++
.../Scenes/res/prefab/tree1.prefab.meta | 7 +
unity/Assets/Scenes/res/prefab/tree2.prefab | 90 +++++++
.../Scenes/res/prefab/tree2.prefab.meta | 7 +
unity/Assets/Scenes/res/prefab/tree3.prefab | 90 +++++++
.../Scenes/res/prefab/tree3.prefab.meta | 7 +
unity/Assets/Scenes/res/prefab/tree4.prefab | 90 +++++++
.../Scenes/res/prefab/tree4.prefab.meta | 7 +
unity/Assets/Scenes/res/prefab/tree5.prefab | 90 +++++++
.../Scenes/res/prefab/tree5.prefab.meta | 7 +
unity/Assets/Scenes/res/prefab/tree6.prefab | 90 +++++++
.../Scenes/res/prefab/tree6.prefab.meta | 7 +
unity/Assets/camera/YSorter.cs | 22 +-
47 files changed, 2563 insertions(+), 12 deletions(-)
create mode 100644 unity/Assets/Editor.meta
create mode 100644 unity/Assets/Editor/ElementsAligner.cs
create mode 100644 unity/Assets/Editor/ElementsAligner.cs.meta
create mode 100644 unity/Assets/Editor/SceneElementsYSorter.cs
create mode 100644 unity/Assets/Editor/SceneElementsYSorter.cs.meta
create mode 100644 unity/Assets/Editor/YSortBatchAdder.cs
create mode 100644 unity/Assets/Editor/YSortBatchAdder.cs.meta
create mode 100644 unity/Assets/Editor/YSortDebugger.cs
create mode 100644 unity/Assets/Editor/YSortDebugger.cs.meta
create mode 100644 unity/Assets/Editor/YSortEditorWindow.cs
create mode 100644 unity/Assets/Editor/YSortEditorWindow.cs.meta
create mode 100644 unity/Assets/Scenes/res/prefab.meta
create mode 100644 unity/Assets/Scenes/res/prefab/cloud1.prefab
create mode 100644 unity/Assets/Scenes/res/prefab/cloud1.prefab.meta
create mode 100644 unity/Assets/Scenes/res/prefab/cloud2.prefab
create mode 100644 unity/Assets/Scenes/res/prefab/cloud2.prefab.meta
create mode 100644 unity/Assets/Scenes/res/prefab/grass 0.prefab
create mode 100644 unity/Assets/Scenes/res/prefab/grass 0.prefab.meta
create mode 100644 unity/Assets/Scenes/res/prefab/grass 1.prefab
create mode 100644 unity/Assets/Scenes/res/prefab/grass 1.prefab.meta
create mode 100644 unity/Assets/Scenes/res/prefab/grass2.prefab
create mode 100644 unity/Assets/Scenes/res/prefab/grass2.prefab.meta
create mode 100644 unity/Assets/Scenes/res/prefab/grass3.prefab
create mode 100644 unity/Assets/Scenes/res/prefab/grass3.prefab.meta
create mode 100644 unity/Assets/Scenes/res/prefab/groot1.prefab
create mode 100644 unity/Assets/Scenes/res/prefab/groot1.prefab.meta
create mode 100644 unity/Assets/Scenes/res/prefab/mountain1.prefab
create mode 100644 unity/Assets/Scenes/res/prefab/mountain1.prefab.meta
create mode 100644 unity/Assets/Scenes/res/prefab/stone1.prefab
create mode 100644 unity/Assets/Scenes/res/prefab/stone1.prefab.meta
create mode 100644 unity/Assets/Scenes/res/prefab/stone2.prefab
create mode 100644 unity/Assets/Scenes/res/prefab/stone2.prefab.meta
create mode 100644 unity/Assets/Scenes/res/prefab/stone3.prefab
create mode 100644 unity/Assets/Scenes/res/prefab/stone3.prefab.meta
create mode 100644 unity/Assets/Scenes/res/prefab/tree1.prefab
create mode 100644 unity/Assets/Scenes/res/prefab/tree1.prefab.meta
create mode 100644 unity/Assets/Scenes/res/prefab/tree2.prefab
create mode 100644 unity/Assets/Scenes/res/prefab/tree2.prefab.meta
create mode 100644 unity/Assets/Scenes/res/prefab/tree3.prefab
create mode 100644 unity/Assets/Scenes/res/prefab/tree3.prefab.meta
create mode 100644 unity/Assets/Scenes/res/prefab/tree4.prefab
create mode 100644 unity/Assets/Scenes/res/prefab/tree4.prefab.meta
create mode 100644 unity/Assets/Scenes/res/prefab/tree5.prefab
create mode 100644 unity/Assets/Scenes/res/prefab/tree5.prefab.meta
create mode 100644 unity/Assets/Scenes/res/prefab/tree6.prefab
create mode 100644 unity/Assets/Scenes/res/prefab/tree6.prefab.meta
diff --git a/unity/Assets/Editor.meta b/unity/Assets/Editor.meta
new file mode 100644
index 0000000..41c8230
--- /dev/null
+++ b/unity/Assets/Editor.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: B35M4XmvASlCoiCqqevhf9PzxguX4ZL8m73Mtl7Ay8Y2uHQi63PdPwo=
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/unity/Assets/Editor/ElementsAligner.cs b/unity/Assets/Editor/ElementsAligner.cs
new file mode 100644
index 0000000..51a68cc
--- /dev/null
+++ b/unity/Assets/Editor/ElementsAligner.cs
@@ -0,0 +1,229 @@
+using UnityEngine;
+using UnityEditor;
+
+///
+/// Elements底对齐工具 - 将Elements下所有物体底对齐到Y=0平面
+///
+public class ElementsAligner : Editor
+{
+ [MenuItem("Tools/Elements/底对齐到地面 (Y=0)")]
+ public static void AlignElementsToGround()
+ {
+ GameObject elements = GameObject.Find("Elements");
+
+ if (elements == null)
+ {
+ EditorUtility.DisplayDialog("错误", "找不到场景中的 'Elements' 物体", "确定");
+ return;
+ }
+
+ int count = 0;
+ Undo.SetCurrentGroupName("Align Elements to Ground");
+
+ for (int i = 0; i < elements.transform.childCount; i++)
+ {
+ Transform child = elements.transform.GetChild(i);
+
+ // 记录到Undo栈
+ Undo.RecordObject(child, $"Align {child.name}");
+
+ // 获取物体的包围盒
+ Bounds bounds = GetObjectBounds(child);
+
+ if (bounds.size == Vector3.zero)
+ {
+ Debug.LogWarning($"跳过 {child.name} - 无法计算包围盒");
+ continue;
+ }
+
+ // 计算需要移动的距离:让物体底部对齐到Y=0
+ float bottomY = bounds.min.y;
+ Vector3 newPosition = child.position;
+ newPosition.y = child.position.y - bottomY;
+
+ child.position = newPosition;
+
+ count++;
+ Debug.Log($"✓ 对齐 {child.name}: 底部Y从 {bottomY:F3} 到 0");
+ }
+
+ if (count > 0)
+ {
+ UnityEditor.SceneManagement.EditorSceneManager.MarkSceneDirty(
+ UnityEditor.SceneManagement.EditorSceneManager.GetActiveScene()
+ );
+
+ EditorUtility.DisplayDialog("完成", $"已对齐 {count} 个物体到地面 (Y=0)", "确定");
+ Debug.Log($"完成!对齐了 {count} 个物体");
+ }
+ }
+
+ [MenuItem("Tools/Elements/底对齐到指定高度")]
+ public static void AlignElementsToCustomHeight()
+ {
+ string input = EditorInputDialog.Show("对齐到指定高度", "请输入目标Y坐标:", "0");
+
+ if (input == null) return; // 用户取消
+
+ if (!float.TryParse(input, out float targetY))
+ {
+ EditorUtility.DisplayDialog("错误", "请输入有效的数字", "确定");
+ return;
+ }
+
+ GameObject elements = GameObject.Find("Elements");
+
+ if (elements == null)
+ {
+ EditorUtility.DisplayDialog("错误", "找不到场景中的 'Elements' 物体", "确定");
+ return;
+ }
+
+ int count = 0;
+ Undo.SetCurrentGroupName("Align Elements to Custom Height");
+
+ for (int i = 0; i < elements.transform.childCount; i++)
+ {
+ Transform child = elements.transform.GetChild(i);
+ Undo.RecordObject(child, $"Align {child.name}");
+
+ Bounds bounds = GetObjectBounds(child);
+
+ if (bounds.size == Vector3.zero)
+ {
+ Debug.LogWarning($"跳过 {child.name} - 无法计算包围盒");
+ continue;
+ }
+
+ float bottomY = bounds.min.y;
+ Vector3 newPosition = child.position;
+ newPosition.y = child.position.y - bottomY + targetY;
+
+ child.position = newPosition;
+
+ count++;
+ Debug.Log($"✓ 对齐 {child.name}: 底部Y从 {bottomY:F3} 到 {targetY:F3}");
+ }
+
+ if (count > 0)
+ {
+ UnityEditor.SceneManagement.EditorSceneManager.MarkSceneDirty(
+ UnityEditor.SceneManagement.EditorSceneManager.GetActiveScene()
+ );
+
+ EditorUtility.DisplayDialog("完成", $"已对齐 {count} 个物体到 Y={targetY}", "确定");
+ }
+ }
+
+ ///
+ /// 获取物体的世界空间包围盒(包括所有子物体和渲染器)
+ ///
+ private static Bounds GetObjectBounds(Transform obj)
+ {
+ Renderer[] renderers = obj.GetComponentsInChildren();
+
+ if (renderers.Length == 0)
+ {
+ // 如果没有渲染器,使用碰撞体或transform位置
+ Collider[] colliders = obj.GetComponentsInChildren();
+ if (colliders.Length > 0)
+ {
+ Bounds bounds = colliders[0].bounds;
+ for (int i = 1; i < colliders.Length; i++)
+ {
+ bounds.Encapsulate(colliders[i].bounds);
+ }
+ return bounds;
+ }
+
+ // 都没有,返回以物体为中心的小包围盒
+ return new Bounds(obj.position, Vector3.one * 0.1f);
+ }
+
+ // 使用第一个渲染器初始化
+ Bounds result = renderers[0].bounds;
+
+ // 合并所有渲染器的包围盒
+ for (int i = 1; i < renderers.Length; i++)
+ {
+ result.Encapsulate(renderers[i].bounds);
+ }
+
+ return result;
+ }
+}
+
+///
+/// 简单的输入对话框(用于自定义高度)
+///
+public class EditorInputDialog : EditorWindow
+{
+ private string _title;
+ private string _message;
+ private string _inputText;
+ private bool _confirmed = false;
+
+ public static string Show(string title, string message, string defaultValue)
+ {
+ EditorInputDialog window = CreateInstance();
+ window.titleContent = new GUIContent(title);
+ window._title = title;
+ window._message = message;
+ window._inputText = defaultValue;
+ window._confirmed = false;
+ window.minSize = new Vector2(300, 120);
+ window.maxSize = new Vector2(300, 120);
+ window.ShowModal();
+
+ return window._confirmed ? window._inputText : null;
+ }
+
+ private void OnGUI()
+ {
+ GUILayout.Space(10);
+ GUILayout.Label(_message, EditorStyles.wordWrappedLabel);
+ GUILayout.Space(5);
+
+ GUI.SetNextControlName("InputField");
+ _inputText = GUILayout.TextField(_inputText);
+
+ if (Event.current.type == EventType.Repaint && GUI.GetNameOfFocusedControl() != "InputField")
+ {
+ EditorGUI.FocusTextInControl("InputField");
+ }
+
+ // 支持回车确认
+ if (Event.current.type == EventType.KeyDown && Event.current.keyCode == KeyCode.Return)
+ {
+ _confirmed = true;
+ Close();
+ Event.current.Use();
+ }
+
+ // 支持ESC取消
+ if (Event.current.type == EventType.KeyDown && Event.current.keyCode == KeyCode.Escape)
+ {
+ _confirmed = false;
+ Close();
+ Event.current.Use();
+ }
+
+ GUILayout.Space(10);
+ GUILayout.BeginHorizontal();
+ GUILayout.FlexibleSpace();
+
+ if (GUILayout.Button("确定", GUILayout.Width(80)))
+ {
+ _confirmed = true;
+ Close();
+ }
+
+ if (GUILayout.Button("取消", GUILayout.Width(80)))
+ {
+ _confirmed = false;
+ Close();
+ }
+
+ GUILayout.EndHorizontal();
+ }
+}
diff --git a/unity/Assets/Editor/ElementsAligner.cs.meta b/unity/Assets/Editor/ElementsAligner.cs.meta
new file mode 100644
index 0000000..a834695
--- /dev/null
+++ b/unity/Assets/Editor/ElementsAligner.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: DC5L4SmvAikxYp2FEhg5gm08qf2yJAfGzXIwjRrErdh5PGIXksqhon4=
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/unity/Assets/Editor/SceneElementsYSorter.cs b/unity/Assets/Editor/SceneElementsYSorter.cs
new file mode 100644
index 0000000..002127e
--- /dev/null
+++ b/unity/Assets/Editor/SceneElementsYSorter.cs
@@ -0,0 +1,150 @@
+using UnityEngine;
+using UnityEditor;
+using System.Collections.Generic;
+
+///
+/// 场景Elements Y-Sort添加工具
+///
+public class SceneElementsYSorter : Editor
+{
+ [MenuItem("Tools/Y-Sort/给Test场景Elements添加YSorter")]
+ public static void AddYSorterToTestSceneElements()
+ {
+ // 查找场景中的Elements物体
+ GameObject elements = GameObject.Find("Elements");
+
+ if (elements == null)
+ {
+ EditorUtility.DisplayDialog("错误", "找不到场景中的 'Elements' 物体", "确定");
+ return;
+ }
+
+ Transform elementsTransform = elements.transform;
+ int count = 0;
+ List processedObjects = new List();
+
+ // 遍历所有直接子物体
+ for (int i = 0; i < elementsTransform.childCount; i++)
+ {
+ Transform child = elementsTransform.GetChild(i);
+
+ // 检查是否已有YSorter
+ if (child.GetComponent() != null)
+ {
+ Debug.Log($"跳过 {child.name} - 已有YSorter");
+ continue;
+ }
+
+ // 添加YSorter组件
+ YSorter ySorter = child.gameObject.AddComponent();
+
+ // 根据物体名称设置baseSortingOrder
+ int baseOrder = DetermineBaseOrder(child.name);
+
+ // 通过SerializedObject设置
+ SerializedObject so = new SerializedObject(ySorter);
+ SerializedProperty prop = so.FindProperty("baseSortingOrder");
+ if (prop != null)
+ {
+ prop.intValue = baseOrder;
+ so.ApplyModifiedProperties();
+ }
+
+ // 标记场景已修改
+ EditorUtility.SetDirty(child.gameObject);
+
+ count++;
+ processedObjects.Add($"{child.name} (baseSortingOrder: {baseOrder})");
+ Debug.Log($"✓ 已添加 YSorter 到 {child.name} (baseSortingOrder: {baseOrder})");
+ }
+
+ // 保存场景
+ if (count > 0)
+ {
+ UnityEditor.SceneManagement.EditorSceneManager.MarkSceneDirty(
+ UnityEditor.SceneManagement.EditorSceneManager.GetActiveScene()
+ );
+
+ EditorUtility.DisplayDialog(
+ "完成",
+ $"已给 {count} 个物体添加YSorter\n\n" +
+ string.Join("\n", processedObjects),
+ "确定"
+ );
+ }
+ else
+ {
+ EditorUtility.DisplayDialog("提示", "所有物体都已有YSorter", "确定");
+ }
+ }
+
+ [MenuItem("Tools/Y-Sort/给选中物体添加YSorter")]
+ public static void AddYSorterToSelected()
+ {
+ if (Selection.gameObjects.Length == 0)
+ {
+ EditorUtility.DisplayDialog("提示", "请先选择物体", "确定");
+ return;
+ }
+
+ int count = 0;
+ foreach (GameObject go in Selection.gameObjects)
+ {
+ if (go.GetComponent() != null)
+ {
+ Debug.Log($"跳过 {go.name} - 已有YSorter");
+ continue;
+ }
+
+ YSorter ySorter = go.AddComponent();
+ int baseOrder = DetermineBaseOrder(go.name);
+
+ SerializedObject so = new SerializedObject(ySorter);
+ SerializedProperty prop = so.FindProperty("baseSortingOrder");
+ if (prop != null)
+ {
+ prop.intValue = baseOrder;
+ so.ApplyModifiedProperties();
+ }
+
+ EditorUtility.SetDirty(go);
+ count++;
+ Debug.Log($"✓ 已添加 YSorter 到 {go.name} (baseSortingOrder: {baseOrder})");
+ }
+
+ if (count > 0)
+ {
+ UnityEditor.SceneManagement.EditorSceneManager.MarkSceneDirty(
+ UnityEditor.SceneManagement.EditorSceneManager.GetActiveScene()
+ );
+ Debug.Log($"完成!给 {count} 个物体添加了YSorter");
+ }
+ }
+
+ private static int DetermineBaseOrder(string objectName)
+ {
+ string nameLower = objectName.ToLower();
+
+ if (nameLower.Contains("ground") || nameLower.Contains("floor"))
+ return 0;
+ if (nameLower.Contains("shadow"))
+ return 500;
+ if (nameLower.Contains("grass") || nameLower.Contains("flower") ||
+ nameLower.Contains("leaf") || nameLower.Contains("leaves"))
+ return 800;
+ if (nameLower.Contains("rock") || nameLower.Contains("bamboo") ||
+ nameLower.Contains("barrel") || nameLower.Contains("box") ||
+ nameLower.Contains("log") || nameLower.Contains("board") ||
+ nameLower.Contains("bush") || nameLower.Contains("bonfire") ||
+ nameLower.Contains("candle") || nameLower.Contains("carcasses") ||
+ nameLower.Contains("lotus") || nameLower.Contains("pedestal") ||
+ nameLower.Contains("scarecrow") || nameLower.Contains("skeleton") ||
+ nameLower.Contains("skull") || nameLower.Contains("spear") ||
+ nameLower.Contains("statue") || nameLower.Contains("tent") ||
+ nameLower.Contains("tenticles") || nameLower.Contains("wooden") ||
+ nameLower.Contains("bag") || nameLower.Contains("house"))
+ return 1000;
+
+ return 1000;
+ }
+}
diff --git a/unity/Assets/Editor/SceneElementsYSorter.cs.meta b/unity/Assets/Editor/SceneElementsYSorter.cs.meta
new file mode 100644
index 0000000..4eb3265
--- /dev/null
+++ b/unity/Assets/Editor/SceneElementsYSorter.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: CXId5y+uBnMV5xxn04I7kiFCq2y/PqaiVVbHtE0aEpDF+ppBPLZ1ETI=
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/unity/Assets/Editor/YSortBatchAdder.cs b/unity/Assets/Editor/YSortBatchAdder.cs
new file mode 100644
index 0000000..7112174
--- /dev/null
+++ b/unity/Assets/Editor/YSortBatchAdder.cs
@@ -0,0 +1,150 @@
+using UnityEngine;
+using UnityEditor;
+using System.IO;
+
+///
+/// Y-Sort 批量添加工具
+///
+/// 使用方法:
+/// 1. 在Unity菜单栏点击 Tools -> Y-Sort -> 批量添加YSorter
+/// 2. 会自动给Player、Enemy和所有场景预制体添加YSorter组件
+/// 3. 根据物体类型自动设置baseSortingOrder
+///
+public class YSortBatchAdder : Editor
+{
+ [MenuItem("Tools/Y-Sort/批量添加YSorter到所有预制体")]
+ public static void AddYSorterToAllPrefabs()
+ {
+ string prefabFolder = "Assets/2.5D Engine/Prefabs";
+
+ if (!Directory.Exists(prefabFolder))
+ {
+ Debug.LogError($"找不到预制体文件夹: {prefabFolder}");
+ return;
+ }
+
+ string[] prefabPaths = Directory.GetFiles(prefabFolder, "*.prefab", SearchOption.AllDirectories);
+ int count = 0;
+
+ foreach (string path in prefabPaths)
+ {
+ string normalizedPath = path.Replace("\\", "/");
+ GameObject prefab = AssetDatabase.LoadAssetAtPath(normalizedPath);
+
+ if (prefab == null) continue;
+
+ // 检查是否已经有YSorter
+ if (prefab.GetComponentInChildren() != null)
+ {
+ Debug.Log($"跳过 {prefab.name} - 已有YSorter");
+ continue;
+ }
+
+ // 根据预制体名称判断类型并设置baseSortingOrder
+ int baseOrder = DetermineBaseOrder(prefab.name);
+
+ // 添加到根物体
+ AddYSorterToPrefab(prefab, baseOrder);
+ count++;
+
+ Debug.Log($"已添加 YSorter 到 {prefab.name} (baseSortingOrder: {baseOrder})");
+ }
+
+ AssetDatabase.SaveAssets();
+ AssetDatabase.Refresh();
+
+ Debug.Log($"完成!共添加了 {count} 个YSorter");
+ }
+
+ [MenuItem("Tools/Y-Sort/添加YSorter到Player")]
+ public static void AddYSorterToPlayer()
+ {
+ string playerPath = "Assets/2.5D Engine/Player.prefab";
+ GameObject player = AssetDatabase.LoadAssetAtPath(playerPath);
+
+ if (player == null)
+ {
+ Debug.LogError($"找不到Player预制体: {playerPath}");
+ return;
+ }
+
+ AddYSorterToPrefab(player, 2000); // 角色层
+ AssetDatabase.SaveAssets();
+ Debug.Log("已添加YSorter到Player (baseSortingOrder: 2000)");
+ }
+
+ [MenuItem("Tools/Y-Sort/添加YSorter到Enemy")]
+ public static void AddYSorterToEnemy()
+ {
+ string enemyPath = "Assets/2.5D Engine/Enemy.prefab";
+ GameObject enemy = AssetDatabase.LoadAssetAtPath(enemyPath);
+
+ if (enemy == null)
+ {
+ Debug.LogError($"找不到Enemy预制体: {enemyPath}");
+ return;
+ }
+
+ AddYSorterToPrefab(enemy, 2000); // 角色层
+ AssetDatabase.SaveAssets();
+ Debug.Log("已添加YSorter到Enemy (baseSortingOrder: 2000)");
+ }
+
+ private static int DetermineBaseOrder(string prefabName)
+ {
+ string nameLower = prefabName.ToLower();
+
+ // 地面/地板类
+ if (nameLower.Contains("ground") || nameLower.Contains("floor"))
+ return 0;
+
+ // 阴影类
+ if (nameLower.Contains("shadow"))
+ return 500;
+
+ // 草、花、叶子等小物件
+ if (nameLower.Contains("grass") || nameLower.Contains("flower") ||
+ nameLower.Contains("leaf") || nameLower.Contains("leaves"))
+ return 800;
+
+ // 场景道具(树、石头、箱子、桶等)
+ if (nameLower.Contains("rock") || nameLower.Contains("bamboo") ||
+ nameLower.Contains("barrel") || nameLower.Contains("box") ||
+ nameLower.Contains("log") || nameLower.Contains("board") ||
+ nameLower.Contains("bush") || nameLower.Contains("bonfire") ||
+ nameLower.Contains("candle") || nameLower.Contains("carcasses") ||
+ nameLower.Contains("lotus") || nameLower.Contains("pedestal") ||
+ nameLower.Contains("scarecrow") || nameLower.Contains("skeleton") ||
+ nameLower.Contains("skull") || nameLower.Contains("spear") ||
+ nameLower.Contains("statue") || nameLower.Contains("tent") ||
+ nameLower.Contains("tenticles") || nameLower.Contains("wooden") ||
+ nameLower.Contains("bag") || nameLower.Contains("house"))
+ return 1000;
+
+ // 默认
+ return 1000;
+ }
+
+ private static void AddYSorterToPrefab(GameObject prefab, int baseSortingOrder)
+ {
+ // 使用PrefabUtility打开预制体进行编辑
+ string prefabPath = AssetDatabase.GetAssetPath(prefab);
+ GameObject prefabRoot = PrefabUtility.LoadPrefabContents(prefabPath);
+
+ // 添加YSorter组件到根物体
+ YSorter ySorter = prefabRoot.AddComponent();
+
+ // 通过SerializedObject设置baseSortingOrder
+ SerializedObject so = new SerializedObject(ySorter);
+ SerializedProperty baseOrderProp = so.FindProperty("baseSortingOrder");
+ if (baseOrderProp != null)
+ {
+ baseOrderProp.intValue = baseSortingOrder;
+ so.ApplyModifiedProperties();
+ }
+
+ // 保存预制体
+ PrefabUtility.SaveAsPrefabAsset(prefabRoot, prefabPath);
+ PrefabUtility.UnloadPrefabContents(prefabRoot);
+ }
+}
diff --git a/unity/Assets/Editor/YSortBatchAdder.cs.meta b/unity/Assets/Editor/YSortBatchAdder.cs.meta
new file mode 100644
index 0000000..0d4caa4
--- /dev/null
+++ b/unity/Assets/Editor/YSortBatchAdder.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: XHscsS34ASkUIqS5+NMIlnFVzhdiTT4OWMFKV5plXmzuXkQ9iGNU2EA=
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/unity/Assets/Editor/YSortDebugger.cs b/unity/Assets/Editor/YSortDebugger.cs
new file mode 100644
index 0000000..ec13443
--- /dev/null
+++ b/unity/Assets/Editor/YSortDebugger.cs
@@ -0,0 +1,131 @@
+using UnityEngine;
+using UnityEditor;
+
+///
+/// Y-Sort诊断工具
+///
+public class YSortDebugger : Editor
+{
+ [MenuItem("Tools/Y-Sort/诊断YSorter状态")]
+ public static void DebugYSorter()
+ {
+ // 查找场景中所有YSorter
+ YSorter[] allSorters = FindObjectsOfType();
+
+ if (allSorters.Length == 0)
+ {
+ EditorUtility.DisplayDialog("诊断结果", "场景中没有找到任何YSorter组件!\n\n请先使用菜单:\nTools → Y-Sort → 给Test场景Elements添加YSorter", "确定");
+ return;
+ }
+
+ string report = $"找到 {allSorters.Length} 个YSorter组件\n\n";
+ report += "=== 详细信息 ===\n\n";
+
+ foreach (YSorter sorter in allSorters)
+ {
+ report += $"物体: {sorter.gameObject.name}\n";
+ report += $" 位置: {sorter.transform.position}\n";
+
+ // 获取SpriteRenderer
+ SpriteRenderer sr = sorter.GetComponentInChildren();
+ if (sr != null)
+ {
+ report += $" SpriteRenderer: {sr.name}\n";
+ report += $" SortingLayer: {sr.sortingLayerName}\n";
+ report += $" SortingOrder: {sr.sortingOrder}\n";
+ }
+ else
+ {
+ report += $" SpriteRenderer: 未找到!\n";
+ }
+
+ report += "\n";
+ }
+
+ // 检查是否都在同一个SortingLayer
+ string[] layers = new string[allSorters.Length];
+ for (int i = 0; i < allSorters.Length; i++)
+ {
+ SpriteRenderer sr = allSorters[i].GetComponentInChildren();
+ if (sr != null)
+ layers[i] = sr.sortingLayerName;
+ }
+
+ bool allSameLayer = true;
+ if (layers.Length > 0)
+ {
+ string firstLayer = layers[0];
+ foreach (string layer in layers)
+ {
+ if (layer != firstLayer)
+ {
+ allSameLayer = false;
+ break;
+ }
+ }
+ }
+
+ if (!allSameLayer)
+ {
+ report += "⚠️ 警告: 物体不在同一个SortingLayer!\n";
+ report += "这可能导致排序不正确。\n";
+ }
+
+ Debug.Log(report);
+ EditorUtility.DisplayDialog("诊断完成", $"诊断信息已输出到控制台\n\n请查看Unity Console窗口", "确定");
+ }
+
+ [MenuItem("Tools/Y-Sort/测试YSorter计算")]
+ public static void TestYSorterCalculation()
+ {
+ GameObject selected = Selection.activeGameObject;
+
+ if (selected == null)
+ {
+ EditorUtility.DisplayDialog("提示", "请先选择一个物体", "确定");
+ return;
+ }
+
+ YSorter sorter = selected.GetComponent();
+ if (sorter == null)
+ {
+ EditorUtility.DisplayDialog("提示", $"选中的物体 {selected.name} 没有YSorter组件", "确定");
+ return;
+ }
+
+ // 通过反射获取私有字段
+ var baseOrderField = typeof(YSorter).GetField("baseSortingOrder",
+ System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
+ var scaleFactorField = typeof(YSorter).GetField("scaleFactor",
+ System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
+
+ int baseOrder = (int)baseOrderField.GetValue(sorter);
+ float scaleFactor = (float)scaleFactorField.GetValue(sorter);
+
+ Vector3 pos = selected.transform.position;
+ int expectedOrder = baseOrder + Mathf.RoundToInt(pos.z * scaleFactor);
+
+ SpriteRenderer sr = sorter.GetComponentInChildren();
+ int actualOrder = sr != null ? sr.sortingOrder : -1;
+
+ string msg = $"物体: {selected.name}\n";
+ msg += $"位置: {pos}\n";
+ msg += $"Z坐标: {pos.z:F3}\n";
+ msg += $"baseSortingOrder: {baseOrder}\n";
+ msg += $"scaleFactor: {scaleFactor}\n";
+ msg += $"期望SortingOrder: {expectedOrder}\n";
+ msg += $"实际SortingOrder: {actualOrder}\n\n";
+
+ if (expectedOrder == actualOrder)
+ {
+ msg += "✓ 排序正确";
+ }
+ else
+ {
+ msg += "✗ 排序不匹配!";
+ }
+
+ EditorUtility.DisplayDialog("YSorter测试", msg, "确定");
+ Debug.Log(msg);
+ }
+}
diff --git a/unity/Assets/Editor/YSortDebugger.cs.meta b/unity/Assets/Editor/YSortDebugger.cs.meta
new file mode 100644
index 0000000..d2ed177
--- /dev/null
+++ b/unity/Assets/Editor/YSortDebugger.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: CSkWsXyqUSrgcqGVp1KhCflPlY95SPuT+0n6ZO4FNbzx7EhZFVzsyec=
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/unity/Assets/Editor/YSortEditorWindow.cs b/unity/Assets/Editor/YSortEditorWindow.cs
new file mode 100644
index 0000000..fe1b355
--- /dev/null
+++ b/unity/Assets/Editor/YSortEditorWindow.cs
@@ -0,0 +1,173 @@
+using UnityEngine;
+using UnityEditor;
+using System.Collections.Generic;
+
+///
+/// Y-Sort 批量添加工具 - EditorWindow版本
+///
+public class YSortEditorWindow : EditorWindow
+{
+ private Vector2 scrollPosition;
+ private List logMessages = new List();
+
+ [MenuItem("Tools/Y-Sort/Y-Sort管理工具")]
+ public static void ShowWindow()
+ {
+ GetWindow("Y-Sort管理工具");
+ }
+
+ private void OnGUI()
+ {
+ GUILayout.Label("Y-Sort批量添加", EditorStyles.boldLabel);
+
+ GUILayout.Space(10);
+
+ if (GUILayout.Button("添加YSorter到Player预制体", GUILayout.Height(30)))
+ {
+ AddToPlayer();
+ }
+
+ if (GUILayout.Button("添加YSorter到Enemy预制体", GUILayout.Height(30)))
+ {
+ AddToEnemy();
+ }
+
+ GUILayout.Space(10);
+
+ if (GUILayout.Button("批量添加到所有场景预制体 (2.5D Engine/Prefabs)", GUILayout.Height(30)))
+ {
+ AddToAllPrefabs();
+ }
+
+ GUILayout.Space(10);
+
+ if (GUILayout.Button("清除日志", GUILayout.Height(20)))
+ {
+ logMessages.Clear();
+ Repaint();
+ }
+
+ GUILayout.Space(10);
+ GUILayout.Label("日志输出:", EditorStyles.boldLabel);
+
+ scrollPosition = GUILayout.BeginScrollView(scrollPosition, GUILayout.ExpandHeight(true));
+ foreach (string msg in logMessages)
+ {
+ GUILayout.Label(msg);
+ }
+ GUILayout.EndScrollView();
+ }
+
+ private void AddLog(string msg)
+ {
+ logMessages.Add(msg);
+ Debug.Log(msg);
+ Repaint();
+ }
+
+ private void AddToPlayer()
+ {
+ string path = "Assets/2.5D Engine/Player.prefab";
+ AddYSorterToPrefab(path, 2000, "Player");
+ }
+
+ private void AddToEnemy()
+ {
+ string path = "Assets/2.5D Engine/Enemy.prefab";
+ AddYSorterToPrefab(path, 2000, "Enemy");
+ }
+
+ private void AddToAllPrefabs()
+ {
+ string folder = "Assets/2.5D Engine/Prefabs";
+ string[] files = System.IO.Directory.GetFiles(folder, "*.prefab", System.IO.SearchOption.AllDirectories);
+
+ int count = 0;
+ foreach (string file in files)
+ {
+ string normalizedPath = file.Replace("\\", "/");
+ string prefabName = System.IO.Path.GetFileNameWithoutExtension(file);
+ int baseOrder = DetermineBaseOrder(prefabName);
+
+ if (AddYSorterToPrefab(normalizedPath, baseOrder, prefabName))
+ {
+ count++;
+ }
+ }
+
+ AddLog($"完成!共添加了 {count} 个YSorter");
+ }
+
+ private bool AddYSorterToPrefab(string path, int baseSortingOrder, string displayName)
+ {
+ GameObject prefab = AssetDatabase.LoadAssetAtPath(path);
+ if (prefab == null)
+ {
+ AddLog($"错误: 找不到预制体 {displayName}");
+ return false;
+ }
+
+ // 检查是否已有YSorter
+ if (prefab.GetComponentInChildren() != null)
+ {
+ AddLog($"跳过 {displayName} - 已有YSorter");
+ return false;
+ }
+
+ // 打开预制体进行编辑
+ string assetPath = AssetDatabase.GetAssetPath(prefab);
+ GameObject prefabRoot = PrefabUtility.LoadPrefabContents(assetPath);
+
+ if (prefabRoot == null)
+ {
+ AddLog($"错误: 无法加载预制体内容 {displayName}");
+ return false;
+ }
+
+ // 添加YSorter组件
+ YSorter ySorter = prefabRoot.AddComponent();
+
+ // 设置baseSortingOrder
+ SerializedObject so = new SerializedObject(ySorter);
+ SerializedProperty prop = so.FindProperty("baseSortingOrder");
+ if (prop != null)
+ {
+ prop.intValue = baseSortingOrder;
+ so.ApplyModifiedProperties();
+ }
+
+ // 保存
+ PrefabUtility.SaveAsPrefabAsset(prefabRoot, assetPath);
+ PrefabUtility.UnloadPrefabContents(prefabRoot);
+
+ AddLog($"✓ 已添加 YSorter 到 {displayName} (baseSortingOrder: {baseSortingOrder})");
+ return true;
+ }
+
+ private int DetermineBaseOrder(string prefabName)
+ {
+ string nameLower = prefabName.ToLower();
+
+ if (nameLower.Contains("ground") || nameLower.Contains("floor"))
+ return 0;
+ if (nameLower.Contains("shadow"))
+ return 500;
+ if (nameLower.Contains("grass") || nameLower.Contains("flower") ||
+ nameLower.Contains("leaf") || nameLower.Contains("leaves"))
+ return 800;
+ if (nameLower.Contains("rock") || nameLower.Contains("bamboo") ||
+ nameLower.Contains("barrel") || nameLower.Contains("box") ||
+ nameLower.Contains("log") || nameLower.Contains("board") ||
+ nameLower.Contains("bush") || nameLower.Contains("bonfire") ||
+ nameLower.Contains("candle") || nameLower.Contains("carcasses") ||
+ nameLower.Contains("lotus") || nameLower.Contains("pedestal") ||
+ nameLower.Contains("scarecrow") || nameLower.Contains("skeleton") ||
+ nameLower.Contains("skull") || nameLower.Contains("spear") ||
+ nameLower.Contains("statue") || nameLower.Contains("tent") ||
+ nameLower.Contains("tenticles") || nameLower.Contains("wooden") ||
+ nameLower.Contains("bag") || nameLower.Contains("house"))
+ return 1000;
+
+ return 1000;
+ }
+}
diff --git a/unity/Assets/Editor/YSortEditorWindow.cs.meta b/unity/Assets/Editor/YSortEditorWindow.cs.meta
new file mode 100644
index 0000000..2f32eed
--- /dev/null
+++ b/unity/Assets/Editor/YSortEditorWindow.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: DHhNtyKoVXmD0PMFCorGxxPHUaBpiHhn0MMdJ4PaV2ygEFgYTD9bPtk=
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/unity/Assets/Scenes/res/prefab.meta b/unity/Assets/Scenes/res/prefab.meta
new file mode 100644
index 0000000..495abc9
--- /dev/null
+++ b/unity/Assets/Scenes/res/prefab.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: D3kftiukUS/4k/2Q8ce4ciGO0lsjOQjcVNeonF0SHuvfRbX8pmgjnOE=
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/unity/Assets/Scenes/res/prefab/cloud1.prefab b/unity/Assets/Scenes/res/prefab/cloud1.prefab
new file mode 100644
index 0000000..58b3ae5
--- /dev/null
+++ b/unity/Assets/Scenes/res/prefab/cloud1.prefab
@@ -0,0 +1,90 @@
+%YAML 1.1
+%TAG !u! tag:yousandi.cn,2023:
+--- !u!1 &6899754420521126267
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 7
+ m_Component:
+ - component: {fileID: 8451410411389343811}
+ - component: {fileID: 301522936781993068}
+ m_Layer: 0
+ m_HasEditorInfo: 1
+ m_Name: cloud1
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!4 &8451410411389343811
+Transform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 6899754420521126267}
+ serializedVersion: 2
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: 5.55, y: 0, z: 2.72}
+ m_LocalScale: {x: 1.0488987, y: 1.0488987, z: 1.0488987}
+ m_ConstrainProportionsScale: 0
+ m_Children: []
+ m_Father: {fileID: 0}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!212 &301522936781993068
+SpriteRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 6899754420521126267}
+ m_Enabled: 1
+ m_CastShadows: 1
+ m_ReceiveShadows: 1
+ m_DynamicOccludee: 1
+ m_StaticShadowCaster: 0
+ m_MotionVectors: 1
+ m_LightProbeUsage: 1
+ m_ReflectionProbeUsage: 1
+ m_RayTracingMode: 0
+ m_RayTraceProcedural: 0
+ m_virtualGeometry: 0
+ m_virtualGeometryShadow: 0
+ m_ShadingRate: 0
+ m_RenderingLayerMask: 1
+ m_RendererPriority: 0
+ m_Materials:
+ - {fileID: -876546973899608171, guid: be3236dea9f1e304da1a5e3a513dad5e, type: 3}
+ m_StaticBatchInfo:
+ firstSubMesh: 0
+ subMeshCount: 0
+ m_StaticBatchRoot: {fileID: 0}
+ m_ProbeAnchor: {fileID: 0}
+ m_LightProbeVolumeOverride: {fileID: 0}
+ m_ScaleInLightmap: 1
+ m_ReceiveGI: 1
+ m_PreserveUVs: 0
+ m_IgnoreNormalsForChartDetection: 0
+ m_ImportantGI: 0
+ m_StitchLightmapSeams: 1
+ m_SelectedEditorRenderState: 0
+ m_MinimumChartSize: 4
+ m_AutoUVMaxDistance: 0.5
+ m_AutoUVMaxAngle: 89
+ m_LightmapParameters: {fileID: 0}
+ m_SortingLayerID: 0
+ m_SortingLayer: 0
+ m_SortingOrder: 1
+ m_Sprite: {fileID: 21300000, guid: 4277e7d03e5e19b40a79d382ef5e74ac, type: 3}
+ m_Color: {r: 1, g: 1, b: 1, a: 1}
+ m_FlipX: 0
+ m_FlipY: 0
+ m_DrawMode: 0
+ m_Size: {x: 11.08, y: 8.65}
+ m_AdaptiveModeThreshold: 0.5
+ m_SpriteTileMode: 0
+ m_WasSpriteAssigned: 1
+ m_MaskInteraction: 0
+ m_SpriteSortPoint: 0
diff --git a/unity/Assets/Scenes/res/prefab/cloud1.prefab.meta b/unity/Assets/Scenes/res/prefab/cloud1.prefab.meta
new file mode 100644
index 0000000..de6f54a
--- /dev/null
+++ b/unity/Assets/Scenes/res/prefab/cloud1.prefab.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: DCgbsn6qV3NWblhH9eDoWZeKXUIcRWsrraAnEqo1V3jBktB2dtJrhrQ=
+PrefabImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/unity/Assets/Scenes/res/prefab/cloud2.prefab b/unity/Assets/Scenes/res/prefab/cloud2.prefab
new file mode 100644
index 0000000..2de0538
--- /dev/null
+++ b/unity/Assets/Scenes/res/prefab/cloud2.prefab
@@ -0,0 +1,90 @@
+%YAML 1.1
+%TAG !u! tag:yousandi.cn,2023:
+--- !u!1 &6782446334086200893
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 7
+ m_Component:
+ - component: {fileID: 7110582839246585995}
+ - component: {fileID: 7570130396318949430}
+ m_Layer: 0
+ m_HasEditorInfo: 1
+ m_Name: cloud2
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!4 &7110582839246585995
+Transform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 6782446334086200893}
+ serializedVersion: 2
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: 5.63, y: 0, z: 0.41}
+ m_LocalScale: {x: 0.801053, y: 0.801053, z: 0.801053}
+ m_ConstrainProportionsScale: 0
+ m_Children: []
+ m_Father: {fileID: 0}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!212 &7570130396318949430
+SpriteRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 6782446334086200893}
+ m_Enabled: 1
+ m_CastShadows: 1
+ m_ReceiveShadows: 1
+ m_DynamicOccludee: 1
+ m_StaticShadowCaster: 0
+ m_MotionVectors: 1
+ m_LightProbeUsage: 1
+ m_ReflectionProbeUsage: 1
+ m_RayTracingMode: 0
+ m_RayTraceProcedural: 0
+ m_virtualGeometry: 0
+ m_virtualGeometryShadow: 0
+ m_ShadingRate: 0
+ m_RenderingLayerMask: 1
+ m_RendererPriority: 0
+ m_Materials:
+ - {fileID: -876546973899608171, guid: be3236dea9f1e304da1a5e3a513dad5e, type: 3}
+ m_StaticBatchInfo:
+ firstSubMesh: 0
+ subMeshCount: 0
+ m_StaticBatchRoot: {fileID: 0}
+ m_ProbeAnchor: {fileID: 0}
+ m_LightProbeVolumeOverride: {fileID: 0}
+ m_ScaleInLightmap: 1
+ m_ReceiveGI: 1
+ m_PreserveUVs: 0
+ m_IgnoreNormalsForChartDetection: 0
+ m_ImportantGI: 0
+ m_StitchLightmapSeams: 1
+ m_SelectedEditorRenderState: 0
+ m_MinimumChartSize: 4
+ m_AutoUVMaxDistance: 0.5
+ m_AutoUVMaxAngle: 89
+ m_LightmapParameters: {fileID: 0}
+ m_SortingLayerID: 0
+ m_SortingLayer: 0
+ m_SortingOrder: 1
+ m_Sprite: {fileID: 21300000, guid: 7c028bc155e1b5b41b77afe8bb94c94a, type: 3}
+ m_Color: {r: 1, g: 1, b: 1, a: 1}
+ m_FlipX: 0
+ m_FlipY: 0
+ m_DrawMode: 0
+ m_Size: {x: 11.08, y: 8.65}
+ m_AdaptiveModeThreshold: 0.5
+ m_SpriteTileMode: 0
+ m_WasSpriteAssigned: 1
+ m_MaskInteraction: 0
+ m_SpriteSortPoint: 0
diff --git a/unity/Assets/Scenes/res/prefab/cloud2.prefab.meta b/unity/Assets/Scenes/res/prefab/cloud2.prefab.meta
new file mode 100644
index 0000000..5afdd7a
--- /dev/null
+++ b/unity/Assets/Scenes/res/prefab/cloud2.prefab.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: WnpM4yikVHORl3yxClXx3/fRdx5CPL3H98xjV/tNLpOD9DroYJP0M4A=
+PrefabImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/unity/Assets/Scenes/res/prefab/grass 0.prefab b/unity/Assets/Scenes/res/prefab/grass 0.prefab
new file mode 100644
index 0000000..2aa655e
--- /dev/null
+++ b/unity/Assets/Scenes/res/prefab/grass 0.prefab
@@ -0,0 +1,90 @@
+%YAML 1.1
+%TAG !u! tag:yousandi.cn,2023:
+--- !u!1 &7696693450942364149
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 7
+ m_Component:
+ - component: {fileID: 2179621281765118607}
+ - component: {fileID: 2299446734983394694}
+ m_Layer: 0
+ m_HasEditorInfo: 1
+ m_Name: grass 0
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!4 &2179621281765118607
+Transform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 7696693450942364149}
+ serializedVersion: 2
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: 2.046, y: 0, z: 0.521}
+ m_LocalScale: {x: 0.36089513, y: 0.36089513, z: 0.36089513}
+ m_ConstrainProportionsScale: 0
+ m_Children: []
+ m_Father: {fileID: 0}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!212 &2299446734983394694
+SpriteRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 7696693450942364149}
+ m_Enabled: 1
+ m_CastShadows: 1
+ m_ReceiveShadows: 1
+ m_DynamicOccludee: 1
+ m_StaticShadowCaster: 0
+ m_MotionVectors: 1
+ m_LightProbeUsage: 1
+ m_ReflectionProbeUsage: 1
+ m_RayTracingMode: 0
+ m_RayTraceProcedural: 0
+ m_virtualGeometry: 0
+ m_virtualGeometryShadow: 0
+ m_ShadingRate: 0
+ m_RenderingLayerMask: 1
+ m_RendererPriority: 0
+ m_Materials:
+ - {fileID: -876546973899608171, guid: be3236dea9f1e304da1a5e3a513dad5e, type: 3}
+ m_StaticBatchInfo:
+ firstSubMesh: 0
+ subMeshCount: 0
+ m_StaticBatchRoot: {fileID: 0}
+ m_ProbeAnchor: {fileID: 0}
+ m_LightProbeVolumeOverride: {fileID: 0}
+ m_ScaleInLightmap: 1
+ m_ReceiveGI: 1
+ m_PreserveUVs: 0
+ m_IgnoreNormalsForChartDetection: 0
+ m_ImportantGI: 0
+ m_StitchLightmapSeams: 1
+ m_SelectedEditorRenderState: 0
+ m_MinimumChartSize: 4
+ m_AutoUVMaxDistance: 0.5
+ m_AutoUVMaxAngle: 89
+ m_LightmapParameters: {fileID: 0}
+ m_SortingLayerID: 0
+ m_SortingLayer: 0
+ m_SortingOrder: 1
+ m_Sprite: {fileID: 21300000, guid: bba6a8e6c2a4a54489f9943c76d92bc2, type: 3}
+ m_Color: {r: 1, g: 1, b: 1, a: 1}
+ m_FlipX: 0
+ m_FlipY: 0
+ m_DrawMode: 0
+ m_Size: {x: 11.08, y: 8.65}
+ m_AdaptiveModeThreshold: 0.5
+ m_SpriteTileMode: 0
+ m_WasSpriteAssigned: 1
+ m_MaskInteraction: 0
+ m_SpriteSortPoint: 0
diff --git a/unity/Assets/Scenes/res/prefab/grass 0.prefab.meta b/unity/Assets/Scenes/res/prefab/grass 0.prefab.meta
new file mode 100644
index 0000000..07a21e8
--- /dev/null
+++ b/unity/Assets/Scenes/res/prefab/grass 0.prefab.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: Bi9Msij5UnlsrKHtyYxOFqM1M4x4x9pa942FO/dMti26rryEkqBFrug=
+PrefabImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/unity/Assets/Scenes/res/prefab/grass 1.prefab b/unity/Assets/Scenes/res/prefab/grass 1.prefab
new file mode 100644
index 0000000..667ccc6
--- /dev/null
+++ b/unity/Assets/Scenes/res/prefab/grass 1.prefab
@@ -0,0 +1,90 @@
+%YAML 1.1
+%TAG !u! tag:yousandi.cn,2023:
+--- !u!1 &1510783889440113631
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 7
+ m_Component:
+ - component: {fileID: 8589356904109289091}
+ - component: {fileID: 2426505977044019525}
+ m_Layer: 0
+ m_HasEditorInfo: 1
+ m_Name: grass 1
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!4 &8589356904109289091
+Transform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1510783889440113631}
+ serializedVersion: 2
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: 1.643, y: 0, z: -0.009}
+ m_LocalScale: {x: 0.36089513, y: 0.36089513, z: 0.36089513}
+ m_ConstrainProportionsScale: 0
+ m_Children: []
+ m_Father: {fileID: 0}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!212 &2426505977044019525
+SpriteRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1510783889440113631}
+ m_Enabled: 1
+ m_CastShadows: 1
+ m_ReceiveShadows: 1
+ m_DynamicOccludee: 1
+ m_StaticShadowCaster: 0
+ m_MotionVectors: 1
+ m_LightProbeUsage: 1
+ m_ReflectionProbeUsage: 1
+ m_RayTracingMode: 0
+ m_RayTraceProcedural: 0
+ m_virtualGeometry: 0
+ m_virtualGeometryShadow: 0
+ m_ShadingRate: 0
+ m_RenderingLayerMask: 1
+ m_RendererPriority: 0
+ m_Materials:
+ - {fileID: -876546973899608171, guid: be3236dea9f1e304da1a5e3a513dad5e, type: 3}
+ m_StaticBatchInfo:
+ firstSubMesh: 0
+ subMeshCount: 0
+ m_StaticBatchRoot: {fileID: 0}
+ m_ProbeAnchor: {fileID: 0}
+ m_LightProbeVolumeOverride: {fileID: 0}
+ m_ScaleInLightmap: 1
+ m_ReceiveGI: 1
+ m_PreserveUVs: 0
+ m_IgnoreNormalsForChartDetection: 0
+ m_ImportantGI: 0
+ m_StitchLightmapSeams: 1
+ m_SelectedEditorRenderState: 0
+ m_MinimumChartSize: 4
+ m_AutoUVMaxDistance: 0.5
+ m_AutoUVMaxAngle: 89
+ m_LightmapParameters: {fileID: 0}
+ m_SortingLayerID: 0
+ m_SortingLayer: 0
+ m_SortingOrder: 1
+ m_Sprite: {fileID: 21300000, guid: 12133eed98f4df042933673b1b98b8f7, type: 3}
+ m_Color: {r: 1, g: 1, b: 1, a: 1}
+ m_FlipX: 0
+ m_FlipY: 0
+ m_DrawMode: 0
+ m_Size: {x: 11.08, y: 8.65}
+ m_AdaptiveModeThreshold: 0.5
+ m_SpriteTileMode: 0
+ m_WasSpriteAssigned: 1
+ m_MaskInteraction: 0
+ m_SpriteSortPoint: 0
diff --git a/unity/Assets/Scenes/res/prefab/grass 1.prefab.meta b/unity/Assets/Scenes/res/prefab/grass 1.prefab.meta
new file mode 100644
index 0000000..ebc8ede
--- /dev/null
+++ b/unity/Assets/Scenes/res/prefab/grass 1.prefab.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: DX0esSz8Wn92G57zKkzOcvmWPiOWqT3uouNAxBGEdg3r0dEhc/PYJBA=
+PrefabImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/unity/Assets/Scenes/res/prefab/grass2.prefab b/unity/Assets/Scenes/res/prefab/grass2.prefab
new file mode 100644
index 0000000..135ddc4
--- /dev/null
+++ b/unity/Assets/Scenes/res/prefab/grass2.prefab
@@ -0,0 +1,90 @@
+%YAML 1.1
+%TAG !u! tag:yousandi.cn,2023:
+--- !u!1 &6924508940185839325
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 7
+ m_Component:
+ - component: {fileID: 435539791518907074}
+ - component: {fileID: 6437640950120722543}
+ m_Layer: 0
+ m_HasEditorInfo: 1
+ m_Name: grass2
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!4 &435539791518907074
+Transform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 6924508940185839325}
+ serializedVersion: 2
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: 0.974, y: 0, z: -1.832}
+ m_LocalScale: {x: 0.36089513, y: 0.36089513, z: 0.36089513}
+ m_ConstrainProportionsScale: 0
+ m_Children: []
+ m_Father: {fileID: 0}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!212 &6437640950120722543
+SpriteRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 6924508940185839325}
+ m_Enabled: 1
+ m_CastShadows: 1
+ m_ReceiveShadows: 1
+ m_DynamicOccludee: 1
+ m_StaticShadowCaster: 0
+ m_MotionVectors: 1
+ m_LightProbeUsage: 1
+ m_ReflectionProbeUsage: 1
+ m_RayTracingMode: 0
+ m_RayTraceProcedural: 0
+ m_virtualGeometry: 0
+ m_virtualGeometryShadow: 0
+ m_ShadingRate: 0
+ m_RenderingLayerMask: 1
+ m_RendererPriority: 0
+ m_Materials:
+ - {fileID: -876546973899608171, guid: be3236dea9f1e304da1a5e3a513dad5e, type: 3}
+ m_StaticBatchInfo:
+ firstSubMesh: 0
+ subMeshCount: 0
+ m_StaticBatchRoot: {fileID: 0}
+ m_ProbeAnchor: {fileID: 0}
+ m_LightProbeVolumeOverride: {fileID: 0}
+ m_ScaleInLightmap: 1
+ m_ReceiveGI: 1
+ m_PreserveUVs: 0
+ m_IgnoreNormalsForChartDetection: 0
+ m_ImportantGI: 0
+ m_StitchLightmapSeams: 1
+ m_SelectedEditorRenderState: 0
+ m_MinimumChartSize: 4
+ m_AutoUVMaxDistance: 0.5
+ m_AutoUVMaxAngle: 89
+ m_LightmapParameters: {fileID: 0}
+ m_SortingLayerID: 0
+ m_SortingLayer: 0
+ m_SortingOrder: 1
+ m_Sprite: {fileID: 21300000, guid: cf99a9d4aa5abf743a6768b519fabf93, type: 3}
+ m_Color: {r: 1, g: 1, b: 1, a: 1}
+ m_FlipX: 0
+ m_FlipY: 0
+ m_DrawMode: 0
+ m_Size: {x: 11.08, y: 8.65}
+ m_AdaptiveModeThreshold: 0.5
+ m_SpriteTileMode: 0
+ m_WasSpriteAssigned: 1
+ m_MaskInteraction: 0
+ m_SpriteSortPoint: 0
diff --git a/unity/Assets/Scenes/res/prefab/grass2.prefab.meta b/unity/Assets/Scenes/res/prefab/grass2.prefab.meta
new file mode 100644
index 0000000..f67a8e9
--- /dev/null
+++ b/unity/Assets/Scenes/res/prefab/grass2.prefab.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: Cn8WtiupB3kYduuzywH91q2Xp05rvyZew69R33ooKE8/X7EprQORHkk=
+PrefabImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/unity/Assets/Scenes/res/prefab/grass3.prefab b/unity/Assets/Scenes/res/prefab/grass3.prefab
new file mode 100644
index 0000000..79c570c
--- /dev/null
+++ b/unity/Assets/Scenes/res/prefab/grass3.prefab
@@ -0,0 +1,90 @@
+%YAML 1.1
+%TAG !u! tag:yousandi.cn,2023:
+--- !u!1 &3884524150454896205
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 7
+ m_Component:
+ - component: {fileID: 8378786473050541634}
+ - component: {fileID: 9137289115742074288}
+ m_Layer: 0
+ m_HasEditorInfo: 1
+ m_Name: grass3
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!4 &8378786473050541634
+Transform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 3884524150454896205}
+ serializedVersion: 2
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: 0.802, y: 0, z: -1.709}
+ m_LocalScale: {x: 0.36089513, y: 0.36089513, z: 0.36089513}
+ m_ConstrainProportionsScale: 0
+ m_Children: []
+ m_Father: {fileID: 0}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!212 &9137289115742074288
+SpriteRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 3884524150454896205}
+ m_Enabled: 1
+ m_CastShadows: 1
+ m_ReceiveShadows: 1
+ m_DynamicOccludee: 1
+ m_StaticShadowCaster: 0
+ m_MotionVectors: 1
+ m_LightProbeUsage: 1
+ m_ReflectionProbeUsage: 1
+ m_RayTracingMode: 0
+ m_RayTraceProcedural: 0
+ m_virtualGeometry: 0
+ m_virtualGeometryShadow: 0
+ m_ShadingRate: 0
+ m_RenderingLayerMask: 1
+ m_RendererPriority: 0
+ m_Materials:
+ - {fileID: -876546973899608171, guid: be3236dea9f1e304da1a5e3a513dad5e, type: 3}
+ m_StaticBatchInfo:
+ firstSubMesh: 0
+ subMeshCount: 0
+ m_StaticBatchRoot: {fileID: 0}
+ m_ProbeAnchor: {fileID: 0}
+ m_LightProbeVolumeOverride: {fileID: 0}
+ m_ScaleInLightmap: 1
+ m_ReceiveGI: 1
+ m_PreserveUVs: 0
+ m_IgnoreNormalsForChartDetection: 0
+ m_ImportantGI: 0
+ m_StitchLightmapSeams: 1
+ m_SelectedEditorRenderState: 0
+ m_MinimumChartSize: 4
+ m_AutoUVMaxDistance: 0.5
+ m_AutoUVMaxAngle: 89
+ m_LightmapParameters: {fileID: 0}
+ m_SortingLayerID: 0
+ m_SortingLayer: 0
+ m_SortingOrder: 1
+ m_Sprite: {fileID: 21300000, guid: d2289c47948a3cc40bd1d82676391b50, type: 3}
+ m_Color: {r: 1, g: 1, b: 1, a: 1}
+ m_FlipX: 0
+ m_FlipY: 0
+ m_DrawMode: 0
+ m_Size: {x: 11.08, y: 8.65}
+ m_AdaptiveModeThreshold: 0.5
+ m_SpriteTileMode: 0
+ m_WasSpriteAssigned: 1
+ m_MaskInteraction: 0
+ m_SpriteSortPoint: 0
diff --git a/unity/Assets/Scenes/res/prefab/grass3.prefab.meta b/unity/Assets/Scenes/res/prefab/grass3.prefab.meta
new file mode 100644
index 0000000..bc51593
--- /dev/null
+++ b/unity/Assets/Scenes/res/prefab/grass3.prefab.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: XXlOtCiuBnjUdt2Kq9ZG4cNopaJFFndOZoqsAG2cTHjvaoYzVK3sRf4=
+PrefabImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/unity/Assets/Scenes/res/prefab/groot1.prefab b/unity/Assets/Scenes/res/prefab/groot1.prefab
new file mode 100644
index 0000000..833d705
--- /dev/null
+++ b/unity/Assets/Scenes/res/prefab/groot1.prefab
@@ -0,0 +1,90 @@
+%YAML 1.1
+%TAG !u! tag:yousandi.cn,2023:
+--- !u!1 &5235044032515574243
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 7
+ m_Component:
+ - component: {fileID: 4188864920815214323}
+ - component: {fileID: 5581557466916058413}
+ m_Layer: 0
+ m_HasEditorInfo: 1
+ m_Name: groot1
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!4 &4188864920815214323
+Transform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 5235044032515574243}
+ serializedVersion: 2
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: -3.1, y: 0, z: 1.23}
+ m_LocalScale: {x: 0.36089513, y: 0.36089513, z: 0.36089513}
+ m_ConstrainProportionsScale: 0
+ m_Children: []
+ m_Father: {fileID: 0}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!212 &5581557466916058413
+SpriteRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 5235044032515574243}
+ m_Enabled: 1
+ m_CastShadows: 1
+ m_ReceiveShadows: 1
+ m_DynamicOccludee: 1
+ m_StaticShadowCaster: 0
+ m_MotionVectors: 1
+ m_LightProbeUsage: 1
+ m_ReflectionProbeUsage: 1
+ m_RayTracingMode: 0
+ m_RayTraceProcedural: 0
+ m_virtualGeometry: 0
+ m_virtualGeometryShadow: 0
+ m_ShadingRate: 0
+ m_RenderingLayerMask: 1
+ m_RendererPriority: 0
+ m_Materials:
+ - {fileID: -876546973899608171, guid: be3236dea9f1e304da1a5e3a513dad5e, type: 3}
+ m_StaticBatchInfo:
+ firstSubMesh: 0
+ subMeshCount: 0
+ m_StaticBatchRoot: {fileID: 0}
+ m_ProbeAnchor: {fileID: 0}
+ m_LightProbeVolumeOverride: {fileID: 0}
+ m_ScaleInLightmap: 1
+ m_ReceiveGI: 1
+ m_PreserveUVs: 0
+ m_IgnoreNormalsForChartDetection: 0
+ m_ImportantGI: 0
+ m_StitchLightmapSeams: 1
+ m_SelectedEditorRenderState: 0
+ m_MinimumChartSize: 4
+ m_AutoUVMaxDistance: 0.5
+ m_AutoUVMaxAngle: 89
+ m_LightmapParameters: {fileID: 0}
+ m_SortingLayerID: 0
+ m_SortingLayer: 0
+ m_SortingOrder: 1
+ m_Sprite: {fileID: 21300000, guid: 43377e9070bef8a4bb51f528b32fb376, type: 3}
+ m_Color: {r: 1, g: 1, b: 1, a: 1}
+ m_FlipX: 0
+ m_FlipY: 0
+ m_DrawMode: 0
+ m_Size: {x: 11.08, y: 8.65}
+ m_AdaptiveModeThreshold: 0.5
+ m_SpriteTileMode: 0
+ m_WasSpriteAssigned: 1
+ m_MaskInteraction: 0
+ m_SpriteSortPoint: 0
diff --git a/unity/Assets/Scenes/res/prefab/groot1.prefab.meta b/unity/Assets/Scenes/res/prefab/groot1.prefab.meta
new file mode 100644
index 0000000..12d7e10
--- /dev/null
+++ b/unity/Assets/Scenes/res/prefab/groot1.prefab.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: WXIYsSOtUXjXAaHFQ7ef/JHXV6tY3bPTuivlhSOoSz1FW2WcND64A30=
+PrefabImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/unity/Assets/Scenes/res/prefab/mountain1.prefab b/unity/Assets/Scenes/res/prefab/mountain1.prefab
new file mode 100644
index 0000000..2f98561
--- /dev/null
+++ b/unity/Assets/Scenes/res/prefab/mountain1.prefab
@@ -0,0 +1,90 @@
+%YAML 1.1
+%TAG !u! tag:yousandi.cn,2023:
+--- !u!1 &8380685078329305787
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 7
+ m_Component:
+ - component: {fileID: 7809526185620434870}
+ - component: {fileID: 7721999489890687923}
+ m_Layer: 0
+ m_HasEditorInfo: 1
+ m_Name: mountain1
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!4 &7809526185620434870
+Transform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 8380685078329305787}
+ serializedVersion: 2
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: 5.84, y: -0.95, z: 8.9}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_ConstrainProportionsScale: 0
+ m_Children: []
+ m_Father: {fileID: 0}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!212 &7721999489890687923
+SpriteRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 8380685078329305787}
+ m_Enabled: 1
+ m_CastShadows: 1
+ m_ReceiveShadows: 1
+ m_DynamicOccludee: 1
+ m_StaticShadowCaster: 0
+ m_MotionVectors: 1
+ m_LightProbeUsage: 1
+ m_ReflectionProbeUsage: 1
+ m_RayTracingMode: 0
+ m_RayTraceProcedural: 0
+ m_virtualGeometry: 0
+ m_virtualGeometryShadow: 0
+ m_ShadingRate: 0
+ m_RenderingLayerMask: 1
+ m_RendererPriority: 0
+ m_Materials:
+ - {fileID: -876546973899608171, guid: be3236dea9f1e304da1a5e3a513dad5e, type: 3}
+ m_StaticBatchInfo:
+ firstSubMesh: 0
+ subMeshCount: 0
+ m_StaticBatchRoot: {fileID: 0}
+ m_ProbeAnchor: {fileID: 0}
+ m_LightProbeVolumeOverride: {fileID: 0}
+ m_ScaleInLightmap: 1
+ m_ReceiveGI: 1
+ m_PreserveUVs: 0
+ m_IgnoreNormalsForChartDetection: 0
+ m_ImportantGI: 0
+ m_StitchLightmapSeams: 1
+ m_SelectedEditorRenderState: 0
+ m_MinimumChartSize: 4
+ m_AutoUVMaxDistance: 0.5
+ m_AutoUVMaxAngle: 89
+ m_LightmapParameters: {fileID: 0}
+ m_SortingLayerID: 0
+ m_SortingLayer: 0
+ m_SortingOrder: 1
+ m_Sprite: {fileID: 21300000, guid: 5f3da9f816344bb41a1366586c516f97, type: 3}
+ m_Color: {r: 1, g: 1, b: 1, a: 1}
+ m_FlipX: 0
+ m_FlipY: 0
+ m_DrawMode: 0
+ m_Size: {x: 11.08, y: 8.65}
+ m_AdaptiveModeThreshold: 0.5
+ m_SpriteTileMode: 0
+ m_WasSpriteAssigned: 1
+ m_MaskInteraction: 0
+ m_SpriteSortPoint: 0
diff --git a/unity/Assets/Scenes/res/prefab/mountain1.prefab.meta b/unity/Assets/Scenes/res/prefab/mountain1.prefab.meta
new file mode 100644
index 0000000..0cbdaf5
--- /dev/null
+++ b/unity/Assets/Scenes/res/prefab/mountain1.prefab.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: W31JsCysVihFgFK5jyXWRE/xZLJa4gCpAgdH6z7Go00MluiAQrZFbkI=
+PrefabImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/unity/Assets/Scenes/res/prefab/stone1.prefab b/unity/Assets/Scenes/res/prefab/stone1.prefab
new file mode 100644
index 0000000..8e9caaa
--- /dev/null
+++ b/unity/Assets/Scenes/res/prefab/stone1.prefab
@@ -0,0 +1,90 @@
+%YAML 1.1
+%TAG !u! tag:yousandi.cn,2023:
+--- !u!1 &3476531265109908029
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 7
+ m_Component:
+ - component: {fileID: 8166008526582623248}
+ - component: {fileID: 1965066501711944565}
+ m_Layer: 0
+ m_HasEditorInfo: 1
+ m_Name: stone1
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!4 &8166008526582623248
+Transform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 3476531265109908029}
+ serializedVersion: 2
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: 3.08, y: 0, z: 1.1}
+ m_LocalScale: {x: 0.57574, y: 0.57574, z: 0.57574}
+ m_ConstrainProportionsScale: 0
+ m_Children: []
+ m_Father: {fileID: 0}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!212 &1965066501711944565
+SpriteRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 3476531265109908029}
+ m_Enabled: 1
+ m_CastShadows: 1
+ m_ReceiveShadows: 1
+ m_DynamicOccludee: 1
+ m_StaticShadowCaster: 0
+ m_MotionVectors: 1
+ m_LightProbeUsage: 1
+ m_ReflectionProbeUsage: 1
+ m_RayTracingMode: 0
+ m_RayTraceProcedural: 0
+ m_virtualGeometry: 0
+ m_virtualGeometryShadow: 0
+ m_ShadingRate: 0
+ m_RenderingLayerMask: 1
+ m_RendererPriority: 0
+ m_Materials:
+ - {fileID: -876546973899608171, guid: be3236dea9f1e304da1a5e3a513dad5e, type: 3}
+ m_StaticBatchInfo:
+ firstSubMesh: 0
+ subMeshCount: 0
+ m_StaticBatchRoot: {fileID: 0}
+ m_ProbeAnchor: {fileID: 0}
+ m_LightProbeVolumeOverride: {fileID: 0}
+ m_ScaleInLightmap: 1
+ m_ReceiveGI: 1
+ m_PreserveUVs: 0
+ m_IgnoreNormalsForChartDetection: 0
+ m_ImportantGI: 0
+ m_StitchLightmapSeams: 1
+ m_SelectedEditorRenderState: 0
+ m_MinimumChartSize: 4
+ m_AutoUVMaxDistance: 0.5
+ m_AutoUVMaxAngle: 89
+ m_LightmapParameters: {fileID: 0}
+ m_SortingLayerID: 0
+ m_SortingLayer: 0
+ m_SortingOrder: 1
+ m_Sprite: {fileID: 21300000, guid: a2f5182c11de6794b961bc286acd72ea, type: 3}
+ m_Color: {r: 1, g: 1, b: 1, a: 1}
+ m_FlipX: 0
+ m_FlipY: 0
+ m_DrawMode: 0
+ m_Size: {x: 11.08, y: 8.65}
+ m_AdaptiveModeThreshold: 0.5
+ m_SpriteTileMode: 0
+ m_WasSpriteAssigned: 1
+ m_MaskInteraction: 0
+ m_SpriteSortPoint: 0
diff --git a/unity/Assets/Scenes/res/prefab/stone1.prefab.meta b/unity/Assets/Scenes/res/prefab/stone1.prefab.meta
new file mode 100644
index 0000000..5ce2c25
--- /dev/null
+++ b/unity/Assets/Scenes/res/prefab/stone1.prefab.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: CHlOt3ukWi1i6kJsvgqH5VVjwcSKCJ7+MvoEkM80VGyPui6NZj2OocQ=
+PrefabImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/unity/Assets/Scenes/res/prefab/stone2.prefab b/unity/Assets/Scenes/res/prefab/stone2.prefab
new file mode 100644
index 0000000..7cb8141
--- /dev/null
+++ b/unity/Assets/Scenes/res/prefab/stone2.prefab
@@ -0,0 +1,90 @@
+%YAML 1.1
+%TAG !u! tag:yousandi.cn,2023:
+--- !u!1 &1351762661552244276
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 7
+ m_Component:
+ - component: {fileID: 2950027222865506266}
+ - component: {fileID: 1839005253012669546}
+ m_Layer: 0
+ m_HasEditorInfo: 1
+ m_Name: stone2
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!4 &2950027222865506266
+Transform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1351762661552244276}
+ serializedVersion: 2
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: 3.98, y: 0, z: 0.67}
+ m_LocalScale: {x: 0.66412, y: 0.66412, z: 0.66412}
+ m_ConstrainProportionsScale: 0
+ m_Children: []
+ m_Father: {fileID: 0}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!212 &1839005253012669546
+SpriteRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1351762661552244276}
+ m_Enabled: 1
+ m_CastShadows: 1
+ m_ReceiveShadows: 1
+ m_DynamicOccludee: 1
+ m_StaticShadowCaster: 0
+ m_MotionVectors: 1
+ m_LightProbeUsage: 1
+ m_ReflectionProbeUsage: 1
+ m_RayTracingMode: 0
+ m_RayTraceProcedural: 0
+ m_virtualGeometry: 0
+ m_virtualGeometryShadow: 0
+ m_ShadingRate: 0
+ m_RenderingLayerMask: 1
+ m_RendererPriority: 0
+ m_Materials:
+ - {fileID: -876546973899608171, guid: be3236dea9f1e304da1a5e3a513dad5e, type: 3}
+ m_StaticBatchInfo:
+ firstSubMesh: 0
+ subMeshCount: 0
+ m_StaticBatchRoot: {fileID: 0}
+ m_ProbeAnchor: {fileID: 0}
+ m_LightProbeVolumeOverride: {fileID: 0}
+ m_ScaleInLightmap: 1
+ m_ReceiveGI: 1
+ m_PreserveUVs: 0
+ m_IgnoreNormalsForChartDetection: 0
+ m_ImportantGI: 0
+ m_StitchLightmapSeams: 1
+ m_SelectedEditorRenderState: 0
+ m_MinimumChartSize: 4
+ m_AutoUVMaxDistance: 0.5
+ m_AutoUVMaxAngle: 89
+ m_LightmapParameters: {fileID: 0}
+ m_SortingLayerID: 0
+ m_SortingLayer: 0
+ m_SortingOrder: 1
+ m_Sprite: {fileID: 21300000, guid: 1c03c20b38891724eba7b9a59b31ad8c, type: 3}
+ m_Color: {r: 1, g: 1, b: 1, a: 1}
+ m_FlipX: 0
+ m_FlipY: 0
+ m_DrawMode: 0
+ m_Size: {x: 11.08, y: 8.65}
+ m_AdaptiveModeThreshold: 0.5
+ m_SpriteTileMode: 0
+ m_WasSpriteAssigned: 1
+ m_MaskInteraction: 0
+ m_SpriteSortPoint: 0
diff --git a/unity/Assets/Scenes/res/prefab/stone2.prefab.meta b/unity/Assets/Scenes/res/prefab/stone2.prefab.meta
new file mode 100644
index 0000000..8abb0b4
--- /dev/null
+++ b/unity/Assets/Scenes/res/prefab/stone2.prefab.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: WikevXj5Vn9xvQufSaZH5Z80mYUa9Cod7NVPuCd/TrDP0IKRZcaspsY=
+PrefabImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/unity/Assets/Scenes/res/prefab/stone3.prefab b/unity/Assets/Scenes/res/prefab/stone3.prefab
new file mode 100644
index 0000000..3ea17e3
--- /dev/null
+++ b/unity/Assets/Scenes/res/prefab/stone3.prefab
@@ -0,0 +1,90 @@
+%YAML 1.1
+%TAG !u! tag:yousandi.cn,2023:
+--- !u!1 &4554480444341205620
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 7
+ m_Component:
+ - component: {fileID: 5814446477050245766}
+ - component: {fileID: 2822249517256151664}
+ m_Layer: 0
+ m_HasEditorInfo: 1
+ m_Name: stone3
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!4 &5814446477050245766
+Transform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 4554480444341205620}
+ serializedVersion: 2
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: 3.08, y: 0, z: 3.68}
+ m_LocalScale: {x: 0.39253953, y: 0.39253953, z: 0.39253953}
+ m_ConstrainProportionsScale: 0
+ m_Children: []
+ m_Father: {fileID: 0}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!212 &2822249517256151664
+SpriteRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 4554480444341205620}
+ m_Enabled: 1
+ m_CastShadows: 1
+ m_ReceiveShadows: 1
+ m_DynamicOccludee: 1
+ m_StaticShadowCaster: 0
+ m_MotionVectors: 1
+ m_LightProbeUsage: 1
+ m_ReflectionProbeUsage: 1
+ m_RayTracingMode: 0
+ m_RayTraceProcedural: 0
+ m_virtualGeometry: 0
+ m_virtualGeometryShadow: 0
+ m_ShadingRate: 0
+ m_RenderingLayerMask: 1
+ m_RendererPriority: 0
+ m_Materials:
+ - {fileID: -876546973899608171, guid: be3236dea9f1e304da1a5e3a513dad5e, type: 3}
+ m_StaticBatchInfo:
+ firstSubMesh: 0
+ subMeshCount: 0
+ m_StaticBatchRoot: {fileID: 0}
+ m_ProbeAnchor: {fileID: 0}
+ m_LightProbeVolumeOverride: {fileID: 0}
+ m_ScaleInLightmap: 1
+ m_ReceiveGI: 1
+ m_PreserveUVs: 0
+ m_IgnoreNormalsForChartDetection: 0
+ m_ImportantGI: 0
+ m_StitchLightmapSeams: 1
+ m_SelectedEditorRenderState: 0
+ m_MinimumChartSize: 4
+ m_AutoUVMaxDistance: 0.5
+ m_AutoUVMaxAngle: 89
+ m_LightmapParameters: {fileID: 0}
+ m_SortingLayerID: 0
+ m_SortingLayer: 0
+ m_SortingOrder: 1
+ m_Sprite: {fileID: 21300000, guid: a2f5182c11de6794b961bc286acd72ea, type: 3}
+ m_Color: {r: 1, g: 1, b: 1, a: 1}
+ m_FlipX: 0
+ m_FlipY: 0
+ m_DrawMode: 0
+ m_Size: {x: 11.08, y: 8.65}
+ m_AdaptiveModeThreshold: 0.5
+ m_SpriteTileMode: 0
+ m_WasSpriteAssigned: 1
+ m_MaskInteraction: 0
+ m_SpriteSortPoint: 0
diff --git a/unity/Assets/Scenes/res/prefab/stone3.prefab.meta b/unity/Assets/Scenes/res/prefab/stone3.prefab.meta
new file mode 100644
index 0000000..e6ea503
--- /dev/null
+++ b/unity/Assets/Scenes/res/prefab/stone3.prefab.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: WXxNtH6rWy6/ov/uwUznhAFa8hntVi0B0G/lsk+Vo9oNpzLPCtLNF5I=
+PrefabImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/unity/Assets/Scenes/res/prefab/tree1.prefab b/unity/Assets/Scenes/res/prefab/tree1.prefab
new file mode 100644
index 0000000..300acfb
--- /dev/null
+++ b/unity/Assets/Scenes/res/prefab/tree1.prefab
@@ -0,0 +1,90 @@
+%YAML 1.1
+%TAG !u! tag:yousandi.cn,2023:
+--- !u!1 &9005524927436853576
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 7
+ m_Component:
+ - component: {fileID: 9074184311345145535}
+ - component: {fileID: 8365800432407204401}
+ m_Layer: 0
+ m_HasEditorInfo: 1
+ m_Name: tree1
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!4 &9074184311345145535
+Transform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 9005524927436853576}
+ serializedVersion: 2
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: 5.66, y: -0.86, z: 2.95}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_ConstrainProportionsScale: 0
+ m_Children: []
+ m_Father: {fileID: 0}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!212 &8365800432407204401
+SpriteRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 9005524927436853576}
+ m_Enabled: 1
+ m_CastShadows: 1
+ m_ReceiveShadows: 1
+ m_DynamicOccludee: 1
+ m_StaticShadowCaster: 0
+ m_MotionVectors: 1
+ m_LightProbeUsage: 1
+ m_ReflectionProbeUsage: 1
+ m_RayTracingMode: 0
+ m_RayTraceProcedural: 0
+ m_virtualGeometry: 0
+ m_virtualGeometryShadow: 0
+ m_ShadingRate: 0
+ m_RenderingLayerMask: 1
+ m_RendererPriority: 0
+ m_Materials:
+ - {fileID: -876546973899608171, guid: be3236dea9f1e304da1a5e3a513dad5e, type: 3}
+ m_StaticBatchInfo:
+ firstSubMesh: 0
+ subMeshCount: 0
+ m_StaticBatchRoot: {fileID: 0}
+ m_ProbeAnchor: {fileID: 0}
+ m_LightProbeVolumeOverride: {fileID: 0}
+ m_ScaleInLightmap: 1
+ m_ReceiveGI: 1
+ m_PreserveUVs: 0
+ m_IgnoreNormalsForChartDetection: 0
+ m_ImportantGI: 0
+ m_StitchLightmapSeams: 1
+ m_SelectedEditorRenderState: 0
+ m_MinimumChartSize: 4
+ m_AutoUVMaxDistance: 0.5
+ m_AutoUVMaxAngle: 89
+ m_LightmapParameters: {fileID: 0}
+ m_SortingLayerID: 0
+ m_SortingLayer: 0
+ m_SortingOrder: 1
+ m_Sprite: {fileID: 21300000, guid: 9e86f261a1e9198449b0ab7510a5eb98, type: 3}
+ m_Color: {r: 1, g: 1, b: 1, a: 1}
+ m_FlipX: 0
+ m_FlipY: 0
+ m_DrawMode: 0
+ m_Size: {x: 11.08, y: 8.65}
+ m_AdaptiveModeThreshold: 0.5
+ m_SpriteTileMode: 0
+ m_WasSpriteAssigned: 1
+ m_MaskInteraction: 0
+ m_SpriteSortPoint: 0
diff --git a/unity/Assets/Scenes/res/prefab/tree1.prefab.meta b/unity/Assets/Scenes/res/prefab/tree1.prefab.meta
new file mode 100644
index 0000000..7a7bd73
--- /dev/null
+++ b/unity/Assets/Scenes/res/prefab/tree1.prefab.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: DXwb5i3+Bi/v9kopbapp7g55EdSJXiTL5vNT+w8rBwVb/fKTAht/y1g=
+PrefabImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/unity/Assets/Scenes/res/prefab/tree2.prefab b/unity/Assets/Scenes/res/prefab/tree2.prefab
new file mode 100644
index 0000000..a5c9458
--- /dev/null
+++ b/unity/Assets/Scenes/res/prefab/tree2.prefab
@@ -0,0 +1,90 @@
+%YAML 1.1
+%TAG !u! tag:yousandi.cn,2023:
+--- !u!1 &4559668664270299361
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 7
+ m_Component:
+ - component: {fileID: 227561119319166384}
+ - component: {fileID: 7487127873520759700}
+ m_Layer: 0
+ m_HasEditorInfo: 1
+ m_Name: tree2
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!4 &227561119319166384
+Transform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 4559668664270299361}
+ serializedVersion: 2
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: 3.93, y: 0, z: 4.97}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_ConstrainProportionsScale: 0
+ m_Children: []
+ m_Father: {fileID: 0}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!212 &7487127873520759700
+SpriteRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 4559668664270299361}
+ m_Enabled: 1
+ m_CastShadows: 1
+ m_ReceiveShadows: 1
+ m_DynamicOccludee: 1
+ m_StaticShadowCaster: 0
+ m_MotionVectors: 1
+ m_LightProbeUsage: 1
+ m_ReflectionProbeUsage: 1
+ m_RayTracingMode: 0
+ m_RayTraceProcedural: 0
+ m_virtualGeometry: 0
+ m_virtualGeometryShadow: 0
+ m_ShadingRate: 0
+ m_RenderingLayerMask: 1
+ m_RendererPriority: 0
+ m_Materials:
+ - {fileID: -876546973899608171, guid: be3236dea9f1e304da1a5e3a513dad5e, type: 3}
+ m_StaticBatchInfo:
+ firstSubMesh: 0
+ subMeshCount: 0
+ m_StaticBatchRoot: {fileID: 0}
+ m_ProbeAnchor: {fileID: 0}
+ m_LightProbeVolumeOverride: {fileID: 0}
+ m_ScaleInLightmap: 1
+ m_ReceiveGI: 1
+ m_PreserveUVs: 0
+ m_IgnoreNormalsForChartDetection: 0
+ m_ImportantGI: 0
+ m_StitchLightmapSeams: 1
+ m_SelectedEditorRenderState: 0
+ m_MinimumChartSize: 4
+ m_AutoUVMaxDistance: 0.5
+ m_AutoUVMaxAngle: 89
+ m_LightmapParameters: {fileID: 0}
+ m_SortingLayerID: 0
+ m_SortingLayer: 0
+ m_SortingOrder: 1
+ m_Sprite: {fileID: 21300000, guid: 0f2c9d2b1f1f3c04791839fee7a95be6, type: 3}
+ m_Color: {r: 1, g: 1, b: 1, a: 1}
+ m_FlipX: 0
+ m_FlipY: 0
+ m_DrawMode: 0
+ m_Size: {x: 11.08, y: 8.65}
+ m_AdaptiveModeThreshold: 0.5
+ m_SpriteTileMode: 0
+ m_WasSpriteAssigned: 1
+ m_MaskInteraction: 0
+ m_SpriteSortPoint: 0
diff --git a/unity/Assets/Scenes/res/prefab/tree2.prefab.meta b/unity/Assets/Scenes/res/prefab/tree2.prefab.meta
new file mode 100644
index 0000000..9711857
--- /dev/null
+++ b/unity/Assets/Scenes/res/prefab/tree2.prefab.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: Dn0YvCupB3MS7FhUUSq2K/TYQAAjUW5xKHvqeV8wuYDeMX0GWEV+nZw=
+PrefabImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/unity/Assets/Scenes/res/prefab/tree3.prefab b/unity/Assets/Scenes/res/prefab/tree3.prefab
new file mode 100644
index 0000000..f73277f
--- /dev/null
+++ b/unity/Assets/Scenes/res/prefab/tree3.prefab
@@ -0,0 +1,90 @@
+%YAML 1.1
+%TAG !u! tag:yousandi.cn,2023:
+--- !u!1 &3595608659461799050
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 7
+ m_Component:
+ - component: {fileID: 3692847375105459094}
+ - component: {fileID: 4817636465103828906}
+ m_Layer: 0
+ m_HasEditorInfo: 1
+ m_Name: tree3
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!4 &3692847375105459094
+Transform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 3595608659461799050}
+ serializedVersion: 2
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: 7.21, y: 0, z: -2.8}
+ m_LocalScale: {x: 1.0488987, y: 1.0488987, z: 1.0488987}
+ m_ConstrainProportionsScale: 0
+ m_Children: []
+ m_Father: {fileID: 0}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!212 &4817636465103828906
+SpriteRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 3595608659461799050}
+ m_Enabled: 1
+ m_CastShadows: 1
+ m_ReceiveShadows: 1
+ m_DynamicOccludee: 1
+ m_StaticShadowCaster: 0
+ m_MotionVectors: 1
+ m_LightProbeUsage: 1
+ m_ReflectionProbeUsage: 1
+ m_RayTracingMode: 0
+ m_RayTraceProcedural: 0
+ m_virtualGeometry: 0
+ m_virtualGeometryShadow: 0
+ m_ShadingRate: 0
+ m_RenderingLayerMask: 1
+ m_RendererPriority: 0
+ m_Materials:
+ - {fileID: -876546973899608171, guid: be3236dea9f1e304da1a5e3a513dad5e, type: 3}
+ m_StaticBatchInfo:
+ firstSubMesh: 0
+ subMeshCount: 0
+ m_StaticBatchRoot: {fileID: 0}
+ m_ProbeAnchor: {fileID: 0}
+ m_LightProbeVolumeOverride: {fileID: 0}
+ m_ScaleInLightmap: 1
+ m_ReceiveGI: 1
+ m_PreserveUVs: 0
+ m_IgnoreNormalsForChartDetection: 0
+ m_ImportantGI: 0
+ m_StitchLightmapSeams: 1
+ m_SelectedEditorRenderState: 0
+ m_MinimumChartSize: 4
+ m_AutoUVMaxDistance: 0.5
+ m_AutoUVMaxAngle: 89
+ m_LightmapParameters: {fileID: 0}
+ m_SortingLayerID: 0
+ m_SortingLayer: 0
+ m_SortingOrder: 1
+ m_Sprite: {fileID: 21300000, guid: 86763528f1ce12e4d8fffe200c928982, type: 3}
+ m_Color: {r: 1, g: 1, b: 1, a: 1}
+ m_FlipX: 0
+ m_FlipY: 0
+ m_DrawMode: 0
+ m_Size: {x: 11.08, y: 8.65}
+ m_AdaptiveModeThreshold: 0.5
+ m_SpriteTileMode: 0
+ m_WasSpriteAssigned: 1
+ m_MaskInteraction: 0
+ m_SpriteSortPoint: 0
diff --git a/unity/Assets/Scenes/res/prefab/tree3.prefab.meta b/unity/Assets/Scenes/res/prefab/tree3.prefab.meta
new file mode 100644
index 0000000..7643791
--- /dev/null
+++ b/unity/Assets/Scenes/res/prefab/tree3.prefab.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: WXtOt377BSmGl6EfFqJZGIX7ZfLEELU2wPAKDsY2W8ZEdwriWWMrbSk=
+PrefabImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/unity/Assets/Scenes/res/prefab/tree4.prefab b/unity/Assets/Scenes/res/prefab/tree4.prefab
new file mode 100644
index 0000000..15c0532
--- /dev/null
+++ b/unity/Assets/Scenes/res/prefab/tree4.prefab
@@ -0,0 +1,90 @@
+%YAML 1.1
+%TAG !u! tag:yousandi.cn,2023:
+--- !u!1 &3199746496630800269
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 7
+ m_Component:
+ - component: {fileID: 7680868130656722617}
+ - component: {fileID: 4350344337643160049}
+ m_Layer: 0
+ m_HasEditorInfo: 1
+ m_Name: tree4
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!4 &7680868130656722617
+Transform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 3199746496630800269}
+ serializedVersion: 2
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: -3.26, y: -0.72, z: 3.7}
+ m_LocalScale: {x: 1.3033524, y: 1.3033524, z: 1.3033524}
+ m_ConstrainProportionsScale: 0
+ m_Children: []
+ m_Father: {fileID: 0}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!212 &4350344337643160049
+SpriteRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 3199746496630800269}
+ m_Enabled: 1
+ m_CastShadows: 1
+ m_ReceiveShadows: 1
+ m_DynamicOccludee: 1
+ m_StaticShadowCaster: 0
+ m_MotionVectors: 1
+ m_LightProbeUsage: 1
+ m_ReflectionProbeUsage: 1
+ m_RayTracingMode: 0
+ m_RayTraceProcedural: 0
+ m_virtualGeometry: 0
+ m_virtualGeometryShadow: 0
+ m_ShadingRate: 0
+ m_RenderingLayerMask: 1
+ m_RendererPriority: 0
+ m_Materials:
+ - {fileID: -876546973899608171, guid: be3236dea9f1e304da1a5e3a513dad5e, type: 3}
+ m_StaticBatchInfo:
+ firstSubMesh: 0
+ subMeshCount: 0
+ m_StaticBatchRoot: {fileID: 0}
+ m_ProbeAnchor: {fileID: 0}
+ m_LightProbeVolumeOverride: {fileID: 0}
+ m_ScaleInLightmap: 1
+ m_ReceiveGI: 1
+ m_PreserveUVs: 0
+ m_IgnoreNormalsForChartDetection: 0
+ m_ImportantGI: 0
+ m_StitchLightmapSeams: 1
+ m_SelectedEditorRenderState: 0
+ m_MinimumChartSize: 4
+ m_AutoUVMaxDistance: 0.5
+ m_AutoUVMaxAngle: 89
+ m_LightmapParameters: {fileID: 0}
+ m_SortingLayerID: 0
+ m_SortingLayer: 0
+ m_SortingOrder: 1
+ m_Sprite: {fileID: 21300000, guid: 233c1d1ca8a53fb4695d9142fd8b1b64, type: 3}
+ m_Color: {r: 1, g: 1, b: 1, a: 1}
+ m_FlipX: 0
+ m_FlipY: 0
+ m_DrawMode: 0
+ m_Size: {x: 11.08, y: 8.65}
+ m_AdaptiveModeThreshold: 0.5
+ m_SpriteTileMode: 0
+ m_WasSpriteAssigned: 1
+ m_MaskInteraction: 0
+ m_SpriteSortPoint: 0
diff --git a/unity/Assets/Scenes/res/prefab/tree4.prefab.meta b/unity/Assets/Scenes/res/prefab/tree4.prefab.meta
new file mode 100644
index 0000000..774f7ba
--- /dev/null
+++ b/unity/Assets/Scenes/res/prefab/tree4.prefab.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: XH1NvCqpU3+Os7ABtsScSxsy0BfiXHNqjP3w6Mr6NtMEc3QEopEPex0=
+PrefabImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/unity/Assets/Scenes/res/prefab/tree5.prefab b/unity/Assets/Scenes/res/prefab/tree5.prefab
new file mode 100644
index 0000000..d0cbfd5
--- /dev/null
+++ b/unity/Assets/Scenes/res/prefab/tree5.prefab
@@ -0,0 +1,90 @@
+%YAML 1.1
+%TAG !u! tag:yousandi.cn,2023:
+--- !u!1 &844430968537636174
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 7
+ m_Component:
+ - component: {fileID: 190315813515404266}
+ - component: {fileID: 1216488727028827506}
+ m_Layer: 0
+ m_HasEditorInfo: 1
+ m_Name: tree5
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!4 &190315813515404266
+Transform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 844430968537636174}
+ serializedVersion: 2
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: -8.08, y: -1.02, z: -1.73}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_ConstrainProportionsScale: 0
+ m_Children: []
+ m_Father: {fileID: 0}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!212 &1216488727028827506
+SpriteRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 844430968537636174}
+ m_Enabled: 1
+ m_CastShadows: 1
+ m_ReceiveShadows: 1
+ m_DynamicOccludee: 1
+ m_StaticShadowCaster: 0
+ m_MotionVectors: 1
+ m_LightProbeUsage: 1
+ m_ReflectionProbeUsage: 1
+ m_RayTracingMode: 0
+ m_RayTraceProcedural: 0
+ m_virtualGeometry: 0
+ m_virtualGeometryShadow: 0
+ m_ShadingRate: 0
+ m_RenderingLayerMask: 1
+ m_RendererPriority: 0
+ m_Materials:
+ - {fileID: -876546973899608171, guid: be3236dea9f1e304da1a5e3a513dad5e, type: 3}
+ m_StaticBatchInfo:
+ firstSubMesh: 0
+ subMeshCount: 0
+ m_StaticBatchRoot: {fileID: 0}
+ m_ProbeAnchor: {fileID: 0}
+ m_LightProbeVolumeOverride: {fileID: 0}
+ m_ScaleInLightmap: 1
+ m_ReceiveGI: 1
+ m_PreserveUVs: 0
+ m_IgnoreNormalsForChartDetection: 0
+ m_ImportantGI: 0
+ m_StitchLightmapSeams: 1
+ m_SelectedEditorRenderState: 0
+ m_MinimumChartSize: 4
+ m_AutoUVMaxDistance: 0.5
+ m_AutoUVMaxAngle: 89
+ m_LightmapParameters: {fileID: 0}
+ m_SortingLayerID: 0
+ m_SortingLayer: 0
+ m_SortingOrder: 1
+ m_Sprite: {fileID: 21300000, guid: 9bf1f9d2c7fd7cd44895557e0279a45e, type: 3}
+ m_Color: {r: 1, g: 1, b: 1, a: 1}
+ m_FlipX: 0
+ m_FlipY: 0
+ m_DrawMode: 0
+ m_Size: {x: 11.08, y: 8.65}
+ m_AdaptiveModeThreshold: 0.5
+ m_SpriteTileMode: 0
+ m_WasSpriteAssigned: 1
+ m_MaskInteraction: 0
+ m_SpriteSortPoint: 0
diff --git a/unity/Assets/Scenes/res/prefab/tree5.prefab.meta b/unity/Assets/Scenes/res/prefab/tree5.prefab.meta
new file mode 100644
index 0000000..a1ce4b6
--- /dev/null
+++ b/unity/Assets/Scenes/res/prefab/tree5.prefab.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: CnkavHj7Uy4MFPttv1ZmFbSmfLfzBBP8masu3pnZVBDRheLnRwZRIpw=
+PrefabImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/unity/Assets/Scenes/res/prefab/tree6.prefab b/unity/Assets/Scenes/res/prefab/tree6.prefab
new file mode 100644
index 0000000..6fc262e
--- /dev/null
+++ b/unity/Assets/Scenes/res/prefab/tree6.prefab
@@ -0,0 +1,90 @@
+%YAML 1.1
+%TAG !u! tag:yousandi.cn,2023:
+--- !u!1 &5660061587620676623
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 7
+ m_Component:
+ - component: {fileID: 111467382636961109}
+ - component: {fileID: 6348065243048491524}
+ m_Layer: 0
+ m_HasEditorInfo: 1
+ m_Name: tree6
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!4 &111467382636961109
+Transform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 5660061587620676623}
+ serializedVersion: 2
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: 0.52, y: -1.02, z: -1.97}
+ m_LocalScale: {x: 0.75251, y: 0.75251, z: 0.75251}
+ m_ConstrainProportionsScale: 0
+ m_Children: []
+ m_Father: {fileID: 0}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!212 &6348065243048491524
+SpriteRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 5660061587620676623}
+ m_Enabled: 1
+ m_CastShadows: 1
+ m_ReceiveShadows: 1
+ m_DynamicOccludee: 1
+ m_StaticShadowCaster: 0
+ m_MotionVectors: 1
+ m_LightProbeUsage: 1
+ m_ReflectionProbeUsage: 1
+ m_RayTracingMode: 0
+ m_RayTraceProcedural: 0
+ m_virtualGeometry: 0
+ m_virtualGeometryShadow: 0
+ m_ShadingRate: 0
+ m_RenderingLayerMask: 1
+ m_RendererPriority: 0
+ m_Materials:
+ - {fileID: -876546973899608171, guid: be3236dea9f1e304da1a5e3a513dad5e, type: 3}
+ m_StaticBatchInfo:
+ firstSubMesh: 0
+ subMeshCount: 0
+ m_StaticBatchRoot: {fileID: 0}
+ m_ProbeAnchor: {fileID: 0}
+ m_LightProbeVolumeOverride: {fileID: 0}
+ m_ScaleInLightmap: 1
+ m_ReceiveGI: 1
+ m_PreserveUVs: 0
+ m_IgnoreNormalsForChartDetection: 0
+ m_ImportantGI: 0
+ m_StitchLightmapSeams: 1
+ m_SelectedEditorRenderState: 0
+ m_MinimumChartSize: 4
+ m_AutoUVMaxDistance: 0.5
+ m_AutoUVMaxAngle: 89
+ m_LightmapParameters: {fileID: 0}
+ m_SortingLayerID: 0
+ m_SortingLayer: 0
+ m_SortingOrder: 1
+ m_Sprite: {fileID: 21300000, guid: 9bf1f9d2c7fd7cd44895557e0279a45e, type: 3}
+ m_Color: {r: 1, g: 1, b: 1, a: 1}
+ m_FlipX: 0
+ m_FlipY: 0
+ m_DrawMode: 0
+ m_Size: {x: 11.08, y: 8.65}
+ m_AdaptiveModeThreshold: 0.5
+ m_SpriteTileMode: 0
+ m_WasSpriteAssigned: 1
+ m_MaskInteraction: 0
+ m_SpriteSortPoint: 0
diff --git a/unity/Assets/Scenes/res/prefab/tree6.prefab.meta b/unity/Assets/Scenes/res/prefab/tree6.prefab.meta
new file mode 100644
index 0000000..c571dc4
--- /dev/null
+++ b/unity/Assets/Scenes/res/prefab/tree6.prefab.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: DHxKtS/7UC+9NjkwabK51GtR+MGMZ7lfdxrwm0wsvwBmtZhKpH8NAsY=
+PrefabImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/unity/Assets/camera/YSorter.cs b/unity/Assets/camera/YSorter.cs
index 4485ccd..bcfd00a 100644
--- a/unity/Assets/camera/YSorter.cs
+++ b/unity/Assets/camera/YSorter.cs
@@ -1,29 +1,27 @@
using UnityEngine;
///
-/// Y-Sort 排序器 —— 根据物体的Y坐标(世界空间)动态调整Sprite的sortingOrder。
+/// Y-Sort 排序器 —— 根据物体的Z坐标(世界空间)动态调整Sprite的sortingOrder。
///
/// 原理:
-/// 在2.5D等距视角游戏中,Y坐标代表"前后"关系(Y越小=越远=越靠后)。
-/// 本脚本每帧根据物体的Y坐标计算sortingOrder,Y值越小排序值越小,
-/// 这样后面的物体会被前面的物体遮挡,实现正确的前后遮挡关系。
+/// 在2.5D等距视角游戏中,摄像机从斜上方45°俯视,Z坐标代表"前后"关系。
+/// Z值越大(离相机越远=越靠前),sortingOrder越大,会遮挡Z值小的物体。
///
/// 用法:
-/// 1. 挂到所有需要参与Y-Sort的Sprite物体上(玩家、敌人、树木、石头等)
-/// 2. 设置 baseSortingOrder 区分不同类型的物体(如地面=0,角色=1000,UI=2000)
+/// 1. 挂到所有需要参与排序的Sprite物体上(玩家、敌人、树木、石头等)
+/// 2. 设置 baseSortingOrder 区分不同类型的物体(如地面=0,角色=1000)
/// 3. 确保所有参与排序的Sprite在同一个Sorting Layer上
///
/// 注意:
-/// - 本脚本假设摄像机从斜上方俯视(Y轴代表前后)
+/// - 本脚本假设摄像机从斜上方俯视(Z轴代表前后)
/// - 所有参与排序的物体必须在同一个Sorting Layer
-/// - 建议给不同类型的物体设置不同的baseSortingOrder以避免冲突
///
public class YSorter : MonoBehaviour
{
[Tooltip("基础排序值,用于区分不同类型的物体(如地面=0,角色=1000)")]
[SerializeField] private int baseSortingOrder = 0;
- [Tooltip("Y坐标到sortingOrder的缩放系数(值越大,前后物体排序差异越明显)")]
+ [Tooltip("Z坐标到sortingOrder的缩放系数(值越大,前后物体排序差异越明显)")]
[SerializeField] private float scaleFactor = 100f;
[Tooltip("是否每帧更新(关闭则只在移动时更新,性能更好)")]
@@ -56,9 +54,9 @@ public class YSorter : MonoBehaviour
private void UpdateSortingOrder()
{
- // Y值越小(越远),sortingOrder越小
- // 使用负号是因为Unity中Y轴向上为正,但我们需要Y越小=越靠后
- int sortingOrder = baseSortingOrder - Mathf.RoundToInt(transform.position.y * scaleFactor);
+ // 直接使用Z坐标作为排序依据
+ // Z值越大(离相机越远),sortingOrder越大
+ int sortingOrder = baseSortingOrder + Mathf.RoundToInt(transform.position.z * scaleFactor);
if (_spriteRenderer.sortingOrder != sortingOrder)
{