From 2a68f78aed886783a23df2a62bde661b4af0eed0 Mon Sep 17 00:00:00 2001 From: Eotel <49769982+Eotel@users.noreply.github.com> Date: Fri, 23 Oct 2026 14:05:32 +0900 Subject: [PATCH 01/32] fix: avoid recreating handle managers during teardown --- .../CHANGELOG.md | 3 +++ .../Runtime/Scripts/Handle.cs | 4 ++-- .../Runtime/Scripts/Utils/Singleton.cs | 3 +++ .../Tests/Runtime/HandleInteractionTests.cs | 16 ++++++++++++++++ 4 files changed, 24 insertions(+), 2 deletions(-) diff --git a/Packages/com.orkunmanap.runtime-transform-handles/CHANGELOG.md b/Packages/com.orkunmanap.runtime-transform-handles/CHANGELOG.md index 8445f13..9fabaab 100644 --- a/Packages/com.orkunmanap.runtime-transform-handles/CHANGELOG.md +++ b/Packages/com.orkunmanap.runtime-transform-handles/CHANGELOG.md @@ -7,6 +7,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +### Fixed +- Destroying a handle after its manager no longer lazily instantiates a replacement manager during teardown. + ## [3.3.0] - 2026-06-11 ### Added diff --git a/Packages/com.orkunmanap.runtime-transform-handles/Runtime/Scripts/Handle.cs b/Packages/com.orkunmanap.runtime-transform-handles/Runtime/Scripts/Handle.cs index ea4ecd9..7e3e841 100644 --- a/Packages/com.orkunmanap.runtime-transform-handles/Runtime/Scripts/Handle.cs +++ b/Packages/com.orkunmanap.runtime-transform-handles/Runtime/Scripts/Handle.cs @@ -250,8 +250,8 @@ protected void OnDestroy() onInteractionEnd?.RemoveAllListeners(); onHandleDestroyed?.RemoveAllListeners(); - if (Manager == null) return; - Manager.RemoveHandle(this); + var manager = TransformHandleManager.ExistingInstance; + if (manager != null) manager.RemoveHandle(this); } protected virtual void LateUpdate() diff --git a/Packages/com.orkunmanap.runtime-transform-handles/Runtime/Scripts/Utils/Singleton.cs b/Packages/com.orkunmanap.runtime-transform-handles/Runtime/Scripts/Utils/Singleton.cs index cc1a8ab..b332cf1 100644 --- a/Packages/com.orkunmanap.runtime-transform-handles/Runtime/Scripts/Utils/Singleton.cs +++ b/Packages/com.orkunmanap.runtime-transform-handles/Runtime/Scripts/Utils/Singleton.cs @@ -9,6 +9,9 @@ public class Singleton : MonoBehaviour where T : Singleton { private static T _instance; + // Teardown must never invoke the lazy Instance getter and resurrect a manager. + internal static T ExistingInstance => _instance; + public static T Instance { get diff --git a/Packages/com.orkunmanap.runtime-transform-handles/Tests/Runtime/HandleInteractionTests.cs b/Packages/com.orkunmanap.runtime-transform-handles/Tests/Runtime/HandleInteractionTests.cs index c4ccb18..7b10cf7 100644 --- a/Packages/com.orkunmanap.runtime-transform-handles/Tests/Runtime/HandleInteractionTests.cs +++ b/Packages/com.orkunmanap.runtime-transform-handles/Tests/Runtime/HandleInteractionTests.cs @@ -62,6 +62,22 @@ private static int CountGhosts() #endif } + [Test] + public void Destroying_handle_after_manager_does_not_recreate_manager() + { + var handle = _manager.CreateHandle(NewObject("target").transform); + _spawned.Add(handle.gameObject); + _spawned.Add(handle.Pivot.gameObject); + Object.DestroyImmediate(_manager.gameObject); + Object.DestroyImmediate(handle.gameObject); +#if UNITY_2023_1_OR_NEWER + _manager = Object.FindFirstObjectByType(); +#else + _manager = Object.FindObjectOfType(); +#endif + Assert.IsNull(_manager, "Handle teardown must not instantiate a manager after its owner was destroyed."); + } + [Test] public void Interaction_events_fire_in_order() { From b00492471bbd40f9a1ffd8c8abbe1c1d4e05e6c5 Mon Sep 17 00:00:00 2001 From: Orkun Manap <31966136+manaporkun@users.noreply.github.com> Date: Sat, 24 Oct 2026 21:12:25 +0200 Subject: [PATCH 02/32] feat!: separate optional demos and expand runtime transform tools Add a responsive Level Editor sample, Precision handles, group rotation and uniform scaling. Harden handle ownership and lifecycle cleanup, and verify compatibility across Unity input backends. Document validation and the next demo scenarios for continued development. BREAKING CHANGE: samples move from Core into the separately installed optional demos package. Existing imported sample copies require explicit migration. --- .github/workflows/compat-floor.yml | 20 +- .github/workflows/min-api-lint.yml | 13 +- .github/workflows/publish-upm.yml | 50 +- Assets/Editor/BuildScript.cs | 111 +- .../WebGLTemplates/FullscreenEmbed/index.html | 3 + CONTRIBUTING.md | 8 +- .../CHANGELOG.md | 10 + .../CHANGELOG.md.meta | 2 + .../LICENSE.md | 21 + .../LICENSE.md.meta | 2 + .../README.md | 44 + .../README.md.meta | 2 + .../Samples~/Demo.meta | 0 .../Samples~/Demo/HandleDemo.cs | 0 .../Samples~/Demo/HandleDemo.cs.meta | 0 .../Samples~/Demo/README.md | 0 .../Samples~/Demo/README.md.meta | 0 .../Demo/RuntimeTransformHandlesDemo.unity | 0 .../RuntimeTransformHandlesDemo.unity.meta | 0 .../Demo/TransformHandles.Samples.Demo.asmdef | 0 .../TransformHandles.Samples.Demo.asmdef.meta | 0 .../Samples~/LevelEditor.meta | 3 + .../Samples~/LevelEditor/LevelEditor.mat | 28 + .../Samples~/LevelEditor/LevelEditor.mat.meta | 8 + .../Samples~/LevelEditor/LevelEditor.unity | 938 ++++ .../LevelEditor/LevelEditor.unity.meta | 7 + .../Samples~/LevelEditor/LevelEditorDemo.cs | 922 ++++ .../LevelEditor/LevelEditorDemo.cs.meta | 2 + .../LevelEditor/LevelEditorOpaque.shader | 38 + .../LevelEditor/LevelEditorOpaque.shader.meta | 2 + .../LevelEditor/LevelEditorSettings.asset | 33 + .../LevelEditorSettings.asset.meta | 8 + .../Samples~/LevelEditor/Plugins.meta | 3 + .../Plugins/LevelEditorInput.jslib | 33 + .../Plugins/LevelEditorInput.jslib.meta | 2 + .../Samples~/LevelEditor/README.md | 56 + .../Samples~/LevelEditor/README.md.meta | 2 + .../Samples~/LevelEditor/Tests.meta | 3 + .../LevelEditor/Tests/LevelEditorDemoTests.cs | 724 +++ .../Tests/LevelEditorDemoTests.cs.meta | 2 + ...rmHandles.Samples.LevelEditor.Tests.asmdef | 24 + ...dles.Samples.LevelEditor.Tests.asmdef.meta | 2 + ...ransformHandles.Samples.LevelEditor.asmdef | 34 + ...ormHandles.Samples.LevelEditor.asmdef.meta | 2 + .../Samples~/LevelEditor/UI.meta | 8 + .../Samples~/LevelEditor/UI/Move.png | Bin 0 -> 1261 bytes .../Samples~/LevelEditor/UI/Move.png.meta | 45 + .../Samples~/LevelEditor/UI/Panel.png | Bin 0 -> 562 bytes .../Samples~/LevelEditor/UI/Panel.png.meta | 45 + .../Samples~/LevelEditor/UI/Rotate.png | Bin 0 -> 1632 bytes .../Samples~/LevelEditor/UI/Rotate.png.meta | 45 + .../Samples~/LevelEditor/UI/Scale.png | Bin 0 -> 873 bytes .../Samples~/LevelEditor/UI/Scale.png.meta | 45 + .../Third Party Notices.md | 60 + .../Third Party Notices.md.meta | 2 + .../package.json | 30 + .../package.json.meta | 2 + .../CHANGELOG.md | 71 + .../Documentation~/index.md | 184 +- .../Editor/PrecisionHandleAssetBuilder.cs | 180 + .../PrecisionHandleAssetBuilder.cs.meta | 11 + .../Editor/TransformHandleLayerSetup.cs.meta | 11 +- .../README.md | 149 +- .../Runtime/Materials/PrecisionArc.mat | 27 + .../Runtime/Materials/PrecisionArc.mat.meta | 8 + .../Runtime/Materials/PrecisionBacking.mat | 27 + .../Materials/PrecisionBacking.mat.meta | 8 + .../Runtime/Materials/PrecisionCenter.mat | 27 + .../Materials/PrecisionCenter.mat.meta | 8 + .../Runtime/Materials/PrecisionMoveX.mat | 27 + .../Runtime/Materials/PrecisionMoveX.mat.meta | 8 + .../Runtime/Materials/PrecisionMoveY.mat | 27 + .../Runtime/Materials/PrecisionMoveY.mat.meta | 8 + .../Runtime/Materials/PrecisionMoveZ.mat | 27 + .../Runtime/Materials/PrecisionMoveZ.mat.meta | 8 + .../Runtime/Materials/PrecisionPlaneX.mat | 29 + .../Materials/PrecisionPlaneX.mat.meta | 8 + .../Runtime/Materials/PrecisionPlaneY.mat | 29 + .../Materials/PrecisionPlaneY.mat.meta | 8 + .../Runtime/Materials/PrecisionPlaneZ.mat | 29 + .../Materials/PrecisionPlaneZ.mat.meta | 8 + .../Runtime/Materials/PrecisionRotateX.mat | 27 + .../Materials/PrecisionRotateX.mat.meta | 8 + .../Runtime/Materials/PrecisionRotateY.mat | 27 + .../Materials/PrecisionRotateY.mat.meta | 8 + .../Runtime/Materials/PrecisionRotateZ.mat | 27 + .../Materials/PrecisionRotateZ.mat.meta | 8 + .../Runtime/Materials/PrecisionScaleX.mat | 27 + .../Materials/PrecisionScaleX.mat.meta | 8 + .../Runtime/Materials/PrecisionScaleY.mat | 27 + .../Materials/PrecisionScaleY.mat.meta | 8 + .../Runtime/Materials/PrecisionScaleZ.mat | 27 + .../Materials/PrecisionScaleZ.mat.meta | 8 + .../Runtime/Models/PrecisionCone.asset | 166 + .../Runtime/Models/PrecisionCone.asset.meta | 8 + .../Runtime/Models/PrecisionPlanePad.asset | 166 + .../Models/PrecisionPlanePad.asset.meta | 8 + .../Runtime/Models/PrecisionRing.asset | 166 + .../Runtime/Models/PrecisionRing.asset.meta | 8 + .../Runtime/Models/PrecisionRingBacking.asset | 166 + .../Models/PrecisionRingBacking.asset.meta | 8 + .../Runtime/Models/PrecisionTube.asset | 166 + .../Runtime/Models/PrecisionTube.asset.meta | 8 + .../Prefabs/PrecisionTransformHandle.prefab | 4157 +++++++++++++++++ .../PrecisionTransformHandle.prefab.meta | 7 + .../Resources/TransformHandleManager.prefab | 7 +- .../Runtime/Scripts/Handle.cs | 184 +- .../Scripts/HandleComponents/HandleBase.cs | 9 + .../HandleComponents/Position/PositionAxis.cs | 14 +- .../Position/PositionPlane.cs | 29 +- .../HandleComponents/Rotation/RotationAxis.cs | 9 + .../HandleComponents/Scale/ScaleAxis.cs | 8 +- .../HandleComponents/Scale/ScaleHandle.cs | 27 +- .../Runtime/Scripts/TransformGroup.cs | 162 +- .../Runtime/Scripts/TransformHandleManager.cs | 863 +++- .../Scripts/TransformHandleSettings.cs | 12 + .../Scripts/TransformHandleSettings.cs.meta | 11 +- .../Utils/HandleTransformUtility.cs.meta | 11 +- .../Scripts/Utils/InputWrapper.cs.meta | 11 +- .../Runtime/Shader/PrecisionHandle.shader | 134 + .../Shader/PrecisionHandle.shader.meta | 10 + .../HandleTransformUtilityTests.cs.meta | 11 +- .../Tests/Editor/PlayModeSessionTests.cs | 271 ++ .../Tests/Editor/PlayModeSessionTests.cs.meta | 11 + .../Tests/Editor/PrecisionPrefabTests.cs | 121 + .../Tests/Editor/PrecisionPrefabTests.cs.meta | 2 + .../Tests/Runtime/DisabledLifecycleTests.cs | 757 +++ .../Runtime/DisabledLifecycleTests.cs.meta | 11 + .../Tests/Runtime/FirstFrameVisualTests.cs | 259 + .../Runtime/FirstFrameVisualTests.cs.meta | 2 + .../Tests/Runtime/HandleInteractionTests.cs | 17 +- .../Tests/Runtime/OwnershipLifecycleTests.cs | 692 +++ .../Runtime/OwnershipLifecycleTests.cs.meta | 11 + .../Tests/Runtime/PassiveAccessTests.cs | 542 +++ .../Tests/Runtime/PassiveAccessTests.cs.meta | 11 + .../Tests/Runtime/TargetLifecycleTests.cs | 685 +++ .../Runtime/TargetLifecycleTests.cs.meta | 11 + .../Tests/Runtime/TransformGroupTests.cs | 129 + .../Runtime/TransformHandleManagerTests.cs | 98 + .../package.json | 9 +- README.md | 17 +- ci/README.md | 84 + ci/floor-2021/README.md | 5 + ci/required-editmode.txt | 74 + ci/required-playmode.txt | 176 + ci/test-level-editor-input.cjs | 50 + ci/test_package_boundaries.py | 110 + ci/test_verify_unity_results.py | 136 + ci/verify-package-boundaries.py | 83 + ci/verify-unity-results.py | 183 + docs/DEVELOPMENT-HANDOFF.md | 70 + 151 files changed, 15525 insertions(+), 229 deletions(-) create mode 100644 Packages/com.orkunmanap.runtime-transform-handles.demos/CHANGELOG.md create mode 100644 Packages/com.orkunmanap.runtime-transform-handles.demos/CHANGELOG.md.meta create mode 100644 Packages/com.orkunmanap.runtime-transform-handles.demos/LICENSE.md create mode 100644 Packages/com.orkunmanap.runtime-transform-handles.demos/LICENSE.md.meta create mode 100644 Packages/com.orkunmanap.runtime-transform-handles.demos/README.md create mode 100644 Packages/com.orkunmanap.runtime-transform-handles.demos/README.md.meta rename Packages/{com.orkunmanap.runtime-transform-handles => com.orkunmanap.runtime-transform-handles.demos}/Samples~/Demo.meta (100%) rename Packages/{com.orkunmanap.runtime-transform-handles => com.orkunmanap.runtime-transform-handles.demos}/Samples~/Demo/HandleDemo.cs (100%) rename Packages/{com.orkunmanap.runtime-transform-handles => com.orkunmanap.runtime-transform-handles.demos}/Samples~/Demo/HandleDemo.cs.meta (100%) rename Packages/{com.orkunmanap.runtime-transform-handles => com.orkunmanap.runtime-transform-handles.demos}/Samples~/Demo/README.md (100%) rename Packages/{com.orkunmanap.runtime-transform-handles => com.orkunmanap.runtime-transform-handles.demos}/Samples~/Demo/README.md.meta (100%) rename Packages/{com.orkunmanap.runtime-transform-handles => com.orkunmanap.runtime-transform-handles.demos}/Samples~/Demo/RuntimeTransformHandlesDemo.unity (100%) rename Packages/{com.orkunmanap.runtime-transform-handles => com.orkunmanap.runtime-transform-handles.demos}/Samples~/Demo/RuntimeTransformHandlesDemo.unity.meta (100%) rename Packages/{com.orkunmanap.runtime-transform-handles => com.orkunmanap.runtime-transform-handles.demos}/Samples~/Demo/TransformHandles.Samples.Demo.asmdef (100%) rename Packages/{com.orkunmanap.runtime-transform-handles => com.orkunmanap.runtime-transform-handles.demos}/Samples~/Demo/TransformHandles.Samples.Demo.asmdef.meta (100%) create mode 100644 Packages/com.orkunmanap.runtime-transform-handles.demos/Samples~/LevelEditor.meta create mode 100644 Packages/com.orkunmanap.runtime-transform-handles.demos/Samples~/LevelEditor/LevelEditor.mat create mode 100644 Packages/com.orkunmanap.runtime-transform-handles.demos/Samples~/LevelEditor/LevelEditor.mat.meta create mode 100644 Packages/com.orkunmanap.runtime-transform-handles.demos/Samples~/LevelEditor/LevelEditor.unity create mode 100644 Packages/com.orkunmanap.runtime-transform-handles.demos/Samples~/LevelEditor/LevelEditor.unity.meta create mode 100644 Packages/com.orkunmanap.runtime-transform-handles.demos/Samples~/LevelEditor/LevelEditorDemo.cs create mode 100644 Packages/com.orkunmanap.runtime-transform-handles.demos/Samples~/LevelEditor/LevelEditorDemo.cs.meta create mode 100644 Packages/com.orkunmanap.runtime-transform-handles.demos/Samples~/LevelEditor/LevelEditorOpaque.shader create mode 100644 Packages/com.orkunmanap.runtime-transform-handles.demos/Samples~/LevelEditor/LevelEditorOpaque.shader.meta create mode 100644 Packages/com.orkunmanap.runtime-transform-handles.demos/Samples~/LevelEditor/LevelEditorSettings.asset create mode 100644 Packages/com.orkunmanap.runtime-transform-handles.demos/Samples~/LevelEditor/LevelEditorSettings.asset.meta create mode 100644 Packages/com.orkunmanap.runtime-transform-handles.demos/Samples~/LevelEditor/Plugins.meta create mode 100644 Packages/com.orkunmanap.runtime-transform-handles.demos/Samples~/LevelEditor/Plugins/LevelEditorInput.jslib create mode 100644 Packages/com.orkunmanap.runtime-transform-handles.demos/Samples~/LevelEditor/Plugins/LevelEditorInput.jslib.meta create mode 100644 Packages/com.orkunmanap.runtime-transform-handles.demos/Samples~/LevelEditor/README.md create mode 100644 Packages/com.orkunmanap.runtime-transform-handles.demos/Samples~/LevelEditor/README.md.meta create mode 100644 Packages/com.orkunmanap.runtime-transform-handles.demos/Samples~/LevelEditor/Tests.meta create mode 100644 Packages/com.orkunmanap.runtime-transform-handles.demos/Samples~/LevelEditor/Tests/LevelEditorDemoTests.cs create mode 100644 Packages/com.orkunmanap.runtime-transform-handles.demos/Samples~/LevelEditor/Tests/LevelEditorDemoTests.cs.meta create mode 100644 Packages/com.orkunmanap.runtime-transform-handles.demos/Samples~/LevelEditor/Tests/TransformHandles.Samples.LevelEditor.Tests.asmdef create mode 100644 Packages/com.orkunmanap.runtime-transform-handles.demos/Samples~/LevelEditor/Tests/TransformHandles.Samples.LevelEditor.Tests.asmdef.meta create mode 100644 Packages/com.orkunmanap.runtime-transform-handles.demos/Samples~/LevelEditor/TransformHandles.Samples.LevelEditor.asmdef create mode 100644 Packages/com.orkunmanap.runtime-transform-handles.demos/Samples~/LevelEditor/TransformHandles.Samples.LevelEditor.asmdef.meta create mode 100644 Packages/com.orkunmanap.runtime-transform-handles.demos/Samples~/LevelEditor/UI.meta create mode 100644 Packages/com.orkunmanap.runtime-transform-handles.demos/Samples~/LevelEditor/UI/Move.png create mode 100644 Packages/com.orkunmanap.runtime-transform-handles.demos/Samples~/LevelEditor/UI/Move.png.meta create mode 100644 Packages/com.orkunmanap.runtime-transform-handles.demos/Samples~/LevelEditor/UI/Panel.png create mode 100644 Packages/com.orkunmanap.runtime-transform-handles.demos/Samples~/LevelEditor/UI/Panel.png.meta create mode 100644 Packages/com.orkunmanap.runtime-transform-handles.demos/Samples~/LevelEditor/UI/Rotate.png create mode 100644 Packages/com.orkunmanap.runtime-transform-handles.demos/Samples~/LevelEditor/UI/Rotate.png.meta create mode 100644 Packages/com.orkunmanap.runtime-transform-handles.demos/Samples~/LevelEditor/UI/Scale.png create mode 100644 Packages/com.orkunmanap.runtime-transform-handles.demos/Samples~/LevelEditor/UI/Scale.png.meta create mode 100644 Packages/com.orkunmanap.runtime-transform-handles.demos/Third Party Notices.md create mode 100644 Packages/com.orkunmanap.runtime-transform-handles.demos/Third Party Notices.md.meta create mode 100644 Packages/com.orkunmanap.runtime-transform-handles.demos/package.json create mode 100644 Packages/com.orkunmanap.runtime-transform-handles.demos/package.json.meta create mode 100644 Packages/com.orkunmanap.runtime-transform-handles/Editor/PrecisionHandleAssetBuilder.cs create mode 100644 Packages/com.orkunmanap.runtime-transform-handles/Editor/PrecisionHandleAssetBuilder.cs.meta create mode 100644 Packages/com.orkunmanap.runtime-transform-handles/Runtime/Materials/PrecisionArc.mat create mode 100644 Packages/com.orkunmanap.runtime-transform-handles/Runtime/Materials/PrecisionArc.mat.meta create mode 100644 Packages/com.orkunmanap.runtime-transform-handles/Runtime/Materials/PrecisionBacking.mat create mode 100644 Packages/com.orkunmanap.runtime-transform-handles/Runtime/Materials/PrecisionBacking.mat.meta create mode 100644 Packages/com.orkunmanap.runtime-transform-handles/Runtime/Materials/PrecisionCenter.mat create mode 100644 Packages/com.orkunmanap.runtime-transform-handles/Runtime/Materials/PrecisionCenter.mat.meta create mode 100644 Packages/com.orkunmanap.runtime-transform-handles/Runtime/Materials/PrecisionMoveX.mat create mode 100644 Packages/com.orkunmanap.runtime-transform-handles/Runtime/Materials/PrecisionMoveX.mat.meta create mode 100644 Packages/com.orkunmanap.runtime-transform-handles/Runtime/Materials/PrecisionMoveY.mat create mode 100644 Packages/com.orkunmanap.runtime-transform-handles/Runtime/Materials/PrecisionMoveY.mat.meta create mode 100644 Packages/com.orkunmanap.runtime-transform-handles/Runtime/Materials/PrecisionMoveZ.mat create mode 100644 Packages/com.orkunmanap.runtime-transform-handles/Runtime/Materials/PrecisionMoveZ.mat.meta create mode 100644 Packages/com.orkunmanap.runtime-transform-handles/Runtime/Materials/PrecisionPlaneX.mat create mode 100644 Packages/com.orkunmanap.runtime-transform-handles/Runtime/Materials/PrecisionPlaneX.mat.meta create mode 100644 Packages/com.orkunmanap.runtime-transform-handles/Runtime/Materials/PrecisionPlaneY.mat create mode 100644 Packages/com.orkunmanap.runtime-transform-handles/Runtime/Materials/PrecisionPlaneY.mat.meta create mode 100644 Packages/com.orkunmanap.runtime-transform-handles/Runtime/Materials/PrecisionPlaneZ.mat create mode 100644 Packages/com.orkunmanap.runtime-transform-handles/Runtime/Materials/PrecisionPlaneZ.mat.meta create mode 100644 Packages/com.orkunmanap.runtime-transform-handles/Runtime/Materials/PrecisionRotateX.mat create mode 100644 Packages/com.orkunmanap.runtime-transform-handles/Runtime/Materials/PrecisionRotateX.mat.meta create mode 100644 Packages/com.orkunmanap.runtime-transform-handles/Runtime/Materials/PrecisionRotateY.mat create mode 100644 Packages/com.orkunmanap.runtime-transform-handles/Runtime/Materials/PrecisionRotateY.mat.meta create mode 100644 Packages/com.orkunmanap.runtime-transform-handles/Runtime/Materials/PrecisionRotateZ.mat create mode 100644 Packages/com.orkunmanap.runtime-transform-handles/Runtime/Materials/PrecisionRotateZ.mat.meta create mode 100644 Packages/com.orkunmanap.runtime-transform-handles/Runtime/Materials/PrecisionScaleX.mat create mode 100644 Packages/com.orkunmanap.runtime-transform-handles/Runtime/Materials/PrecisionScaleX.mat.meta create mode 100644 Packages/com.orkunmanap.runtime-transform-handles/Runtime/Materials/PrecisionScaleY.mat create mode 100644 Packages/com.orkunmanap.runtime-transform-handles/Runtime/Materials/PrecisionScaleY.mat.meta create mode 100644 Packages/com.orkunmanap.runtime-transform-handles/Runtime/Materials/PrecisionScaleZ.mat create mode 100644 Packages/com.orkunmanap.runtime-transform-handles/Runtime/Materials/PrecisionScaleZ.mat.meta create mode 100644 Packages/com.orkunmanap.runtime-transform-handles/Runtime/Models/PrecisionCone.asset create mode 100644 Packages/com.orkunmanap.runtime-transform-handles/Runtime/Models/PrecisionCone.asset.meta create mode 100644 Packages/com.orkunmanap.runtime-transform-handles/Runtime/Models/PrecisionPlanePad.asset create mode 100644 Packages/com.orkunmanap.runtime-transform-handles/Runtime/Models/PrecisionPlanePad.asset.meta create mode 100644 Packages/com.orkunmanap.runtime-transform-handles/Runtime/Models/PrecisionRing.asset create mode 100644 Packages/com.orkunmanap.runtime-transform-handles/Runtime/Models/PrecisionRing.asset.meta create mode 100644 Packages/com.orkunmanap.runtime-transform-handles/Runtime/Models/PrecisionRingBacking.asset create mode 100644 Packages/com.orkunmanap.runtime-transform-handles/Runtime/Models/PrecisionRingBacking.asset.meta create mode 100644 Packages/com.orkunmanap.runtime-transform-handles/Runtime/Models/PrecisionTube.asset create mode 100644 Packages/com.orkunmanap.runtime-transform-handles/Runtime/Models/PrecisionTube.asset.meta create mode 100644 Packages/com.orkunmanap.runtime-transform-handles/Runtime/Prefabs/PrecisionTransformHandle.prefab create mode 100644 Packages/com.orkunmanap.runtime-transform-handles/Runtime/Prefabs/PrecisionTransformHandle.prefab.meta create mode 100644 Packages/com.orkunmanap.runtime-transform-handles/Runtime/Shader/PrecisionHandle.shader create mode 100644 Packages/com.orkunmanap.runtime-transform-handles/Runtime/Shader/PrecisionHandle.shader.meta create mode 100644 Packages/com.orkunmanap.runtime-transform-handles/Tests/Editor/PlayModeSessionTests.cs create mode 100644 Packages/com.orkunmanap.runtime-transform-handles/Tests/Editor/PlayModeSessionTests.cs.meta create mode 100644 Packages/com.orkunmanap.runtime-transform-handles/Tests/Editor/PrecisionPrefabTests.cs create mode 100644 Packages/com.orkunmanap.runtime-transform-handles/Tests/Editor/PrecisionPrefabTests.cs.meta create mode 100644 Packages/com.orkunmanap.runtime-transform-handles/Tests/Runtime/DisabledLifecycleTests.cs create mode 100644 Packages/com.orkunmanap.runtime-transform-handles/Tests/Runtime/DisabledLifecycleTests.cs.meta create mode 100644 Packages/com.orkunmanap.runtime-transform-handles/Tests/Runtime/FirstFrameVisualTests.cs create mode 100644 Packages/com.orkunmanap.runtime-transform-handles/Tests/Runtime/FirstFrameVisualTests.cs.meta create mode 100644 Packages/com.orkunmanap.runtime-transform-handles/Tests/Runtime/OwnershipLifecycleTests.cs create mode 100644 Packages/com.orkunmanap.runtime-transform-handles/Tests/Runtime/OwnershipLifecycleTests.cs.meta create mode 100644 Packages/com.orkunmanap.runtime-transform-handles/Tests/Runtime/PassiveAccessTests.cs create mode 100644 Packages/com.orkunmanap.runtime-transform-handles/Tests/Runtime/PassiveAccessTests.cs.meta create mode 100644 Packages/com.orkunmanap.runtime-transform-handles/Tests/Runtime/TargetLifecycleTests.cs create mode 100644 Packages/com.orkunmanap.runtime-transform-handles/Tests/Runtime/TargetLifecycleTests.cs.meta create mode 100644 ci/README.md create mode 100644 ci/required-editmode.txt create mode 100644 ci/required-playmode.txt create mode 100644 ci/test-level-editor-input.cjs create mode 100644 ci/test_package_boundaries.py create mode 100644 ci/test_verify_unity_results.py create mode 100644 ci/verify-package-boundaries.py create mode 100644 ci/verify-unity-results.py create mode 100644 docs/DEVELOPMENT-HANDOFF.md diff --git a/.github/workflows/compat-floor.yml b/.github/workflows/compat-floor.yml index 2046f44..a914c15 100644 --- a/.github/workflows/compat-floor.yml +++ b/.github/workflows/compat-floor.yml @@ -11,12 +11,16 @@ on: - main paths: - "Packages/com.orkunmanap.runtime-transform-handles/**" - - "ci/floor-2021/**" + - "Packages/com.orkunmanap.runtime-transform-handles.demos/**" + - "Assets/Editor/**" + - "ci/**" - ".github/workflows/compat-floor.yml" pull_request: paths: - "Packages/com.orkunmanap.runtime-transform-handles/**" - - "ci/floor-2021/**" + - "Packages/com.orkunmanap.runtime-transform-handles.demos/**" + - "Assets/Editor/**" + - "ci/**" - ".github/workflows/compat-floor.yml" permissions: {} @@ -75,6 +79,11 @@ jobs: restore-keys: | FloorLibrary- + - name: Prepare fresh test evidence + run: | + python3 -m unittest discover -s ci -p 'test_*.py' + python3 ci/verify-unity-results.py prepare --project ci/floor-2021 --package Packages/com.orkunmanap.runtime-transform-handles --out artifacts/evidence --unity 2021.3.45f1 --input 0 + - name: Run tests uses: game-ci/unity-test-runner@0ff419b913a3630032cbe0de48a0099b5a9f0ed9 # v4 env: @@ -87,9 +96,16 @@ jobs: projectPath: ci/floor-2021 unityVersion: 2021.3.45f1 testMode: all + customParameters: -transformHandlesIsolatedTests githubToken: ${{ secrets.GITHUB_TOKEN }} checkName: Floor (2021.3) test results + - name: Collect and verify test evidence + if: always() + run: | + python3 ci/verify-unity-results.py collect --out artifacts/evidence --play-xml artifacts/playmode-results.xml --edit-xml artifacts/editmode-results.xml --play-log artifacts/playmode.log --edit-log artifacts/editmode.log + python3 ci/verify-unity-results.py verify --out artifacts/evidence + - name: Upload test results if: always() uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7 diff --git a/.github/workflows/min-api-lint.yml b/.github/workflows/min-api-lint.yml index 4b028e9..10cabf5 100644 --- a/.github/workflows/min-api-lint.yml +++ b/.github/workflows/min-api-lint.yml @@ -13,10 +13,12 @@ on: - main paths: - "Packages/**" + - "ci/test-level-editor-input.cjs" - ".github/workflows/min-api-lint.yml" pull_request: paths: - "Packages/**" + - "ci/test-level-editor-input.cjs" - ".github/workflows/min-api-lint.yml" permissions: @@ -33,7 +35,7 @@ jobs: - name: Scan for unguarded post-2021.3 APIs run: | set -uo pipefail - PKG="Packages/com.orkunmanap.runtime-transform-handles" + PACKAGES=("Packages/com.orkunmanap.runtime-transform-handles" "Packages/com.orkunmanap.runtime-transform-handles.demos") # APIs introduced after 2021.3.0 (Find*ByType: 2021.3.18f1 / 2022.2). Add more here as # the floor concern grows. FindObjectOfType (the pre-2021.3 API) is intentionally allowed. @@ -55,7 +57,7 @@ jobs: printf "%s:%d:%s\n", file, NR, $0 } ' "$f" - done < <(find "$PKG" -name '*.cs' -print0)) + done < <(find "${PACKAGES[@]}" -name '*.cs' -print0)) if [ -n "$HITS" ]; then echo "::error::Unguarded post-2021.3 API usage (wrap in '#if UNITY_2023_1_OR_NEWER ... #else #endif'):" @@ -68,12 +70,12 @@ jobs: - name: Reject UTF-8 BOM in package .meta files run: | set -uo pipefail - PKG="Packages/com.orkunmanap.runtime-transform-handles" + PACKAGES=("Packages/com.orkunmanap.runtime-transform-handles" "Packages/com.orkunmanap.runtime-transform-handles.demos") BOM=$(while IFS= read -r -d '' f; do if [ "$(head -c 3 "$f" | xxd -p)" = "efbbbf" ]; then echo "$f" fi - done < <(find "$PKG" -name '*.meta' -print0)) + done < <(find "${PACKAGES[@]}" -name '*.meta' -print0)) if [ -n "$BOM" ]; then echo "::error::UTF-8 BOM in Unity .meta files can break script GUIDs after reimport:" @@ -82,3 +84,6 @@ jobs: fi echo "Meta lint passed: no UTF-8 BOM in package .meta files." + + - name: Check WebGL sample input bridge + run: node ci/test-level-editor-input.cjs diff --git a/.github/workflows/publish-upm.yml b/.github/workflows/publish-upm.yml index 8039d01..2d3ac4e 100644 --- a/.github/workflows/publish-upm.yml +++ b/.github/workflows/publish-upm.yml @@ -48,6 +48,7 @@ jobs: - 'Packages/**' - 'Assets/**' - 'ProjectSettings/**' + - 'ci/**' - '.github/workflows/publish-upm.yml' - name: Check Unity credentials @@ -75,6 +76,11 @@ jobs: - name: Checkout repository uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6 + - name: Validate package boundaries + run: | + python3 -m unittest discover -s ci -p 'test_*.py' + python3 ci/verify-package-boundaries.py + - name: Validate manifest & structure run: | set -uo pipefail @@ -123,7 +129,11 @@ jobs: # before it reaches main. Skips neutrally (not red) when Unity credentials are # unavailable (Dependabot/forks) and on docs-only PRs; pushes to main always test. test: - name: Tests (EditMode + PlayMode) + name: Tests (input ${{ matrix.input }}) + strategy: + fail-fast: false + matrix: + input: [0, 1] needs: preflight if: >- needs.preflight.outputs.has-unity-secrets == 'true' && @@ -145,9 +155,27 @@ jobs: uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5 with: path: Library - key: Library-${{ hashFiles('Packages/**', 'ProjectSettings/**') }} + key: Library-input${{ matrix.input }}-${{ hashFiles('Packages/**', 'ProjectSettings/**') }} restore-keys: | - Library- + Library-input${{ matrix.input }}- + + - name: Select input backend + env: + INPUT_MODE: ${{ matrix.input }} + run: | + python3 - <<'PYINPUT' + import os, re + from pathlib import Path + p = Path('ProjectSettings/ProjectSettings.asset') + content, count = re.subn(r'(?m)^ activeInputHandler: [01]$', ' activeInputHandler: ' + os.environ['INPUT_MODE'], p.read_text()) + assert count == 1, 'expected exactly one input setting' + p.write_text(content) + PYINPUT + + - name: Prepare fresh test evidence + run: | + python3 -m unittest discover -s ci -p 'test_*.py' + python3 ci/verify-unity-results.py prepare --project . --package Packages/com.orkunmanap.runtime-transform-handles --out artifacts/evidence --unity 6000.3.16f1 --input ${{ matrix.input }} - name: Run tests uses: game-ci/unity-test-runner@0ff419b913a3630032cbe0de48a0099b5a9f0ed9 # v4 @@ -160,13 +188,21 @@ jobs: with: unityVersion: 6000.3.16f1 testMode: all + customParameters: -transformHandlesIsolatedTests githubToken: ${{ secrets.GITHUB_TOKEN }} + checkName: Unity 6 input ${{ matrix.input }} results + + - name: Collect and verify test evidence + if: always() + run: | + python3 ci/verify-unity-results.py collect --out artifacts/evidence --play-xml artifacts/playmode-results.xml --edit-xml artifacts/editmode-results.xml --play-log artifacts/playmode.log --edit-log artifacts/editmode.log + python3 ci/verify-unity-results.py verify --out artifacts/evidence - name: Upload test results if: always() uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7 with: - name: test-results + name: test-results-input${{ matrix.input }} path: artifacts if-no-files-found: ignore @@ -280,7 +316,7 @@ jobs: fi # Full messages (%B) so `BREAKING CHANGE:` footers are seen, not just subjects. - COMMITS=$(git log $RANGE --format=%B) + COMMITS=$(git log $RANGE --format=%B -- "$PACKAGE_PATH") # Release notes: prefer the curated [Unreleased] section of the CHANGELOG. If it has # real content it becomes the release entries verbatim (and is consumed below when the @@ -300,7 +336,7 @@ jobs: # sed '/./,$!d' strips the leading blank lines left by the heading separator. printf '%s\n' "$UNRELEASED_BODY" | sed '/./,$!d' > /tmp/release_entries.md else - git log $RANGE --no-merges --pretty=tformat:"%s" \ + git log $RANGE --no-merges --pretty=tformat:"%s" -- "$PACKAGE_PATH" \ | grep -vE '^chore: bump version to' > /tmp/subjects.txt || true awk ' { @@ -346,7 +382,7 @@ jobs: elif echo "$COMMITS" | grep -qiE "^(docs|style|chore|ci|test|build)(\(.+\))?:"; then # Housekeeping types bump only when SHIPPING code/manifest changed (not Tests/ or Samples~/), # otherwise adding a test would cut a pointless release. - if git log $RANGE --name-only --pretty=format: | sort -u \ + if git log $RANGE --name-only --pretty=format: -- "$PACKAGE_PATH" | sort -u \ | grep -vE "/Tests/|/Samples~/" \ | grep -qE "\.cs$|package\.json$"; then BUMP="patch" diff --git a/Assets/Editor/BuildScript.cs b/Assets/Editor/BuildScript.cs index 4353e3d..876860e 100644 --- a/Assets/Editor/BuildScript.cs +++ b/Assets/Editor/BuildScript.cs @@ -1,5 +1,7 @@ using System; using System.IO; +using System.Collections.Generic; +using System.Text.RegularExpressions; using System.Linq; using System.Threading; using UnityEditor; @@ -16,24 +18,32 @@ public static class BuildScript // The public WebGL page builds the package's canonical sample (single source of truth). // The sample ships inside the package's hidden Samples~ folder, so it isn't part of the // project until imported into Assets/Samples — see ResolveSampleScenePath. - private const string PackageName = "com.orkunmanap.runtime-transform-handles"; + private const string PackageName = "com.orkunmanap.runtime-transform-handles.demos"; private const string SampleSceneName = "RuntimeTransformHandlesDemo"; [MenuItem("Tools/Build/WebGL (GitHub Pages)")] public static void BuildWebGLFromMenu() { - BuildWebGL(DefaultOutputPath); + BuildWebGL(DefaultOutputPath, "Runtime Transform Handles Demo", "Demo", SampleSceneName); } public static void BuildWebGLForPages() { var buildPath = GetCommandLineArgument("-buildPath") ?? DefaultOutputPath; - BuildWebGL(buildPath); + BuildWebGL(buildPath, "Runtime Transform Handles Demo", "Demo", SampleSceneName); } - private static void BuildWebGL(string outputPath) + public static void BuildLevelEditorWebGL() { - var scenePath = ResolveSampleScenePath(); + BuildWebGL(GetCommandLineArgument("-buildPath") ?? "Build/LevelEditorWebGL", + "Level Editor", "LevelEditor", "LevelEditor"); + } + + private static void BuildWebGL(string outputPath, string sampleName, string sampleFolder, string sceneName) + { + if (Application.isBatchMode && EditorUserBuildSettings.activeBuildTarget != BuildTarget.WebGL) + throw new InvalidOperationException("Start Unity with -buildTarget WebGL before executing this build method."); + var scenePath = ResolveSampleScenePath(sampleName, sampleFolder, sceneName); var previousTemplate = PlayerSettings.WebGL.template; var previousCompressionFormat = PlayerSettings.WebGL.compressionFormat; @@ -84,74 +94,75 @@ private static void BuildWebGL(string outputPath) // Locates the demo scene, importing the package sample on demand. The sample lives in the // package's Samples~ folder (hidden from Unity), so on a clean CI checkout it must be copied // into Assets/Samples first. Assets/Samples is gitignored — this is the only place it appears. - private static string ResolveSampleScenePath() + private static string ResolveSampleScenePath(string sampleName, string sampleFolder, string sceneName) { - var existing = FindSampleScene(); - if (existing != null) return existing; - - var samples = Sample.FindByPackage(PackageName, ResolvePackageVersion()).ToArray(); - if (samples.Length == 0) + var package = ResolvePackage(); + var matches = Sample.FindByPackage(PackageName, package.version) + .Where(sample => sample.displayName == sampleName).ToArray(); + if (matches.Length != 1) + throw new InvalidOperationException($"Expected one '{sampleName}' sample in '{PackageName}'."); + + var selected = matches[0]; + var source = Path.Combine(package.resolvedPath, "Samples~", sampleFolder); + RejectDuplicateImports(source, selected.importPath); + var scenePath = Path.Combine(selected.importPath, sceneName + ".unity").Replace('\\', '/'); + if (!File.Exists(scenePath)) { - throw new InvalidOperationException( - $"No samples registered for package '{PackageName}'."); + // Existing imports may be customized. Never overwrite or delete them as a build side effect. + if (Directory.Exists(selected.importPath) && Directory.EnumerateFileSystemEntries(selected.importPath).Any()) + throw new InvalidOperationException($"Existing sample import lacks '{sceneName}.unity': {selected.importPath}"); + if (!selected.Import(Sample.ImportOptions.HideImportWindow)) + throw new InvalidOperationException($"Failed to import '{sampleName}'."); + AssetDatabase.Refresh(ImportAssetOptions.ForceSynchronousImport); } - - foreach (var sample in samples) - { - if (!sample.Import(Sample.ImportOptions.OverridePreviousImports | - Sample.ImportOptions.HideImportWindow)) - { - throw new InvalidOperationException( - $"Failed to import sample '{sample.displayName}' from '{PackageName}'."); - } - } - - // Force a synchronous import so the copied scene/scripts are registered (and, in batch - // mode, compiled) before BuildPlayer runs. - AssetDatabase.Refresh(ImportAssetOptions.ForceSynchronousImport); - - var scenePath = FindSampleScene(); - if (scenePath == null) - { - throw new InvalidOperationException( - $"Imported sample(s) but '{SampleSceneName}.unity' was not found under Assets."); - } - + if (!File.Exists(scenePath)) + throw new InvalidOperationException($"Imported sample scene not found: {scenePath}"); + // Sample.importPath is absolute in some Editor versions; BuildPipeline expects Assets-relative paths. + var projectRoot = Path.GetFullPath(".").TrimEnd(Path.DirectorySeparatorChar) + Path.DirectorySeparatorChar; + var absoluteScene = Path.GetFullPath(scenePath); + if (!absoluteScene.StartsWith(projectRoot + "Assets" + Path.DirectorySeparatorChar, StringComparison.Ordinal)) + throw new InvalidOperationException($"Sample scene is outside this project's Assets folder: {scenePath}"); + scenePath = absoluteScene.Substring(projectRoot.Length).Replace('\\', '/'); Debug.Log($"Building WebGL from imported sample scene: {scenePath}"); return scenePath; } - private static string FindSampleScene() + private static void RejectDuplicateImports(string sourcePath, string selectedImport) { - foreach (var guid in AssetDatabase.FindAssets($"{SampleSceneName} t:Scene")) + var sourceGuids = new HashSet(Directory.GetFiles(sourcePath, "*.meta", SearchOption.AllDirectories) + .Select(ReadGuid).Where(guid => guid != null)); + var allowed = Path.GetFullPath(selectedImport).TrimEnd(Path.DirectorySeparatorChar) + Path.DirectorySeparatorChar; + foreach (var meta in Directory.GetFiles("Assets", "*.meta", SearchOption.AllDirectories)) { - var path = AssetDatabase.GUIDToAssetPath(guid); - if (Path.GetFileNameWithoutExtension(path) == SampleSceneName) - { - return path; - } + if (Path.GetFullPath(meta).StartsWith(allowed, StringComparison.Ordinal)) continue; + var guid = ReadGuid(meta); + if (guid != null && sourceGuids.Contains(guid)) + throw new InvalidOperationException($"Sample GUID already exists in '{meta}'. Back up the old import outside Assets and remove it explicitly before importing the relocated sample."); } + } - return null; + private static string ReadGuid(string path) + { + var match = Regex.Match(File.ReadAllText(path), @"^guid: ([0-9a-f]{32})$", RegexOptions.Multiline); + return match.Success ? match.Groups[1].Value : null; } - private static string ResolvePackageVersion() + private static UnityEditor.PackageManager.PackageInfo ResolvePackage() { - // Offline list (the package is embedded) so this stays fast and deterministic on CI. var request = Client.List(offlineMode: true, includeIndirectDependencies: false); + var deadline = DateTime.UtcNow.AddSeconds(60); while (!request.IsCompleted) { + if (DateTime.UtcNow >= deadline) + throw new InvalidOperationException($"Timed out resolving package: {PackageName}"); Thread.Sleep(50); } - if (request.Status == StatusCode.Success) { var package = request.Result.FirstOrDefault(p => p.name == PackageName); - if (package != null) return package.version; + if (package != null) return package; } - - throw new InvalidOperationException( - $"Package '{PackageName}' is not installed in this project."); + throw new InvalidOperationException($"Package '{PackageName}' is not installed in this project."); } private static string GetCommandLineArgument(string key) diff --git a/Assets/WebGLTemplates/FullscreenEmbed/index.html b/Assets/WebGLTemplates/FullscreenEmbed/index.html index b48dfcc..a54796e 100644 --- a/Assets/WebGLTemplates/FullscreenEmbed/index.html +++ b/Assets/WebGLTemplates/FullscreenEmbed/index.html @@ -104,6 +104,9 @@ document.head.appendChild(meta); } + // Reserve right-drag for camera panning inside the player canvas. + canvas.addEventListener("contextmenu", function(event) { event.preventDefault(); }); + var config = { arguments: [], dataUrl: "Build/{{{ DATA_FILENAME }}}", diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 3182399..2e4847d 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -6,7 +6,9 @@ is organized, how releases work, and what a pull request needs to pass. ## Repository layout - **The package** lives at `Packages/com.orkunmanap.runtime-transform-handles/` — runtime code, - editor code, tests, sample, and docs. This is what consumers install. + editor code, tests and docs. This is what consumers install. +- **Optional demos** live at `Packages/com.orkunmanap.runtime-transform-handles.demos/`; each sample + is imported independently. Core never references this package. - **The repository root** is a Unity development project (currently tracking a recent Unity release) that embeds the package for development, the demo scene, and the WebGL showcase. - **`ci/floor-2021/`** is a minimal Unity 2021.3 project used only by CI to verify the declared @@ -50,8 +52,8 @@ always better. On every push to `main`, the publish workflow: 1. Validates the package manifest and structure (no Unity license needed). -2. Runs EditMode + PlayMode tests on the current Unity version, plus the 2021.3 floor job. -3. Computes the version bump from the commits since the last release, updates `package.json` +2. Runs EditMode + PlayMode tests on the current Unity version, under both input settings. The 2021.3 floor workflow runs separately and is not a publish dependency. +3. Computes the version bump from Core-affecting commits since the last release, updates `package.json` and `CHANGELOG.md`, and pushes a `chore: bump version to X.Y.Z [skip ci]` commit. 4. Splits the package directory onto the `upm` branch, tags `vX.Y.Z`, and creates a GitHub Release. diff --git a/Packages/com.orkunmanap.runtime-transform-handles.demos/CHANGELOG.md b/Packages/com.orkunmanap.runtime-transform-handles.demos/CHANGELOG.md new file mode 100644 index 0000000..d1e2ffe --- /dev/null +++ b/Packages/com.orkunmanap.runtime-transform-handles.demos/CHANGELOG.md @@ -0,0 +1,10 @@ +# Changelog + +## [Unreleased] + +### Added +- Optional demos package; the original showcase retains its asset GUIDs and scene name. + +- Add the independently imported Level Editor Prop Workshop, with guarded commands, World/Local group movement and rotation, shared-center uniform scaling, snapping, reset and optional PlayMode tests. + +- Responsive white editor UI, handle size popover, left-drag orbit, right-drag pan and fractional WebGL wheel zoom. diff --git a/Packages/com.orkunmanap.runtime-transform-handles.demos/CHANGELOG.md.meta b/Packages/com.orkunmanap.runtime-transform-handles.demos/CHANGELOG.md.meta new file mode 100644 index 0000000..b09f910 --- /dev/null +++ b/Packages/com.orkunmanap.runtime-transform-handles.demos/CHANGELOG.md.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: e4b80d2199654d388faf84d23644f075 diff --git a/Packages/com.orkunmanap.runtime-transform-handles.demos/LICENSE.md b/Packages/com.orkunmanap.runtime-transform-handles.demos/LICENSE.md new file mode 100644 index 0000000..ab133ee --- /dev/null +++ b/Packages/com.orkunmanap.runtime-transform-handles.demos/LICENSE.md @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2023 Orkun Manap + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/Packages/com.orkunmanap.runtime-transform-handles.demos/LICENSE.md.meta b/Packages/com.orkunmanap.runtime-transform-handles.demos/LICENSE.md.meta new file mode 100644 index 0000000..183930f --- /dev/null +++ b/Packages/com.orkunmanap.runtime-transform-handles.demos/LICENSE.md.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 5c1236e3d7914068ba3cac44dcf3be78 diff --git a/Packages/com.orkunmanap.runtime-transform-handles.demos/README.md b/Packages/com.orkunmanap.runtime-transform-handles.demos/README.md new file mode 100644 index 0000000..b547167 --- /dev/null +++ b/Packages/com.orkunmanap.runtime-transform-handles.demos/README.md @@ -0,0 +1,44 @@ +# Runtime Transform Handles Demos + +Optional examples for Runtime Transform Handles. Core does not depend on this package. +Import **Level Editor** for the Prop Workshop: select, move, rotate, scale and reset six props, with World/Local group movement and rotation, plus shared-center uniform group scaling. The original feature showcase remains a separate import through Package Manager > Samples. +Its known URP magenta targets, stale shortcut HUD and shader diagnostics are not fixed by relocation. + +## Install + +This work is not published yet. For local development install both package folders through explicit +file dependencies. For a future reviewed revision, add BOTH project manifest entries, replacing + with the same immutable published repository commit: + +```json +{ + "dependencies": { + "com.orkunmanap.runtime-transform-handles": "https://github.com/manaporkun/UnityRuntimeTransformHandles.git?path=/Packages/com.orkunmanap.runtime-transform-handles#", + "com.orkunmanap.runtime-transform-handles.demos": "https://github.com/manaporkun/UnityRuntimeTransformHandles.git?path=/Packages/com.orkunmanap.runtime-transform-handles.demos#" + } +} +``` + +Unity cannot resolve a Git URL from another package's package.json. The two project entries are +intentional. The prototype's Core dependency version is the current checkout manifest, not a claim +that old published Core 3.3.0 has passed this revision's tests. Align and retest the release pair +before publishing. Core-only installs can continue using the existing Core #upm distribution. + +Select **Runtime Transform Handles Demos** in Package Manager and import the desired sample. +Run **Tools > Transform Handles > Setup Layer** before Play. No URP or Input System dependency is +added by this package; UI dependencies belong to demos, not Core. + +## Migrate an existing showcase + +Core no longer includes a Samples tab entry. Existing imported scenes remain in Assets and are not +automatically edited or deleted. Before importing the moved showcase, back up customized content +OUTSIDE Assets (or export a .unitypackage), then explicitly remove the previous imported folder. +Its GUIDs are preserved, so keeping both copies would cause GUID and assembly collisions. +The previous path was Assets/Samples/Runtime Transform Handles//Runtime Transform Handles Demo. +The new path uses Runtime Transform Handles Demos as the package display name. +The build helper rejects duplicate GUIDs rather than overwriting a customized import. + +Removing the demos package does not remove Assets copies. Keep Core and explicit project dependencies +on com.unity.ugui and com.unity.modules.imgui when retaining imports. Input System remains optional. When using its backend, use 1.1.1 or later for these demos; the retained original showcase also calls the runtime UI default-actions API and is not compatible with Input System 1.0. +To remove examples entirely, explicitly remove their imported folders after backing up changes. +This sample relocation is a distribution breaking change; preserve old version pins when needed. diff --git a/Packages/com.orkunmanap.runtime-transform-handles.demos/README.md.meta b/Packages/com.orkunmanap.runtime-transform-handles.demos/README.md.meta new file mode 100644 index 0000000..7750d08 --- /dev/null +++ b/Packages/com.orkunmanap.runtime-transform-handles.demos/README.md.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: b02ad62078b74f1488fe6f77b0f6285a diff --git a/Packages/com.orkunmanap.runtime-transform-handles/Samples~/Demo.meta b/Packages/com.orkunmanap.runtime-transform-handles.demos/Samples~/Demo.meta similarity index 100% rename from Packages/com.orkunmanap.runtime-transform-handles/Samples~/Demo.meta rename to Packages/com.orkunmanap.runtime-transform-handles.demos/Samples~/Demo.meta diff --git a/Packages/com.orkunmanap.runtime-transform-handles/Samples~/Demo/HandleDemo.cs b/Packages/com.orkunmanap.runtime-transform-handles.demos/Samples~/Demo/HandleDemo.cs similarity index 100% rename from Packages/com.orkunmanap.runtime-transform-handles/Samples~/Demo/HandleDemo.cs rename to Packages/com.orkunmanap.runtime-transform-handles.demos/Samples~/Demo/HandleDemo.cs diff --git a/Packages/com.orkunmanap.runtime-transform-handles/Samples~/Demo/HandleDemo.cs.meta b/Packages/com.orkunmanap.runtime-transform-handles.demos/Samples~/Demo/HandleDemo.cs.meta similarity index 100% rename from Packages/com.orkunmanap.runtime-transform-handles/Samples~/Demo/HandleDemo.cs.meta rename to Packages/com.orkunmanap.runtime-transform-handles.demos/Samples~/Demo/HandleDemo.cs.meta diff --git a/Packages/com.orkunmanap.runtime-transform-handles/Samples~/Demo/README.md b/Packages/com.orkunmanap.runtime-transform-handles.demos/Samples~/Demo/README.md similarity index 100% rename from Packages/com.orkunmanap.runtime-transform-handles/Samples~/Demo/README.md rename to Packages/com.orkunmanap.runtime-transform-handles.demos/Samples~/Demo/README.md diff --git a/Packages/com.orkunmanap.runtime-transform-handles/Samples~/Demo/README.md.meta b/Packages/com.orkunmanap.runtime-transform-handles.demos/Samples~/Demo/README.md.meta similarity index 100% rename from Packages/com.orkunmanap.runtime-transform-handles/Samples~/Demo/README.md.meta rename to Packages/com.orkunmanap.runtime-transform-handles.demos/Samples~/Demo/README.md.meta diff --git a/Packages/com.orkunmanap.runtime-transform-handles/Samples~/Demo/RuntimeTransformHandlesDemo.unity b/Packages/com.orkunmanap.runtime-transform-handles.demos/Samples~/Demo/RuntimeTransformHandlesDemo.unity similarity index 100% rename from Packages/com.orkunmanap.runtime-transform-handles/Samples~/Demo/RuntimeTransformHandlesDemo.unity rename to Packages/com.orkunmanap.runtime-transform-handles.demos/Samples~/Demo/RuntimeTransformHandlesDemo.unity diff --git a/Packages/com.orkunmanap.runtime-transform-handles/Samples~/Demo/RuntimeTransformHandlesDemo.unity.meta b/Packages/com.orkunmanap.runtime-transform-handles.demos/Samples~/Demo/RuntimeTransformHandlesDemo.unity.meta similarity index 100% rename from Packages/com.orkunmanap.runtime-transform-handles/Samples~/Demo/RuntimeTransformHandlesDemo.unity.meta rename to Packages/com.orkunmanap.runtime-transform-handles.demos/Samples~/Demo/RuntimeTransformHandlesDemo.unity.meta diff --git a/Packages/com.orkunmanap.runtime-transform-handles/Samples~/Demo/TransformHandles.Samples.Demo.asmdef b/Packages/com.orkunmanap.runtime-transform-handles.demos/Samples~/Demo/TransformHandles.Samples.Demo.asmdef similarity index 100% rename from Packages/com.orkunmanap.runtime-transform-handles/Samples~/Demo/TransformHandles.Samples.Demo.asmdef rename to Packages/com.orkunmanap.runtime-transform-handles.demos/Samples~/Demo/TransformHandles.Samples.Demo.asmdef diff --git a/Packages/com.orkunmanap.runtime-transform-handles/Samples~/Demo/TransformHandles.Samples.Demo.asmdef.meta b/Packages/com.orkunmanap.runtime-transform-handles.demos/Samples~/Demo/TransformHandles.Samples.Demo.asmdef.meta similarity index 100% rename from Packages/com.orkunmanap.runtime-transform-handles/Samples~/Demo/TransformHandles.Samples.Demo.asmdef.meta rename to Packages/com.orkunmanap.runtime-transform-handles.demos/Samples~/Demo/TransformHandles.Samples.Demo.asmdef.meta diff --git a/Packages/com.orkunmanap.runtime-transform-handles.demos/Samples~/LevelEditor.meta b/Packages/com.orkunmanap.runtime-transform-handles.demos/Samples~/LevelEditor.meta new file mode 100644 index 0000000..13a9bbd --- /dev/null +++ b/Packages/com.orkunmanap.runtime-transform-handles.demos/Samples~/LevelEditor.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 538829df507f479b94ad47c5dd6af9d3 +folderAsset: yes diff --git a/Packages/com.orkunmanap.runtime-transform-handles.demos/Samples~/LevelEditor/LevelEditor.mat b/Packages/com.orkunmanap.runtime-transform-handles.demos/Samples~/LevelEditor/LevelEditor.mat new file mode 100644 index 0000000..3a867e7 --- /dev/null +++ b/Packages/com.orkunmanap.runtime-transform-handles.demos/Samples~/LevelEditor/LevelEditor.mat @@ -0,0 +1,28 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 8 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: LevelEditor + m_Shader: {fileID: 4800000, guid: 4c1615871dc848048b61bb1cdc19024b, type: 3} + m_ValidKeywords: [] + m_InvalidKeywords: [] + m_LightmapFlags: 4 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: {} + disabledShaderPasses: [] + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: [] + m_Ints: [] + m_Floats: + - _Grid: 0 + m_Colors: + - _Color: {r: 0.2, g: 0.7, b: 0.6, a: 1} + m_BuildTextureStacks: [] diff --git a/Packages/com.orkunmanap.runtime-transform-handles.demos/Samples~/LevelEditor/LevelEditor.mat.meta b/Packages/com.orkunmanap.runtime-transform-handles.demos/Samples~/LevelEditor/LevelEditor.mat.meta new file mode 100644 index 0000000..727cd19 --- /dev/null +++ b/Packages/com.orkunmanap.runtime-transform-handles.demos/Samples~/LevelEditor/LevelEditor.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: fdcd39e7f0007423ba280d7640bd50ce +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 2100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.orkunmanap.runtime-transform-handles.demos/Samples~/LevelEditor/LevelEditor.unity b/Packages/com.orkunmanap.runtime-transform-handles.demos/Samples~/LevelEditor/LevelEditor.unity new file mode 100644 index 0000000..f2b76ec --- /dev/null +++ b/Packages/com.orkunmanap.runtime-transform-handles.demos/Samples~/LevelEditor/LevelEditor.unity @@ -0,0 +1,938 @@ +%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: 0 + m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1} + m_SkyboxMaterial: {fileID: 10304, guid: 0000000000000000f000000000000000, type: 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: 1 + 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 &617130186 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 617130190} + - component: {fileID: 617130189} + - component: {fileID: 617130188} + - component: {fileID: 617130187} + m_Layer: 0 + m_Name: Prop 2 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!23 &617130187 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 617130186} + 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: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: fdcd39e7f0007423ba280d7640bd50ce, type: 2} + 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: 1 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!65 &617130188 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 617130186} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &617130189 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 617130186} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!4 &617130190 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 617130186} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0.5, z: -2} + m_LocalScale: {x: 1, y: 1, z: 2} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 4 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &652022772 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 652022776} + - component: {fileID: 652022775} + - component: {fileID: 652022774} + - component: {fileID: 652022773} + m_Layer: 0 + m_Name: Prop 3 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!23 &652022773 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 652022772} + 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: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: fdcd39e7f0007423ba280d7640bd50ce, type: 2} + 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: 1 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!65 &652022774 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 652022772} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &652022775 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 652022772} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!4 &652022776 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 652022772} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 3, y: 0.5, z: -2} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 5 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &739622989 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 739622993} + - component: {fileID: 739622992} + - component: {fileID: 739622991} + - component: {fileID: 739622990} + m_Layer: 0 + m_Name: Prop 6 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!23 &739622990 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 739622989} + 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: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: fdcd39e7f0007423ba280d7640bd50ce, type: 2} + 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: 1 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!65 &739622991 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 739622989} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &739622992 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 739622989} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!4 &739622993 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 739622989} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 3, y: 1, z: 2} + m_LocalScale: {x: 1, y: 2, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 8 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &861189537 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 861189541} + - component: {fileID: 861189540} + - component: {fileID: 861189539} + - component: {fileID: 861189538} + m_Layer: 0 + m_Name: Grid Floor + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!23 &861189538 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 861189537} + 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: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: fdcd39e7f0007423ba280d7640bd50ce, type: 2} + 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: 1 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!65 &861189539 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 861189537} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &861189540 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 861189537} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!4 &861189541 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 861189537} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: -0.15, z: 0} + m_LocalScale: {x: 16, y: 0.3, z: 12} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1188009465 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1188009469} + - component: {fileID: 1188009468} + - component: {fileID: 1188009467} + - component: {fileID: 1188009466} + m_Layer: 0 + m_Name: Prop 1 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!23 &1188009466 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1188009465} + 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: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: fdcd39e7f0007423ba280d7640bd50ce, type: 2} + 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: 1 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!65 &1188009467 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1188009465} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &1188009468 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1188009465} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!4 &1188009469 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1188009465} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -3, y: 0.5, z: -2} + m_LocalScale: {x: 2, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1367764086 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1367764090} + - component: {fileID: 1367764089} + - component: {fileID: 1367764088} + - component: {fileID: 1367764087} + m_Layer: 0 + m_Name: Prop 5 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!23 &1367764087 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1367764086} + 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: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: fdcd39e7f0007423ba280d7640bd50ce, type: 2} + 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: 1 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!65 &1367764088 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1367764086} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &1367764089 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1367764086} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!4 &1367764090 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1367764086} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0.5, z: 2} + m_LocalScale: {x: 2, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 7 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1388037625 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1388037627} + - component: {fileID: 1388037626} + m_Layer: 0 + m_Name: Main Camera + m_TagString: MainCamera + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!20 &1388037626 +Camera: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1388037625} + m_Enabled: 1 + serializedVersion: 2 + m_ClearFlags: 2 + m_BackGroundColor: {r: 0.955, g: 0.957, b: 0.965, a: 1} + 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.1 + far clip plane: 100 + field of view: 48 + orthographic: 0 + orthographic size: 5 + m_Depth: 0 + 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 &1388037627 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1388037625} + m_LocalRotation: {x: 0.31903228, y: -0.18850608, z: 0.06490785, w: 0.92653704} + m_LocalPosition: {x: 6, y: 12, z: -14} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &2100871815 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2100871819} + - component: {fileID: 2100871818} + - component: {fileID: 2100871817} + - component: {fileID: 2100871816} + m_Layer: 0 + m_Name: Prop 4 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!23 &2100871816 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2100871815} + 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: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: fdcd39e7f0007423ba280d7640bd50ce, type: 2} + 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: 1 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!65 &2100871817 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2100871815} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &2100871818 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2100871815} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!4 &2100871819 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2100871815} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -3, y: 0.75, z: 2} + m_LocalScale: {x: 1, y: 1.5, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 6 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &2111331165 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2111331167} + - component: {fileID: 2111331166} + m_Layer: 0 + m_Name: Level Editor + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &2111331166 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2111331165} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 574bf229fcd640449d452c4ef2d0e136, type: 3} + m_Name: + m_EditorClassIdentifier: + sceneCamera: {fileID: 1388037626} + targets: + - {fileID: 1188009469} + - {fileID: 617130190} + - {fileID: 652022776} + - {fileID: 2100871819} + - {fileID: 1367764090} + - {fileID: 739622993} + floorRenderer: {fileID: 861189538} + targetMaterial: {fileID: 2100000, guid: fdcd39e7f0007423ba280d7640bd50ce, type: 2} + interactionSettings: {fileID: 11400000, guid: a6d8ff2baabd142bca66dde253f8808d, type: 2} + panelSprite: {fileID: 21300000, guid: 75ca76f0817d4a6097c49c06aaa03081, type: 3} + moveIcon: {fileID: 21300000, guid: 82bdbfbe32fc48bb87dce85683f74d5f, type: 3} + rotateIcon: {fileID: 21300000, guid: d19734ab47f74d26a0bc7b63837c7ade, type: 3} + scaleIcon: {fileID: 21300000, guid: 419dd4b4b5d44be5ad8554f256104ec4, type: 3} +--- !u!4 &2111331167 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2111331165} + 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_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} diff --git a/Packages/com.orkunmanap.runtime-transform-handles.demos/Samples~/LevelEditor/LevelEditor.unity.meta b/Packages/com.orkunmanap.runtime-transform-handles.demos/Samples~/LevelEditor/LevelEditor.unity.meta new file mode 100644 index 0000000..aa2380d --- /dev/null +++ b/Packages/com.orkunmanap.runtime-transform-handles.demos/Samples~/LevelEditor/LevelEditor.unity.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 6fcf1496e391b4b0e9b053c5d08d1194 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.orkunmanap.runtime-transform-handles.demos/Samples~/LevelEditor/LevelEditorDemo.cs b/Packages/com.orkunmanap.runtime-transform-handles.demos/Samples~/LevelEditor/LevelEditorDemo.cs new file mode 100644 index 0000000..0785843 --- /dev/null +++ b/Packages/com.orkunmanap.runtime-transform-handles.demos/Samples~/LevelEditor/LevelEditorDemo.cs @@ -0,0 +1,922 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using TransformHandles; +using TransformHandles.Utils; +using UnityEngine; +using UnityEngine.EventSystems; +using UnityEngine.UI; + +namespace TransformHandles.Samples.LevelEditor +{ + /// A small, resettable prop editor using only the public Core API. + [DefaultExecutionOrder(-100)] + public sealed class LevelEditorDemo : MonoBehaviour + { + [SerializeField] private Camera sceneCamera; + [SerializeField] private Transform[] targets; + [SerializeField] private Renderer floorRenderer; + [SerializeField] private Material targetMaterial; + [SerializeField] private TransformHandleSettings interactionSettings; + [SerializeField] private Sprite panelSprite; + [SerializeField] private Sprite moveIcon, rotateIcon, scaleIcon; + + private readonly List _selection = new List(); + private readonly Dictionary _initial = new Dictionary(); + private readonly Dictionary _dragStart = new Dictionary(); + private readonly List _materials = new List(); + private readonly Dictionary _originalMaterials = new Dictionary(); + private readonly List