diff --git a/Assets/Quadtree Collider Detection/MyGizmos.cs b/Assets/Quadtree Collider Detection/QuadtreeCollider/Gizmos/MyGizmos.cs similarity index 100% rename from Assets/Quadtree Collider Detection/MyGizmos.cs rename to Assets/Quadtree Collider Detection/QuadtreeCollider/Gizmos/MyGizmos.cs diff --git a/Assets/Quadtree Collider Detection/QuadtreeCollider/Quadtree/Quadtree/Quadtree.cs b/Assets/Quadtree Collider Detection/QuadtreeCollider/Quadtree/Quadtree/Quadtree.cs index 14e1994..ef04966 100644 --- a/Assets/Quadtree Collider Detection/QuadtreeCollider/Quadtree/Quadtree/Quadtree.cs +++ b/Assets/Quadtree Collider Detection/QuadtreeCollider/Quadtree/Quadtree/Quadtree.cs @@ -16,7 +16,11 @@ internal partial class Quadtree : MonoBehaviour /// /// 碰撞器到节点的映射表 /// - private readonly Dictionary collidersToNodes = new Dictionary(); + private Dictionary collidersToNodes = new Dictionary(); + /// + /// 需要移除的碰撞器节点 + /// + private readonly List needRemoveColliders = new List(); private void Awake() { @@ -29,6 +33,12 @@ private void Update() // 更新四叉树 UpdateQuadtree(); + // 移除需要移除的碰撞器 + RemoveNeedRemoveColliders(); + + // 移除所有已被销毁的碰撞器的映射 + RemoveDestroyedCollidersToNodes(); + // 进行检测 Detect(); } @@ -38,8 +48,8 @@ private void Update() /// private void UpdateQuadtree() { - // 从根节点开始更新碰撞器位置 - QuadtreeNode.OperationResult positionResult = root.UpdatePosition(); + // 从根节点开始更新碰撞器位置并移除已经被销毁的碰撞器 + QuadtreeNode.OperationResult positionResult = root.UpdatePositionAndRemoveDestroyedCollider(); // 更新映射表 collidersToNodes.OverlayMerge(positionResult.CollidersToNodes).RemoveOnValueIsNull(); @@ -52,6 +62,35 @@ private void UpdateQuadtree() // 但这些节点需要进行最大半径更新,否则新节点的最大半径是负无穷,会导致生长的这一帧碰撞检测错误 } + /// + /// 移除需要移除的碰撞器 + /// + private void RemoveNeedRemoveColliders() + { + // 遍历所有需要移除的碰撞器并移除 + needRemoveColliders.ForEach(node => + { + // 不是 null 的移除,是 null 的是因为碰撞机被销毁而需要移除的,这些需要用另外的方式处理 + if(node != null) + { + // 移除碰撞机并在需要的时候进行合并 + ImmediateRemoveColliderWithMerge(node); + } + }); + + // 清空需要移除的碰撞机列表 + needRemoveColliders.Clear(); + } + + /// + /// 移除所有已被销毁的碰撞器的映射 + /// + private void RemoveDestroyedCollidersToNodes() + { + // 从映射表里过滤出碰撞器不为 null 的映射,组成新的映射表 + collidersToNodes = collidersToNodes.Where(pair => pair.Key != null).ToDictionary(pair => pair.Key, pair => pair.Value); + } + /// /// 进行碰撞检测 /// diff --git a/Assets/Quadtree Collider Detection/QuadtreeCollider/Quadtree/Quadtree/Singleton.cs b/Assets/Quadtree Collider Detection/QuadtreeCollider/Quadtree/Quadtree/Singleton.cs index ca4d5ce..b439c7b 100644 --- a/Assets/Quadtree Collider Detection/QuadtreeCollider/Quadtree/Quadtree/Singleton.cs +++ b/Assets/Quadtree Collider Detection/QuadtreeCollider/Quadtree/Quadtree/Singleton.cs @@ -50,22 +50,38 @@ public static QuadtreeNode.OperationResult AddCollider(QuadtreeCollider collider } /// - /// 从四叉树中移除碰撞器,符合条件时会合并节点 + /// 移除碰撞器,到下次进行检测时才会真正移除碰撞器,符合条件时会合并节点 + /// + /// + public static void RemoveColliderWithMerge(QuadtreeCollider collider) + { + // 如果没有实例,不进行处理,这一步是必须的,否则在游戏关闭时会发生销毁时四叉树实例一次次出现,进而导致异常 + if (instance == null) + { + return; + } + + // 添加到需要移除的碰撞器列表里 + Instance.needRemoveColliders.Add(collider); + } + + /// + /// 立即从四叉树中移除碰撞器,符合条件时会合并节点 /// /// /// - public static QuadtreeNode.OperationResult RemoveColliderWithMerge(QuadtreeCollider collider) + public static QuadtreeNode.OperationResult ImmediateRemoveColliderWithMerge(QuadtreeCollider collider) { - return RemoveCollider(collider, true); + return ImmediateRemoveCollider(collider, true); } /// - /// 从四叉树中移除碰撞器,不进行合并 + /// 立即从四叉树中移除碰撞器,不进行合并 /// /// - internal static QuadtreeNode.OperationResult RemoveColliderWithOutMerge(QuadtreeCollider collider) + internal static QuadtreeNode.OperationResult ImmediateRemoveColliderWithOutMerge(QuadtreeCollider collider) { - return RemoveCollider(collider, false); + return ImmediateRemoveCollider(collider, false); } /// @@ -74,7 +90,7 @@ internal static QuadtreeNode.OperationResult RemoveColliderWithOutMerge(Quadtree /// /// 是否需要在需要合并的时候进行合并 /// - internal static QuadtreeNode.OperationResult RemoveCollider(QuadtreeCollider collider, bool withMerge) + internal static QuadtreeNode.OperationResult ImmediateRemoveCollider(QuadtreeCollider collider, bool withMerge) { // 如果没有实例,不进行处理,这一步是必须的,否则在游戏关闭时会发生销毁时四叉树实例一次次出现,进而导致异常 if(instance == null) @@ -92,11 +108,11 @@ internal static QuadtreeNode.OperationResult RemoveCollider(QuadtreeCollider col QuadtreeNode.OperationResult result; if (withMerge) { - result = Instance.collidersToNodes[collider].RemoveColliderFromSelfWithMerge(collider); + result = Instance.collidersToNodes[collider].ImmediateRemoveColliderFromSelfWithMerge(collider); } else { - result = Instance.collidersToNodes[collider].RemoveColliderFromSelfWithOutMerge(collider); + result = Instance.collidersToNodes[collider].ImmediateRemoveColliderFromSelfWithOutMerge(collider); } if (result.Success) diff --git a/Assets/Quadtree Collider Detection/QuadtreeCollider/Quadtree/QuadtreeNode/RemoveCollider.cs b/Assets/Quadtree Collider Detection/QuadtreeCollider/Quadtree/QuadtreeNode/RemoveCollider.cs index 67b290f..96ac6e4 100644 --- a/Assets/Quadtree Collider Detection/QuadtreeCollider/Quadtree/QuadtreeNode/RemoveCollider.cs +++ b/Assets/Quadtree Collider Detection/QuadtreeCollider/Quadtree/QuadtreeNode/RemoveCollider.cs @@ -13,7 +13,7 @@ internal partial class QuadtreeNode /// /// /// - internal OperationResult RemoveColliderFromSelfWithOutMerge(QuadtreeCollider collider) + internal OperationResult ImmediateRemoveColliderFromSelfWithOutMerge(QuadtreeCollider collider) { bool listResult = colliders.Remove(collider); @@ -39,10 +39,10 @@ internal OperationResult RemoveColliderFromSelfWithOutMerge(QuadtreeCollider col /// /// /// - internal OperationResult RemoveColliderFromSelfWithMerge(QuadtreeCollider collider) + internal OperationResult ImmediateRemoveColliderFromSelfWithMerge(QuadtreeCollider collider) { // 移除碰撞器 - OperationResult result = RemoveColliderFromSelfWithOutMerge(collider); + OperationResult result = ImmediateRemoveColliderFromSelfWithOutMerge(collider); // 移除失败,不需要合并,直接返回结果 if(!result.Success) diff --git a/Assets/Quadtree Collider Detection/QuadtreeCollider/Quadtree/QuadtreeNode/Update.cs b/Assets/Quadtree Collider Detection/QuadtreeCollider/Quadtree/QuadtreeNode/Update.cs index 3c5a286..02d47bd 100644 --- a/Assets/Quadtree Collider Detection/QuadtreeCollider/Quadtree/QuadtreeNode/Update.cs +++ b/Assets/Quadtree Collider Detection/QuadtreeCollider/Quadtree/QuadtreeNode/Update.cs @@ -10,24 +10,24 @@ internal partial class QuadtreeNode /// 更新碰撞器位置 /// /// - internal OperationResult UpdatePosition() + internal OperationResult UpdatePositionAndRemoveDestroyedCollider() { if (HaveChildren()) { // 有子节点,通知子节点更新碰撞器位置 - return UpdateChildrenPosition(); + return UpdateChildrenPositionAndRemoveDestroyedCollider(); } else { // 没有子节点,更新当前节点内的碰撞器位置 - return UpdateSelfPosition(); + return UpdateSelfPositionAndRemoveDestroyedCollider(); } } /// /// 更新子节点的碰撞器位置 /// - private OperationResult UpdateChildrenPosition() + private OperationResult UpdateChildrenPositionAndRemoveDestroyedCollider() { // 更新碰撞器位置必定成功 OperationResult result = new OperationResult(true); @@ -36,7 +36,7 @@ private OperationResult UpdateChildrenPosition() foreach (QuadtreeNode child in children) { // 通知子节点更新碰撞器位置 - OperationResult childResult = child.UpdatePosition(); + OperationResult childResult = child.UpdatePositionAndRemoveDestroyedCollider(); // 将子节更新导致的映射表更新合并到总结果里 result.CollidersToNodes.OverlayMerge(childResult.CollidersToNodes); @@ -60,11 +60,14 @@ private OperationResult UpdateChildrenPosition() /// /// 更新当前节点内的碰撞器的位置 /// - private OperationResult UpdateSelfPosition() + private OperationResult UpdateSelfPositionAndRemoveDestroyedCollider() { // 更新碰撞器位置必定成功 OperationResult result = new OperationResult(true); + // 移除所有为空的碰撞器,这些是在外部被销毁的碰撞器 + colliders.RemoveAll(collider => collider == null); + // 移除所有当前节点保存的、已经离开当前节点范围的碰撞器,并将这些碰撞器保存起来 OperationResult removeResult = GetAndRemoveCollidersOutOfArea(); @@ -101,7 +104,7 @@ private OperationResult GetAndRemoveCollidersOutOfArea() foreach (QuadtreeCollider collider in new List(result.CollidersToNodes.Keys)) { // 移除碰撞器 - OperationResult removeResult = Quadtree.RemoveColliderWithOutMerge(collider); + OperationResult removeResult = Quadtree.ImmediateRemoveColliderWithOutMerge(collider); // 记录映射表的变化 result.CollidersToNodes.OverlayMerge(removeResult.CollidersToNodes); diff --git a/Assets/Quadtree Collider Detection/QuadtreeCollider/Tests/Editor/API Tests/Dictionary Test/DictionaryTest.cs b/Assets/Quadtree Collider Detection/Tests/00 API Tests/Editor/Dictionary Test/DictionaryTest.cs similarity index 100% rename from Assets/Quadtree Collider Detection/QuadtreeCollider/Tests/Editor/API Tests/Dictionary Test/DictionaryTest.cs rename to Assets/Quadtree Collider Detection/Tests/00 API Tests/Editor/Dictionary Test/DictionaryTest.cs diff --git a/Assets/Quadtree Collider Detection/QuadtreeCollider/Tests/Editor/API Tests/Event Test/SubscribeTest.cs b/Assets/Quadtree Collider Detection/Tests/00 API Tests/Editor/Event Test/SubscribeTest.cs similarity index 100% rename from Assets/Quadtree Collider Detection/QuadtreeCollider/Tests/Editor/API Tests/Event Test/SubscribeTest.cs rename to Assets/Quadtree Collider Detection/Tests/00 API Tests/Editor/Event Test/SubscribeTest.cs diff --git a/Assets/Quadtree Collider Detection/QuadtreeCollider/Tests/Editor/API Tests/Interface On Mono Destroy/IInterfaceOnMonoDestroyTestInterface.cs b/Assets/Quadtree Collider Detection/Tests/00 API Tests/Editor/Interface On Mono Destroy/IInterfaceOnMonoDestroyTestInterface.cs similarity index 100% rename from Assets/Quadtree Collider Detection/QuadtreeCollider/Tests/Editor/API Tests/Interface On Mono Destroy/IInterfaceOnMonoDestroyTestInterface.cs rename to Assets/Quadtree Collider Detection/Tests/00 API Tests/Editor/Interface On Mono Destroy/IInterfaceOnMonoDestroyTestInterface.cs diff --git a/Assets/Quadtree Collider Detection/QuadtreeCollider/Tests/Editor/API Tests/Interface On Mono Destroy/Interface On Mono Destroy.asmdef b/Assets/Quadtree Collider Detection/Tests/00 API Tests/Editor/Interface On Mono Destroy/Interface On Mono Destroy.asmdef similarity index 100% rename from Assets/Quadtree Collider Detection/QuadtreeCollider/Tests/Editor/API Tests/Interface On Mono Destroy/Interface On Mono Destroy.asmdef rename to Assets/Quadtree Collider Detection/Tests/00 API Tests/Editor/Interface On Mono Destroy/Interface On Mono Destroy.asmdef diff --git a/Assets/Quadtree Collider Detection/QuadtreeCollider/Tests/Editor/API Tests/Interface On Mono Destroy/InterfaceOnMonoDestroyTest.cs b/Assets/Quadtree Collider Detection/Tests/00 API Tests/Editor/Interface On Mono Destroy/InterfaceOnMonoDestroyTest.cs similarity index 100% rename from Assets/Quadtree Collider Detection/QuadtreeCollider/Tests/Editor/API Tests/Interface On Mono Destroy/InterfaceOnMonoDestroyTest.cs rename to Assets/Quadtree Collider Detection/Tests/00 API Tests/Editor/Interface On Mono Destroy/InterfaceOnMonoDestroyTest.cs diff --git a/Assets/Quadtree Collider Detection/QuadtreeCollider/Tests/Editor/API Tests/Interface On Mono Destroy/InterfaceOnMonoDestroyTestMono.cs b/Assets/Quadtree Collider Detection/Tests/00 API Tests/Editor/Interface On Mono Destroy/InterfaceOnMonoDestroyTestMono.cs similarity index 100% rename from Assets/Quadtree Collider Detection/QuadtreeCollider/Tests/Editor/API Tests/Interface On Mono Destroy/InterfaceOnMonoDestroyTestMono.cs rename to Assets/Quadtree Collider Detection/Tests/00 API Tests/Editor/Interface On Mono Destroy/InterfaceOnMonoDestroyTestMono.cs diff --git a/Assets/Quadtree Collider Detection/QuadtreeCollider/Tests/Editor/API Tests/List Test/ListTest.cs b/Assets/Quadtree Collider Detection/Tests/00 API Tests/Editor/List Test/ListTest.cs similarity index 100% rename from Assets/Quadtree Collider Detection/QuadtreeCollider/Tests/Editor/API Tests/List Test/ListTest.cs rename to Assets/Quadtree Collider Detection/Tests/00 API Tests/Editor/List Test/ListTest.cs diff --git a/Assets/Quadtree Collider Detection/QuadtreeCollider/Tests/Editor/API Tests/Overload Test/OverloadTest.cs b/Assets/Quadtree Collider Detection/Tests/00 API Tests/Editor/Overload Test/OverloadTest.cs similarity index 100% rename from Assets/Quadtree Collider Detection/QuadtreeCollider/Tests/Editor/API Tests/Overload Test/OverloadTest.cs rename to Assets/Quadtree Collider Detection/Tests/00 API Tests/Editor/Overload Test/OverloadTest.cs diff --git a/Assets/Quadtree Collider Detection/QuadtreeCollider/Tests/Editor/API Tests/Rect Test/RecCenterTest.cs b/Assets/Quadtree Collider Detection/Tests/00 API Tests/Editor/Rect Test/RecCenterTest.cs similarity index 100% rename from Assets/Quadtree Collider Detection/QuadtreeCollider/Tests/Editor/API Tests/Rect Test/RecCenterTest.cs rename to Assets/Quadtree Collider Detection/Tests/00 API Tests/Editor/Rect Test/RecCenterTest.cs diff --git a/Assets/Quadtree Collider Detection/QuadtreeCollider/Tests/Editor/API Tests/Rect Test/RecContainstTest.cs b/Assets/Quadtree Collider Detection/Tests/00 API Tests/Editor/Rect Test/RecContainstTest.cs similarity index 100% rename from Assets/Quadtree Collider Detection/QuadtreeCollider/Tests/Editor/API Tests/Rect Test/RecContainstTest.cs rename to Assets/Quadtree Collider Detection/Tests/00 API Tests/Editor/Rect Test/RecContainstTest.cs diff --git a/Assets/Quadtree Collider Detection/QuadtreeCollider/Tests/Editor/API Tests/Rect Test/RectNewSetSpeedTest.cs b/Assets/Quadtree Collider Detection/Tests/00 API Tests/Editor/Rect Test/RectNewSetSpeedTest.cs similarity index 100% rename from Assets/Quadtree Collider Detection/QuadtreeCollider/Tests/Editor/API Tests/Rect Test/RectNewSetSpeedTest.cs rename to Assets/Quadtree Collider Detection/Tests/00 API Tests/Editor/Rect Test/RectNewSetSpeedTest.cs diff --git a/Assets/Quadtree Collider Detection/QuadtreeCollider/Tests/OnTriggerEnterExecuteTime/Enter Execute Time.unity b/Assets/Quadtree Collider Detection/Tests/01 OnTriggerEnterExecuteTime/Enter Execute Time.unity similarity index 100% rename from Assets/Quadtree Collider Detection/QuadtreeCollider/Tests/OnTriggerEnterExecuteTime/Enter Execute Time.unity rename to Assets/Quadtree Collider Detection/Tests/01 OnTriggerEnterExecuteTime/Enter Execute Time.unity diff --git a/Assets/Quadtree Collider Detection/QuadtreeCollider/Tests/OnTriggerEnterExecuteTime/Enter Execute TimeSettings.lighting b/Assets/Quadtree Collider Detection/Tests/01 OnTriggerEnterExecuteTime/Enter Execute TimeSettings.lighting similarity index 100% rename from Assets/Quadtree Collider Detection/QuadtreeCollider/Tests/OnTriggerEnterExecuteTime/Enter Execute TimeSettings.lighting rename to Assets/Quadtree Collider Detection/Tests/01 OnTriggerEnterExecuteTime/Enter Execute TimeSettings.lighting diff --git a/Assets/Quadtree Collider Detection/QuadtreeCollider/Tests/OnTriggerEnterExecuteTime/EnterLoger.cs b/Assets/Quadtree Collider Detection/Tests/01 OnTriggerEnterExecuteTime/EnterLoger.cs similarity index 100% rename from Assets/Quadtree Collider Detection/QuadtreeCollider/Tests/OnTriggerEnterExecuteTime/EnterLoger.cs rename to Assets/Quadtree Collider Detection/Tests/01 OnTriggerEnterExecuteTime/EnterLoger.cs diff --git a/Assets/Quadtree Collider Detection/QuadtreeCollider/Tests/OnTriggerEnterExecuteTime/TriggetMove.cs b/Assets/Quadtree Collider Detection/Tests/01 OnTriggerEnterExecuteTime/TriggetMove.cs similarity index 100% rename from Assets/Quadtree Collider Detection/QuadtreeCollider/Tests/OnTriggerEnterExecuteTime/TriggetMove.cs rename to Assets/Quadtree Collider Detection/Tests/01 OnTriggerEnterExecuteTime/TriggetMove.cs diff --git a/Assets/Quadtree Collider Detection/QuadtreeCollider/Tests/Trigger Execute Time Test/Loger.cs b/Assets/Quadtree Collider Detection/Tests/02 Trigger Execute Time Test/Loger.cs similarity index 100% rename from Assets/Quadtree Collider Detection/QuadtreeCollider/Tests/Trigger Execute Time Test/Loger.cs rename to Assets/Quadtree Collider Detection/Tests/02 Trigger Execute Time Test/Loger.cs diff --git a/Assets/Quadtree Collider Detection/QuadtreeCollider/Tests/Trigger Execute Time Test/Test Scene.unity b/Assets/Quadtree Collider Detection/Tests/02 Trigger Execute Time Test/Test Scene.unity similarity index 100% rename from Assets/Quadtree Collider Detection/QuadtreeCollider/Tests/Trigger Execute Time Test/Test Scene.unity rename to Assets/Quadtree Collider Detection/Tests/02 Trigger Execute Time Test/Test Scene.unity diff --git a/Assets/Quadtree Collider Detection/QuadtreeCollider/Tests/Trigger Execute Time Test/Test SceneSettings.lighting b/Assets/Quadtree Collider Detection/Tests/02 Trigger Execute Time Test/Test SceneSettings.lighting similarity index 100% rename from Assets/Quadtree Collider Detection/QuadtreeCollider/Tests/Trigger Execute Time Test/Test SceneSettings.lighting rename to Assets/Quadtree Collider Detection/Tests/02 Trigger Execute Time Test/Test SceneSettings.lighting diff --git a/Assets/Quadtree Collider Detection/QuadtreeCollider/Tests/Trigger Execute Time Test/Waiter.cs b/Assets/Quadtree Collider Detection/Tests/02 Trigger Execute Time Test/Waiter.cs similarity index 100% rename from Assets/Quadtree Collider Detection/QuadtreeCollider/Tests/Trigger Execute Time Test/Waiter.cs rename to Assets/Quadtree Collider Detection/Tests/02 Trigger Execute Time Test/Waiter.cs diff --git a/Assets/Quadtree Collider Detection/Tests/03 Delay Disable/DestroyOnCollisionEnter.cs b/Assets/Quadtree Collider Detection/Tests/03 Delay Disable/DestroyOnCollisionEnter.cs new file mode 100644 index 0000000..6470aeb --- /dev/null +++ b/Assets/Quadtree Collider Detection/Tests/03 Delay Disable/DestroyOnCollisionEnter.cs @@ -0,0 +1,20 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +namespace MtC.Tools.QuadtreeCollider.Test +{ + /// + /// 当发生碰撞时销毁物体的组件,用于测试延迟禁用碰撞器的功能 + /// + [RequireComponent(typeof(CircleQuadtreeCollider))] + public class DestroyOnCollisionEnter : MonoBehaviour, IOnQuadtreeCollisionEnter + { + public void OnQuadtreeCollisionEnter(QuadtreeCollider collider) + { + Destroy(gameObject); + + Debug.Log(gameObject.name + " 销毁"); + } + } +} diff --git a/Assets/Quadtree Collider Detection/Tests/03 Delay Disable/DisableColliderOnCollisionEnter.cs b/Assets/Quadtree Collider Detection/Tests/03 Delay Disable/DisableColliderOnCollisionEnter.cs new file mode 100644 index 0000000..91ef239 --- /dev/null +++ b/Assets/Quadtree Collider Detection/Tests/03 Delay Disable/DisableColliderOnCollisionEnter.cs @@ -0,0 +1,20 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +namespace MtC.Tools.QuadtreeCollider.Test +{ + /// + /// 当发生碰撞时禁用碰撞器的组件,用于测试延迟禁用碰撞器的功能 + /// + [RequireComponent(typeof(CircleQuadtreeCollider))] + public class DisableColliderOnCollisionEnter : MonoBehaviour, IOnQuadtreeCollisionEnter + { + public void OnQuadtreeCollisionEnter(QuadtreeCollider collider) + { + GetComponent().enabled = false; + + Debug.Log(gameObject.name + " 禁用碰撞器"); + } + } +} diff --git a/Assets/Quadtree Collider Detection/Tests/03 Delay Disable/New Scene.unity b/Assets/Quadtree Collider Detection/Tests/03 Delay Disable/New Scene.unity new file mode 100644 index 0000000..7a8a2b4 --- /dev/null +++ b/Assets/Quadtree Collider Detection/Tests/03 Delay Disable/New Scene.unity @@ -0,0 +1,942 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!29 &1 +OcclusionCullingSettings: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_OcclusionBakeSettings: + smallestOccluder: 5 + smallestHole: 0.25 + backfaceThreshold: 100 + m_SceneGUID: 00000000000000000000000000000000 + m_OcclusionCullingData: {fileID: 0} +--- !u!104 &2 +RenderSettings: + m_ObjectHideFlags: 0 + serializedVersion: 9 + m_Fog: 0 + m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} + m_FogMode: 3 + m_FogDensity: 0.01 + m_LinearFogStart: 0 + m_LinearFogEnd: 300 + m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1} + m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1} + m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1} + m_AmbientIntensity: 1 + m_AmbientMode: 3 + m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1} + m_SkyboxMaterial: {fileID: 0} + m_HaloStrength: 0.5 + m_FlareStrength: 1 + m_FlareFadeSpeed: 3 + m_HaloTexture: {fileID: 0} + m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0} + m_DefaultReflectionMode: 0 + m_DefaultReflectionResolution: 128 + m_ReflectionBounces: 1 + m_ReflectionIntensity: 1 + m_CustomReflection: {fileID: 0} + m_Sun: {fileID: 0} + m_IndirectSpecularColor: {r: 0, g: 0, b: 0, a: 1} + m_UseRadianceAmbientProbe: 0 +--- !u!157 &3 +LightmapSettings: + m_ObjectHideFlags: 0 + serializedVersion: 12 + m_GIWorkflowMode: 1 + m_GISettings: + serializedVersion: 2 + m_BounceScale: 1 + m_IndirectOutputScale: 1 + m_AlbedoBoost: 1 + m_EnvironmentLightingMode: 0 + m_EnableBakedLightmaps: 0 + m_EnableRealtimeLightmaps: 0 + m_LightmapEditorSettings: + serializedVersion: 12 + m_Resolution: 2 + m_BakeResolution: 40 + m_AtlasSize: 1024 + m_AO: 0 + m_AOMaxDistance: 1 + m_CompAOExponent: 1 + m_CompAOExponentDirect: 0 + m_ExtractAmbientOcclusion: 0 + m_Padding: 2 + m_LightmapParameters: {fileID: 0} + m_LightmapsBakeMode: 1 + m_TextureCompression: 1 + m_FinalGather: 0 + m_FinalGatherFiltering: 1 + m_FinalGatherRayCount: 256 + m_ReflectionCompression: 2 + m_MixedBakeMode: 2 + m_BakeBackend: 1 + m_PVRSampling: 1 + m_PVRDirectSampleCount: 32 + m_PVRSampleCount: 512 + m_PVRBounces: 2 + m_PVREnvironmentSampleCount: 256 + m_PVREnvironmentReferencePointCount: 2048 + m_PVRFilteringMode: 1 + m_PVRDenoiserTypeDirect: 1 + m_PVRDenoiserTypeIndirect: 1 + m_PVRDenoiserTypeAO: 1 + m_PVRFilterTypeDirect: 0 + m_PVRFilterTypeIndirect: 0 + m_PVRFilterTypeAO: 0 + m_PVREnvironmentMIS: 1 + m_PVRCulling: 1 + m_PVRFilteringGaussRadiusDirect: 1 + m_PVRFilteringGaussRadiusIndirect: 5 + m_PVRFilteringGaussRadiusAO: 2 + m_PVRFilteringAtrousPositionSigmaDirect: 0.5 + m_PVRFilteringAtrousPositionSigmaIndirect: 2 + m_PVRFilteringAtrousPositionSigmaAO: 1 + m_ExportTrainingData: 0 + m_TrainingDataDestination: TrainingData + m_LightProbeSampleCountMultiplier: 4 + m_LightingDataAsset: {fileID: 0} + m_LightingSettings: {fileID: 0} +--- !u!196 &4 +NavMeshSettings: + serializedVersion: 2 + m_ObjectHideFlags: 0 + m_BuildSettings: + serializedVersion: 2 + agentTypeID: 0 + agentRadius: 0.5 + agentHeight: 2 + agentSlope: 45 + agentClimb: 0.4 + ledgeDropHeight: 0 + maxJumpAcrossDistance: 0 + minRegionArea: 2 + manualCellSize: 0 + cellSize: 0.16666667 + manualTileSize: 0 + tileSize: 256 + accuratePlacement: 0 + maxJobWorkers: 0 + preserveTilesOutsideBounds: 0 + debug: + m_Flags: 0 + m_NavMeshData: {fileID: 0} +--- !u!1 &175555487 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 175555488} + - component: {fileID: 175555490} + - component: {fileID: 175555489} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &175555488 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 175555487} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1453272153} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 1500, y: 1000} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &175555489 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 175555487} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 28 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 2 + m_MaxSize: 40 + m_Alignment: 0 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: "\u8FD9\u4E2A\u573A\u666F\u7528\u4E8E\u6D4B\u8BD5\u5EF6\u8FDF\u7981\u7528\u78B0\u649E\u5668\u529F\u80FD\u3002\n\n\u8FD9\u4E2A\u529F\u80FD\u7684\u8BBE\u8BA1\u662F\u8FD9\u6837\uFF1A\u5728\u8C03\u7528\u79FB\u9664\u78B0\u649E\u5668\u7684\u65F6\u5019\uFF0C\u5728\u4E0B\u4E00\u6B21\u78B0\u649E\u68C0\u6D4B\u524D\u624D\u771F\u6B63\u79FB\u9664\u78B0\u649E\u5668\u3002\u8FD9\u6837\u4FDD\u8BC1\u5982\u679C\u5728\u78B0\u649E\u68C0\u6D4B\u9014\u4E2D\u78B0\u649E\u5668\u88AB\u79FB\u9664\u8FD9\u6B21\u78B0\u649E\u68C0\u6D4B\u4F9D\u7136\u53EF\u4EE5\u6B63\u5E38\u8FDB\u884C\uFF0C\u5E76\u4E0D\u4F1A\u5BFC\u81F4\u8FD9\u4E2A\u78B0\u649E\u5668\u68C0\u6D4B\u5230\u4E00\u534A\u6D88\u5931\u4E86\u3002\n\n\u90A3\u4E48\u6709\u4E24\u4E2A\u60C5\u51B5\uFF1A\n1. + \u4EC5\u4EC5\u662F\u79FB\u9664\u4E86\uFF0C\u5305\u62EC\u7981\u7528\u78B0\u649E\u673A\uFF0C\u6B64\u65F6\u78B0\u649E\u673A\u8FD8\u5728\uFF0C\u53EF\u4EE5\u6B63\u5E38\u8FDB\u884C\uFF0C\u53EA\u8981\u5EF6\u8FDF\u8C03\u7528\u5C31\u884C\u3002\n2. + \u78B0\u649E\u673A\u88AB\u9500\u6BC1\u4E86\uFF0C\u8FD9\u4E2A\u65F6\u5019\u4E0B\u6B21\u78B0\u649E\u68C0\u6D4B\u7684\u65F6\u5019\u78B0\u649E\u673A\u5DF2\u7ECF\u6CA1\u4E86\uFF0C\u6B64\u65F6\u9700\u8981\u53E6\u5916\u7684\u8FC7\u6EE4\u624B\u6BB5\u3002\n\n\u5206\u522B\u51C6\u5907\u6D4B\u8BD5\u65B9\u5F0F\uFF1A\n\u7981\u7528\u60C5\u51B5\uFF1A\u4E24\u4E2A\u7269\u4F53\u78B0\u649E\uFF0C\u78B0\u649E\u540E\u5404\u81EA\u7981\u7528\u81EA\u8EAB\u78B0\u649E\u5668\uFF0C\u5982\u679C\u4E24\u4E2A\u90FD\u7981\u7528\u4E86\uFF0C\u8BF4\u660E\u5EF6\u8FDF\u7981\u7528\u529F\u80FD\u6B63\u5E38\uFF0C\u5982\u679C\u53EA\u6709\u4E00\u4E2A\u7981\u7528\uFF0C\u8BF4\u660E\u5EF6\u8FDF\u7981\u7528\u529F\u80FD\u5931\u6548\u3002\n\u9500\u6BC1\u60C5\u51B5\uFF1A\u4E24\u4E2A\u7269\u4F53\u78B0\u649E\uFF0C\u78B0\u649E\u540E\u5404\u81EA\u9500\u6BC1\uFF0C\u5982\u679C\u4E24\u4E2A\u90FD\u9500\u6BC1\u4E86\uFF0C\u8BF4\u660E\u5EF6\u8FDF\u7981\u7528\u529F\u80FD\u6B63\u5E38\uFF0C\u5982\u679C\u53EA\u6709\u4E00\u4E2A\u9500\u6BC1\uFF0C\u8BF4\u660E\u5EF6\u8FDF\u7981\u7528\u529F\u80FD\u5931\u6548\u3002\n\u5BF9\u4E8E\u9500\u6BC1\u60C5\u51B5\u9700\u8981\u6CE8\u610F\u662F\u5426\u62A5\u5F02\u5E38\uFF0C\u9500\u6BC1\u60C5\u51B5\u662F\u4E0D\u7B26\u5408\u539F\u6765\u7684\u903B\u8F91\u7684\uFF0C\u9700\u8981\u5BF9\u5DF2\u9500\u6BC1\u7684\u78B0\u649E\u5668\u8FDB\u884C\u5904\u7406\u3002" +--- !u!222 &175555490 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 175555487} + m_CullTransparentMesh: 1 +--- !u!1 &652189972 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 652189974} + - component: {fileID: 652189973} + - component: {fileID: 652189975} + - component: {fileID: 652189977} + - component: {fileID: 652189976} + m_Layer: 0 + m_Name: Disable On Collision Object 02 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!212 &652189973 +SpriteRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 652189972} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 0 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10754, guid: 0000000000000000f000000000000000, type: 0} + 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: 0 + m_Sprite: {fileID: 10913, guid: 0000000000000000f000000000000000, type: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_FlipX: 0 + m_FlipY: 0 + m_DrawMode: 0 + m_Size: {x: 0.2, y: 0.2} + m_AdaptiveModeThreshold: 0.5 + m_SpriteTileMode: 0 + m_WasSpriteAssigned: 1 + m_MaskInteraction: 0 + m_SpriteSortPoint: 0 +--- !u!4 &652189974 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 652189972} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -7.25, y: -2.23, z: 0} + m_LocalScale: {x: 3, y: 3, z: 3} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 4 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!50 &652189975 +Rigidbody2D: + serializedVersion: 4 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 652189972} + m_BodyType: 0 + m_Simulated: 1 + m_UseFullKinematicContacts: 0 + m_UseAutoMass: 0 + m_Mass: 1 + m_LinearDrag: 0 + m_AngularDrag: 0.05 + m_GravityScale: 1 + m_Material: {fileID: 0} + m_Interpolate: 0 + m_SleepingMode: 1 + m_CollisionDetection: 0 + m_Constraints: 0 +--- !u!114 &652189976 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 652189972} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f171f5f4ee14161469d7205da05f740e, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!114 &652189977 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 652189972} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 941f899d293b0e44393c418cec6cc3fe, type: 3} + m_Name: + m_EditorClassIdentifier: + autoSubscribe: 1 + isDetector: 1 + radius: 0.09 +--- !u!1 &684649189 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 684649192} + - component: {fileID: 684649191} + - component: {fileID: 684649190} + m_Layer: 0 + m_Name: EventSystem + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &684649190 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 684649189} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4f231c4fb786f3946a6b90b886c48677, type: 3} + m_Name: + m_EditorClassIdentifier: + m_HorizontalAxis: Horizontal + m_VerticalAxis: Vertical + m_SubmitButton: Submit + m_CancelButton: Cancel + m_InputActionsPerSecond: 10 + m_RepeatDelay: 0.5 + m_ForceModuleActive: 0 +--- !u!114 &684649191 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 684649189} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 76c392e42b5098c458856cdf6ecaaaa1, type: 3} + m_Name: + m_EditorClassIdentifier: + m_FirstSelected: {fileID: 0} + m_sendNavigationEvents: 1 + m_DragThreshold: 10 +--- !u!4 &684649192 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 684649189} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &778334678 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 778334681} + - component: {fileID: 778334680} + - component: {fileID: 778334679} + m_Layer: 0 + m_Name: Main Camera + m_TagString: MainCamera + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!81 &778334679 +AudioListener: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 778334678} + m_Enabled: 1 +--- !u!20 &778334680 +Camera: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 778334678} + m_Enabled: 1 + serializedVersion: 2 + m_ClearFlags: 1 + m_BackGroundColor: {r: 0.8254717, g: 1, b: 0.83694285, a: 0} + m_projectionMatrixMode: 1 + m_GateFitMode: 2 + m_FOVAxisMode: 0 + m_SensorSize: {x: 36, y: 24} + m_LensShift: {x: 0, y: 0} + m_FocalLength: 50 + m_NormalizedViewPortRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 + near clip plane: 0.3 + far clip plane: 1000 + field of view: 60 + orthographic: 1 + orthographic size: 5 + m_Depth: -1 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingPath: -1 + m_TargetTexture: {fileID: 0} + m_TargetDisplay: 0 + m_TargetEye: 3 + m_HDR: 1 + m_AllowMSAA: 1 + m_AllowDynamicResolution: 0 + m_ForceIntoRT: 0 + m_OcclusionCulling: 1 + m_StereoConvergence: 10 + m_StereoSeparation: 0.022 +--- !u!4 &778334681 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 778334678} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: -10} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1453272149 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1453272153} + - component: {fileID: 1453272152} + - component: {fileID: 1453272151} + - component: {fileID: 1453272150} + m_Layer: 5 + m_Name: Canvas + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &1453272150 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1453272149} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: dc42784cf147c0c48a680349fa168899, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreReversedGraphics: 1 + m_BlockingObjects: 0 + m_BlockingMask: + serializedVersion: 2 + m_Bits: 4294967295 +--- !u!114 &1453272151 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1453272149} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0cd44c1031e13a943bb63640046fad76, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UiScaleMode: 1 + m_ReferencePixelsPerUnit: 100 + m_ScaleFactor: 1 + m_ReferenceResolution: {x: 1920, y: 1080} + m_ScreenMatchMode: 0 + m_MatchWidthOrHeight: 0.5 + m_PhysicalUnit: 3 + m_FallbackScreenDPI: 96 + m_DefaultSpriteDPI: 96 + m_DynamicPixelsPerUnit: 1 +--- !u!223 &1453272152 +Canvas: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1453272149} + m_Enabled: 1 + serializedVersion: 3 + m_RenderMode: 0 + m_Camera: {fileID: 0} + m_PlaneDistance: 100 + m_PixelPerfect: 0 + m_ReceivesEvents: 1 + m_OverrideSorting: 0 + m_OverridePixelPerfect: 0 + m_SortingBucketNormalizedSize: 0 + m_AdditionalShaderChannelsFlag: 0 + m_SortingLayerID: 0 + m_SortingOrder: 0 + m_TargetDisplay: 0 +--- !u!224 &1453272153 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1453272149} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0, y: 0, z: 0} + m_Children: + - {fileID: 175555488} + m_Father: {fileID: 0} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0, y: 0} +--- !u!1 &1606331807 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1606331811} + - component: {fileID: 1606331810} + - component: {fileID: 1606331809} + - component: {fileID: 1606331808} + m_Layer: 0 + m_Name: Destroy On Collision Object 01 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &1606331808 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1606331807} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5b8613a98603b8a4ca993eb80bd96400, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!114 &1606331809 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1606331807} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 941f899d293b0e44393c418cec6cc3fe, type: 3} + m_Name: + m_EditorClassIdentifier: + autoSubscribe: 1 + isDetector: 1 + radius: 0.09 +--- !u!212 &1606331810 +SpriteRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1606331807} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 0 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10754, guid: 0000000000000000f000000000000000, type: 0} + 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: 0 + m_Sprite: {fileID: 10913, guid: 0000000000000000f000000000000000, type: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_FlipX: 0 + m_FlipY: 0 + m_DrawMode: 0 + m_Size: {x: 0.2, y: 0.2} + m_AdaptiveModeThreshold: 0.5 + m_SpriteTileMode: 0 + m_WasSpriteAssigned: 1 + m_MaskInteraction: 0 + m_SpriteSortPoint: 0 +--- !u!4 &1606331811 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1606331807} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 7.58, y: -3.49, z: 0} + m_LocalScale: {x: 3, y: 3, z: 3} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 5 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1868623146 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1868623148} + - component: {fileID: 1868623147} + - component: {fileID: 1868623150} + - component: {fileID: 1868623149} + m_Layer: 0 + m_Name: Disable On Collision Object 01 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!212 &1868623147 +SpriteRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1868623146} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 0 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10754, guid: 0000000000000000f000000000000000, type: 0} + 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: 0 + m_Sprite: {fileID: 10913, guid: 0000000000000000f000000000000000, type: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_FlipX: 0 + m_FlipY: 0 + m_DrawMode: 0 + m_Size: {x: 0.2, y: 0.2} + m_AdaptiveModeThreshold: 0.5 + m_SpriteTileMode: 0 + m_WasSpriteAssigned: 1 + m_MaskInteraction: 0 + m_SpriteSortPoint: 0 +--- !u!4 &1868623148 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1868623146} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -7.25, y: -3.49, z: 0} + m_LocalScale: {x: 3, y: 3, z: 3} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &1868623149 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1868623146} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f171f5f4ee14161469d7205da05f740e, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!114 &1868623150 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1868623146} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 941f899d293b0e44393c418cec6cc3fe, type: 3} + m_Name: + m_EditorClassIdentifier: + autoSubscribe: 1 + isDetector: 1 + radius: 0.09 +--- !u!1 &1994605370 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1994605375} + - component: {fileID: 1994605374} + - component: {fileID: 1994605373} + - component: {fileID: 1994605372} + - component: {fileID: 1994605371} + m_Layer: 0 + m_Name: Destroy On Collision Object 02 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!50 &1994605371 +Rigidbody2D: + serializedVersion: 4 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1994605370} + m_BodyType: 0 + m_Simulated: 1 + m_UseFullKinematicContacts: 0 + m_UseAutoMass: 0 + m_Mass: 1 + m_LinearDrag: 0 + m_AngularDrag: 0.05 + m_GravityScale: 1 + m_Material: {fileID: 0} + m_Interpolate: 0 + m_SleepingMode: 1 + m_CollisionDetection: 0 + m_Constraints: 0 +--- !u!114 &1994605372 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1994605370} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5b8613a98603b8a4ca993eb80bd96400, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!114 &1994605373 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1994605370} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 941f899d293b0e44393c418cec6cc3fe, type: 3} + m_Name: + m_EditorClassIdentifier: + autoSubscribe: 1 + isDetector: 1 + radius: 0.09 +--- !u!212 &1994605374 +SpriteRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1994605370} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 0 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10754, guid: 0000000000000000f000000000000000, type: 0} + 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: 0 + m_Sprite: {fileID: 10913, guid: 0000000000000000f000000000000000, type: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_FlipX: 0 + m_FlipY: 0 + m_DrawMode: 0 + m_Size: {x: 0.2, y: 0.2} + m_AdaptiveModeThreshold: 0.5 + m_SpriteTileMode: 0 + m_WasSpriteAssigned: 1 + m_MaskInteraction: 0 + m_SpriteSortPoint: 0 +--- !u!4 &1994605375 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1994605370} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 7.58, y: -2.06, z: 0} + m_LocalScale: {x: 3, y: 3, z: 3} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 6 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} diff --git "a/Assets/Theoretical Calculation/\344\275\277\347\224\250\345\255\227\345\205\270\350\241\250\347\232\204\345\215\263\346\227\266\345\210\240\351\231\244\351\200\273\350\276\221.png" "b/Assets/Theoretical Calculation/\344\275\277\347\224\250\345\255\227\345\205\270\350\241\250\347\232\204\345\215\263\346\227\266\345\210\240\351\231\244\351\200\273\350\276\221.png" deleted file mode 100644 index afc625f..0000000 --- "a/Assets/Theoretical Calculation/\344\275\277\347\224\250\345\255\227\345\205\270\350\241\250\347\232\204\345\215\263\346\227\266\345\210\240\351\231\244\351\200\273\350\276\221.png" +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9c49712a5e35f7e2b6397e07e4bce760b76d73c3b660ffc3f781e849a06756c8 -size 45972 diff --git "a/Assets/Theoretical Calculation/\345\210\227\350\241\250\345\222\214\344\272\214\345\217\211\345\240\206\347\220\206\350\256\272\351\200\237\345\272\246\345\257\271\346\257\224.cs" "b/Assets/Theoretical Calculation/\345\210\227\350\241\250\345\222\214\344\272\214\345\217\211\345\240\206\347\220\206\350\256\272\351\200\237\345\272\246\345\257\271\346\257\224.cs" deleted file mode 100644 index 4a5a8ec..0000000 --- "a/Assets/Theoretical Calculation/\345\210\227\350\241\250\345\222\214\344\272\214\345\217\211\345\240\206\347\220\206\350\256\272\351\200\237\345\272\246\345\257\271\346\257\224.cs" +++ /dev/null @@ -1,22 +0,0 @@ -/* - -列表和二叉堆的理论速度对比 - - -以单个末梢节点为基础进行对比 - -假设节点中有 1000 个碰撞器,每次更新 10% 碰撞器移出,同时移入相同数量的碰撞器,同时有 2% 的碰撞器变大,2% 的碰撞器变小 - - -使用列表保存: -只有找最大碰撞器成本,每一次更新遍历一次,时间成本 = 1000 - - -使用堆保存: -一个是排序成本:需要更新所有节点 = 遍历成本 + 排序成本 = 1000 + 排序成本 -寻找最大碰撞器成本:必是第一个,成本 = 1 - - -堆保存因为必须遍历更新,反而导致效率下降。 - - */ diff --git "a/Assets/Theoretical Calculation/\345\215\263\346\227\266\345\242\236\345\210\240\345\222\214\347\247\257\347\264\257\345\242\236\345\210\240\347\232\204\347\220\206\350\256\272\351\200\237\345\272\246\345\257\271\346\257\224.cs" "b/Assets/Theoretical Calculation/\345\215\263\346\227\266\345\242\236\345\210\240\345\222\214\347\247\257\347\264\257\345\242\236\345\210\240\347\232\204\347\220\206\350\256\272\351\200\237\345\272\246\345\257\271\346\257\224.cs" deleted file mode 100644 index 1fad90c..0000000 --- "a/Assets/Theoretical Calculation/\345\215\263\346\227\266\345\242\236\345\210\240\345\222\214\347\247\257\347\264\257\345\242\236\345\210\240\347\232\204\347\220\206\350\256\272\351\200\237\345\272\246\345\257\271\346\257\224.cs" +++ /dev/null @@ -1,96 +0,0 @@ -/* - -假设有 5层,10000 个碰撞器,1000 个节点,每次更新有 10% 碰撞器移动到其他节点,每次更新有 5% 节点移除与新增,1% 的节点合并,同时 1% 的节点拆分 - -不考虑缩放,缩放是节点内最大半径的更新相关,与增删速度无关 - -重复存入怎么办? - - -遍历节点 = 节点数 = 1000 -遍历全树 = 遍历节点 + 碰撞器数 = 1000 + 10000 = 11000 - -直接移除节点 = 1 -剪枝移除节点 = 层数 + 末梢节点数 / 2 = 5 + 5 = 10 -全树移除节点 = 遍历全树 / 2 = 5500 - -添加节点 = 层数 = 5 - -分割节点 = 末梢节点数 = 10 -合并节点 = 末梢节点数 * 4 = 40 - - -累积到更新时处理 - -不能即时返回操作结果,逻辑分步骤且简洁 - -逻辑顺序: -第一次遍历:遍历整个树、移除需要移除的节点、移除并记录越界的节点、合并需要合并的节点 -第一次遍历后:将越界的节点和新增的节点存入树,存入时根据需要进行分割 - -第一次遍历: - 遍历全树:11000 - 移除节点:直接移除节点 * 500 = 500 - 移除越界节点:直接移除节点 * 100 = 100 - 合并节点:合并节点 * 10 = 400 -第一次遍历后: - 添加节点:添加节点 * 500 = 2500 - 添加越界节点:添加节点 * 100 = 500 - 分割节点:分割节点 * 10 * 100 - -合并 = 11000 + 500 + 100 + 400 + 2500 + 500 + 100 = 15100 - - -即时处理 - -即时返回操作结果,移除功能有缺陷 - -逻辑顺序: -存入:将节点存入树,根据需要进行分割 -移除:根据位置进行移除,如果根据位置移除失败,则全树移除,之后按照需要合并 -更新遍历:遍历整个树,移除并记录越界的节点,合并需要合并的节点 -更新遍历后:将越界的节点存入树,根据需要分割 - -存入: - 添加节点 * 500 = 2500 -移除: - 剪枝移除:剪枝移除节点 * 500 = 5000 - 对越界节点进行全树移除:全树移除 * 500 * 5% = 5500 * 25 = 137500 -更新遍历: - 遍历全树 = 11000 - 移除越界节点:直接移除节点 * 100 = 100 - 合并节点:合并节点 * 10 = 400 -更新遍历后: - 添加越界节点:添加节点 * 100 = 500 - 分割节点:分割节点 * 10 * 100 - -合并 = 2500 + 5000 + 137500 + 11000 + 100 + 400 + 500 + 100 = 157100 - - -带有字典索引的即时处理 - -即时返回操作结果,逻辑纠缠复杂,因为存储了字典,可以更简单的解决重复存入问题 - -逻辑顺序: -存入:将节点存入树,根据需要进行分割 -移除:根据字典进行删除,之后按照需要合并 -更新遍历:遍历整个树,移除并记录越界的节点,合并需要合并的节点 -更新遍历后:将越界的节点存入树,根据需要分割 - -存入: - 添加节点 * 500 = 2500 -移除: - 直接移除节点 * 500 = 500 -更新遍历: - 遍历全树 = 11000 - 移除越界节点:直接移除节点 * 100 = 100 - 合并节点:合并节点 * 10 = 400 -更新遍历后: - 添加越界节点:添加节点 * 100 = 500 - 分割节点:分割节点 * 10 * 100 - -合并 = 2500 + 500 + 11000 + 100 + 400 + 500 + 100 = 15100 - - -考虑到维护字典,带字典的即时处理在内存和速度上都比更新时处理消耗大,但可以返回操作结果,Debug 也更方便 - */