From 4fc5ee1966d8ed6a26dd396222e8fd2f39826f60 Mon Sep 17 00:00:00 2001
From: iizzaya <linxuan_0709@icloud.com>
Date: Thu, 7 Nov 2019 16:08:07 +0800
Subject: [PATCH 1/6] [Feature] Panel Raycast Filter

---
 Runtime/Plugins/Raycast.meta                  |    8 +
 Runtime/Plugins/Raycast/RaycastManager.cs     |   82 ++
 .../Plugins/Raycast/RaycastManager.cs.meta    |   11 +
 .../Plugins/Raycast/RaycastableConatiner.cs   |  118 ++
 .../Raycast/RaycastableConatiner.cs.meta      |   11 +
 Runtime/Plugins/Raycast/Sample.meta           |    8 +
 .../Sample/Raycast Simple Testbed.unity       | 1010 +++++++++++++++++
 .../Sample/Raycast Simple Testbed.unity.meta  |    7 +
 .../Raycast/Sample/Raycast Testbed.unity      |  757 ++++++++++++
 .../Raycast/Sample/Raycast Testbed.unity.meta |    7 +
 .../Sample/RaycastSimpleTestbedPanel.cs       |   49 +
 .../Sample/RaycastSimpleTestbedPanel.cs.meta  |   11 +
 .../Raycast/Sample/RaycastTestbedPanel.cs     |  213 ++++
 .../Sample/RaycastTestbedPanel.cs.meta        |   11 +
 .../Raycast/UIWidgetsPanelRaycastFilter.cs    |   46 +
 .../UIWidgetsPanelRaycastFilter.cs.meta       |   11 +
 16 files changed, 2360 insertions(+)
 create mode 100644 Runtime/Plugins/Raycast.meta
 create mode 100644 Runtime/Plugins/Raycast/RaycastManager.cs
 create mode 100644 Runtime/Plugins/Raycast/RaycastManager.cs.meta
 create mode 100644 Runtime/Plugins/Raycast/RaycastableConatiner.cs
 create mode 100644 Runtime/Plugins/Raycast/RaycastableConatiner.cs.meta
 create mode 100644 Runtime/Plugins/Raycast/Sample.meta
 create mode 100644 Runtime/Plugins/Raycast/Sample/Raycast Simple Testbed.unity
 create mode 100644 Runtime/Plugins/Raycast/Sample/Raycast Simple Testbed.unity.meta
 create mode 100644 Runtime/Plugins/Raycast/Sample/Raycast Testbed.unity
 create mode 100644 Runtime/Plugins/Raycast/Sample/Raycast Testbed.unity.meta
 create mode 100644 Runtime/Plugins/Raycast/Sample/RaycastSimpleTestbedPanel.cs
 create mode 100644 Runtime/Plugins/Raycast/Sample/RaycastSimpleTestbedPanel.cs.meta
 create mode 100644 Runtime/Plugins/Raycast/Sample/RaycastTestbedPanel.cs
 create mode 100644 Runtime/Plugins/Raycast/Sample/RaycastTestbedPanel.cs.meta
 create mode 100644 Runtime/Plugins/Raycast/UIWidgetsPanelRaycastFilter.cs
 create mode 100644 Runtime/Plugins/Raycast/UIWidgetsPanelRaycastFilter.cs.meta

diff --git a/Runtime/Plugins/Raycast.meta b/Runtime/Plugins/Raycast.meta
new file mode 100644
index 00000000..f4661cef
--- /dev/null
+++ b/Runtime/Plugins/Raycast.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 536a3d78629ef4c00adb8dc15d9988df
+folderAsset: yes
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Runtime/Plugins/Raycast/RaycastManager.cs b/Runtime/Plugins/Raycast/RaycastManager.cs
new file mode 100644
index 00000000..7b10b4fc
--- /dev/null
+++ b/Runtime/Plugins/Raycast/RaycastManager.cs
@@ -0,0 +1,82 @@
+using System.Collections.Generic;
+using Unity.UIWidgets.ui;
+using UnityEngine;
+using Rect = Unity.UIWidgets.ui.Rect;
+
+namespace Unity.UIWidgets.plugins.raycast {
+    public class RaycastableRect {
+        public bool isDirty;
+        public Rect rect;
+
+        public RaycastableRect(bool isDirty) {
+            this.isDirty = isDirty;
+        }
+    }
+
+    public class RaycastManager {
+        static RaycastManager _instance;
+
+        public static RaycastManager instance {
+            get {
+                if (_instance == null) {
+                    _instance = new RaycastManager();
+                }
+
+                return _instance;
+            }
+        }
+
+        public Dictionary<int, Dictionary<int, RaycastableRect>> hashCodeList =
+            new Dictionary<int, Dictionary<int, RaycastableRect>>();
+
+        public static void VerifyWindow(int windowHashCode) {
+            if (!instance.hashCodeList.ContainsKey(windowHashCode)) {
+                // Debug.Log($"New Window: @[{windowHashCode}] ({instance.hashCodeList.Count})");
+                instance.hashCodeList.Add(windowHashCode, new Dictionary<int, RaycastableRect>());
+            }
+        }
+
+        public static void AddToList(int key, int windowHashCode) {
+            VerifyWindow(windowHashCode);
+            // Debug.Log($"Add To List: [{key}]@[{windowHashCode}]");
+            if (!instance.hashCodeList[windowHashCode].ContainsKey(key)) {
+                instance.hashCodeList[windowHashCode][key] = new RaycastableRect(true);
+            }
+        }
+
+        public static void MarkDirty(int key, int windowHashCode) {
+            // Debug.Log($"Mark Dirty: [{key}]@[{windowHashCode}]");
+            if (instance.hashCodeList[windowHashCode].ContainsKey(key)) {
+                instance.hashCodeList[windowHashCode][key].isDirty = true;
+            }
+        }
+
+        public static void UpdateSizeOffset(int key, int windowHashCode, Size size, Offset offset) {
+            // Debug.Log($"Update Size Offset: [{key}]@[{windowHashCode}]");
+            if (instance.hashCodeList[windowHashCode].ContainsKey(key)) {
+                if (instance.hashCodeList[windowHashCode][key].isDirty) {
+                    instance.hashCodeList[windowHashCode][key].rect =
+                        Rect.fromLTWH(offset.dx, offset.dy, size.width, size.height);
+                    instance.hashCodeList[windowHashCode][key].isDirty = false;
+                }
+            }
+        }
+
+        public static void RemoveFromList(int key, int windowHashCode) {
+            // Debug.Log($"Remove From List: [{key}]@[{windowHashCode}]");
+            if (instance.hashCodeList[windowHashCode].ContainsKey(key)) {
+                instance.hashCodeList[windowHashCode].Remove(key);
+            }
+        }
+
+        public static bool CheckCastThrough(int windowHashCode, Vector2 pos) {
+            foreach (var item in instance.hashCodeList[windowHashCode]) {
+                if (item.Value.rect.contains(new Offset(pos.x, pos.y))) {
+                    return false;
+                }
+            }
+
+            return true;
+        }
+    }
+}
\ No newline at end of file
diff --git a/Runtime/Plugins/Raycast/RaycastManager.cs.meta b/Runtime/Plugins/Raycast/RaycastManager.cs.meta
new file mode 100644
index 00000000..74519d43
--- /dev/null
+++ b/Runtime/Plugins/Raycast/RaycastManager.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 9574f12b230354e6f87fc5fc0c98c96e
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Runtime/Plugins/Raycast/RaycastableConatiner.cs b/Runtime/Plugins/Raycast/RaycastableConatiner.cs
new file mode 100644
index 00000000..b1793467
--- /dev/null
+++ b/Runtime/Plugins/Raycast/RaycastableConatiner.cs
@@ -0,0 +1,118 @@
+using Unity.UIWidgets.foundation;
+using Unity.UIWidgets.rendering;
+using Unity.UIWidgets.ui;
+using Unity.UIWidgets.widgets;
+
+namespace Unity.UIWidgets.plugins.raycast {
+    class RaycastableBox : SingleChildRenderObjectWidget {
+        public RaycastableBox(
+            Key key = null,
+            Widget child = null
+        ) : base(key, child) {
+            this.windowHashCode = Window.instance.GetHashCode();
+        }
+
+        readonly int windowHashCode;
+
+        public override RenderObject createRenderObject(BuildContext context) {
+            return new RenderRaycastableBox(
+                windowHashCode: this.windowHashCode,
+                widget: this
+            );
+        }
+
+        public override Element createElement() {
+            return new _RaycastableBoxRenderElement(this.windowHashCode, this);
+        }
+    }
+
+    class RenderRaycastableBox : RenderProxyBox {
+        public RenderRaycastableBox(
+            int windowHashCode,
+            RenderBox child = null,
+            RaycastableBox widget = null
+        ) : base(child) {
+            this.widget = widget;
+            this.windowHashCode = windowHashCode;
+        }
+
+        readonly int windowHashCode;
+        RaycastableBox widget;
+
+        public override void detach() {
+            base.detach();
+            this.markNeedsPaint();
+        }
+
+
+        public override void paint(PaintingContext context, Offset offset) {
+            // Debug.Log($"[RenderRaycastableBox] Paint {this.widget.GetHashCode()}: {this.size}@{offset}");
+            RaycastManager.UpdateSizeOffset(this.widget.GetHashCode(), (int) this.windowHashCode, this.size, offset);
+
+            base.paint(context, offset);
+        }
+    }
+
+    class _RaycastableBoxRenderElement : SingleChildRenderObjectElement {
+        public _RaycastableBoxRenderElement(
+            int windowHashCode,
+            RaycastableBox widget
+        ) : base(widget) {
+            this.windowHashCode = windowHashCode;
+        }
+
+        public new RaycastableBox widget {
+            get { return base.widget as RaycastableBox; }
+        }
+
+        int widgetHashCode;
+        int windowHashCode;
+
+        public override void mount(Element parent, object newSlot) {
+            this.widgetHashCode = this.widget.GetHashCode();
+
+            // Debug.Log($"[RaycastableBox] Mount: {this.initHashCode}");
+            RaycastManager.AddToList(this.widgetHashCode, this.windowHashCode);
+            base.mount(parent, newSlot);
+        }
+
+        public override void update(Widget newWidget) {
+            // Debug.Log($"[RaycastableBox] Update: {this.initHashCode}");
+            RaycastManager.MarkDirty(this.widgetHashCode, this.windowHashCode);
+            base.update(newWidget);
+        }
+
+        public override void unmount() {
+            // Debug.Log($"[RaycastableBox] Unmount: {this.initHashCode}");
+            RaycastManager.RemoveFromList(this.widgetHashCode, this.windowHashCode);
+            base.unmount();
+        }
+    }
+
+    public class RaycastableContainer : StatelessWidget {
+        public RaycastableContainer(
+            Widget child = null,
+            Key key = null
+        ) : base(key) {
+            this.child = child;
+        }
+
+        public readonly Widget child;
+
+        public override Widget build(BuildContext context) {
+            Widget current = this.child;
+
+            if (this.child == null) {
+                current = new LimitedBox(
+                    maxWidth: 0.0f,
+                    maxHeight: 0.0f,
+                    child: new ConstrainedBox(constraints: BoxConstraints.expand())
+                );
+            }
+
+            current = new RaycastableBox(child: current);
+
+            return current;
+        }
+    }
+}
\ No newline at end of file
diff --git a/Runtime/Plugins/Raycast/RaycastableConatiner.cs.meta b/Runtime/Plugins/Raycast/RaycastableConatiner.cs.meta
new file mode 100644
index 00000000..3bb75ef0
--- /dev/null
+++ b/Runtime/Plugins/Raycast/RaycastableConatiner.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 9af0c7d6aab134f5ba187ff34acf2377
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Runtime/Plugins/Raycast/Sample.meta b/Runtime/Plugins/Raycast/Sample.meta
new file mode 100644
index 00000000..28885504
--- /dev/null
+++ b/Runtime/Plugins/Raycast/Sample.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: a722cfcd498904dd68cd954f2a5a1892
+folderAsset: yes
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Runtime/Plugins/Raycast/Sample/Raycast Simple Testbed.unity b/Runtime/Plugins/Raycast/Sample/Raycast Simple Testbed.unity
new file mode 100644
index 00000000..e1a3c5d1
--- /dev/null
+++ b/Runtime/Plugins/Raycast/Sample/Raycast Simple Testbed.unity	
@@ -0,0 +1,1010 @@
+%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: 11
+  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: 0
+    m_PVRSampling: 1
+    m_PVRDirectSampleCount: 32
+    m_PVRSampleCount: 500
+    m_PVRBounces: 2
+    m_PVREnvironmentSampleCount: 500
+    m_PVREnvironmentReferencePointCount: 2048
+    m_PVRFilteringMode: 2
+    m_PVRDenoiserTypeDirect: 0
+    m_PVRDenoiserTypeIndirect: 0
+    m_PVRDenoiserTypeAO: 0
+    m_PVRFilterTypeDirect: 0
+    m_PVRFilterTypeIndirect: 0
+    m_PVRFilterTypeAO: 0
+    m_PVREnvironmentMIS: 0
+    m_PVRCulling: 1
+    m_PVRFilteringGaussRadiusDirect: 1
+    m_PVRFilteringGaussRadiusIndirect: 5
+    m_PVRFilteringGaussRadiusAO: 2
+    m_PVRFilteringAtrousPositionSigmaDirect: 0.5
+    m_PVRFilteringAtrousPositionSigmaIndirect: 2
+    m_PVRFilteringAtrousPositionSigmaAO: 1
+    m_ShowResolutionOverlay: 1
+    m_ExportTrainingData: 0
+  m_LightingDataAsset: {fileID: 0}
+  m_UseShadowmask: 1
+--- !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
+    debug:
+      m_Flags: 0
+  m_NavMeshData: {fileID: 0}
+--- !u!1 &238084976
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 238084977}
+  - component: {fileID: 238084980}
+  - component: {fileID: 238084979}
+  - component: {fileID: 238084978}
+  m_Layer: 5
+  m_Name: Panel Button With Filter
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &238084977
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 238084976}
+  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: 354633980}
+  m_RootOrder: 2
+  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: -200, y: 0.0000076294}
+  m_SizeDelta: {x: 300, y: 150}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &238084978
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 238084976}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 2455841904ff14258bae1b28c1363dc0, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  reversed: 0
+--- !u!114 &238084979
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 238084976}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 4fc8b0d34b82c4c63a41e0cde280075a, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Material: {fileID: 0}
+  m_Color: {r: 1, g: 1, b: 1, a: 1}
+  m_RaycastTarget: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+    m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI,
+      Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
+  m_Texture: {fileID: 0}
+  m_UVRect:
+    serializedVersion: 2
+    x: 0
+    y: 0
+    width: 1
+    height: 1
+  devicePixelRatioOverride: 0
+  hardwareAntiAliasing: 0
+--- !u!222 &238084980
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 238084976}
+  m_CullTransparentMesh: 0
+--- !u!1 &354633976
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 354633980}
+  - component: {fileID: 354633979}
+  - component: {fileID: 354633978}
+  - component: {fileID: 354633977}
+  - component: {fileID: 354633981}
+  m_Layer: 5
+  m_Name: Canvas
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!114 &354633977
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 354633976}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 1301386320, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_IgnoreReversedGraphics: 1
+  m_BlockingObjects: 0
+  m_BlockingMask:
+    serializedVersion: 2
+    m_Bits: 4294967295
+--- !u!114 &354633978
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 354633976}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 1980459831, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_UiScaleMode: 0
+  m_ReferencePixelsPerUnit: 100
+  m_ScaleFactor: 1
+  m_ReferenceResolution: {x: 800, y: 600}
+  m_ScreenMatchMode: 0
+  m_MatchWidthOrHeight: 0
+  m_PhysicalUnit: 3
+  m_FallbackScreenDPI: 96
+  m_DefaultSpriteDPI: 96
+  m_DynamicPixelsPerUnit: 1
+--- !u!223 &354633979
+Canvas:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 354633976}
+  m_Enabled: 1
+  serializedVersion: 3
+  m_RenderMode: 1
+  m_Camera: {fileID: 519420031}
+  m_PlaneDistance: 1
+  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 &354633980
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 354633976}
+  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: 789225035}
+  - {fileID: 1371170890}
+  - {fileID: 238084977}
+  - {fileID: 1262432453}
+  - {fileID: 409216488}
+  - {fileID: 2108199658}
+  m_Father: {fileID: 0}
+  m_RootOrder: 2
+  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!222 &354633981
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 354633976}
+  m_CullTransparentMesh: 0
+--- !u!1 &409216487
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 409216488}
+  - component: {fileID: 409216491}
+  - component: {fileID: 409216490}
+  - component: {fileID: 409216489}
+  m_Layer: 5
+  m_Name: Panel Button With Filter (1)
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &409216488
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 409216487}
+  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: 354633980}
+  m_RootOrder: 4
+  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: 150, y: 50}
+  m_SizeDelta: {x: 300, y: 150}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &409216489
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 409216487}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 2455841904ff14258bae1b28c1363dc0, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  reversed: 0
+--- !u!114 &409216490
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 409216487}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 4fc8b0d34b82c4c63a41e0cde280075a, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Material: {fileID: 0}
+  m_Color: {r: 1, g: 1, b: 1, a: 1}
+  m_RaycastTarget: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+    m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI,
+      Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
+  m_Texture: {fileID: 0}
+  m_UVRect:
+    serializedVersion: 2
+    x: 0
+    y: 0
+    width: 1
+    height: 1
+  devicePixelRatioOverride: 0
+  hardwareAntiAliasing: 0
+--- !u!222 &409216491
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 409216487}
+  m_CullTransparentMesh: 0
+--- !u!1 &519420028
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 519420032}
+  - component: {fileID: 519420031}
+  - component: {fileID: 519420029}
+  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 &519420029
+AudioListener:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 519420028}
+  m_Enabled: 1
+--- !u!20 &519420031
+Camera:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 519420028}
+  m_Enabled: 1
+  serializedVersion: 2
+  m_ClearFlags: 2
+  m_BackGroundColor: {r: 0, g: 0, b: 0, 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: 0
+  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: 0
+  m_HDR: 1
+  m_AllowMSAA: 0
+  m_AllowDynamicResolution: 0
+  m_ForceIntoRT: 0
+  m_OcclusionCulling: 0
+  m_StereoConvergence: 10
+  m_StereoSeparation: 0.022
+--- !u!4 &519420032
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 519420028}
+  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: 1
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!1 &789225034
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 789225035}
+  - component: {fileID: 789225038}
+  - component: {fileID: 789225037}
+  - component: {fileID: 789225036}
+  m_Layer: 5
+  m_Name: Button
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &789225035
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 789225034}
+  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:
+  - {fileID: 1097866538}
+  m_Father: {fileID: 354633980}
+  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.000030518, y: -0.000011444}
+  m_SizeDelta: {x: 400, y: 600}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &789225036
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 789225034}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 1392445389, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Navigation:
+    m_Mode: 3
+    m_SelectOnUp: {fileID: 0}
+    m_SelectOnDown: {fileID: 0}
+    m_SelectOnLeft: {fileID: 0}
+    m_SelectOnRight: {fileID: 0}
+  m_Transition: 1
+  m_Colors:
+    m_NormalColor: {r: 1, g: 1, b: 1, a: 1}
+    m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
+    m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}
+    m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
+    m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608}
+    m_ColorMultiplier: 1
+    m_FadeDuration: 0.1
+  m_SpriteState:
+    m_HighlightedSprite: {fileID: 0}
+    m_PressedSprite: {fileID: 0}
+    m_SelectedSprite: {fileID: 0}
+    m_DisabledSprite: {fileID: 0}
+  m_AnimationTriggers:
+    m_NormalTrigger: Normal
+    m_HighlightedTrigger: Highlighted
+    m_PressedTrigger: Pressed
+    m_SelectedTrigger: Selected
+    m_DisabledTrigger: Disabled
+  m_Interactable: 1
+  m_TargetGraphic: {fileID: 789225037}
+  m_OnClick:
+    m_PersistentCalls:
+      m_Calls: []
+    m_TypeName: UnityEngine.UI.Button+ButtonClickedEvent, UnityEngine.UI, Version=1.0.0.0,
+      Culture=neutral, PublicKeyToken=null
+--- !u!114 &789225037
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 789225034}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: -765806418, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Material: {fileID: 0}
+  m_Color: {r: 1, g: 1, b: 1, a: 1}
+  m_RaycastTarget: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+    m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI,
+      Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
+  m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0}
+  m_Type: 1
+  m_PreserveAspect: 0
+  m_FillCenter: 1
+  m_FillMethod: 4
+  m_FillAmount: 1
+  m_FillClockwise: 1
+  m_FillOrigin: 0
+  m_UseSpriteMesh: 0
+--- !u!222 &789225038
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 789225034}
+  m_CullTransparentMesh: 0
+--- !u!1 &1097866537
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 1097866538}
+  - component: {fileID: 1097866540}
+  - component: {fileID: 1097866539}
+  m_Layer: 5
+  m_Name: Text
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &1097866538
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1097866537}
+  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: 789225035}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 0, y: 0}
+  m_AnchorMax: {x: 1, y: 1}
+  m_AnchoredPosition: {x: 0, y: 0}
+  m_SizeDelta: {x: 0, y: 0}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &1097866539
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1097866537}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 708705254, guid: f70555f144d8491a825f0804e09c671c, 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_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+    m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI,
+      Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
+  m_FontData:
+    m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0}
+    m_FontSize: 55
+    m_FontStyle: 0
+    m_BestFit: 0
+    m_MinSize: 0
+    m_MaxSize: 68
+    m_Alignment: 4
+    m_AlignByGeometry: 0
+    m_RichText: 1
+    m_HorizontalOverflow: 0
+    m_VerticalOverflow: 0
+    m_LineSpacing: 1
+  m_Text: Button
+--- !u!222 &1097866540
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1097866537}
+  m_CullTransparentMesh: 0
+--- !u!1 &1262432452
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 1262432453}
+  - component: {fileID: 1262432456}
+  - component: {fileID: 1262432455}
+  - component: {fileID: 1262432454}
+  m_Layer: 5
+  m_Name: Panel Button With Filter (Reversed)
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &1262432453
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1262432452}
+  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: 354633980}
+  m_RootOrder: 3
+  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: -200, y: -200}
+  m_SizeDelta: {x: 300, y: 150}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &1262432454
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1262432452}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 2455841904ff14258bae1b28c1363dc0, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  reversed: 1
+--- !u!114 &1262432455
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1262432452}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 4fc8b0d34b82c4c63a41e0cde280075a, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Material: {fileID: 0}
+  m_Color: {r: 1, g: 1, b: 1, a: 1}
+  m_RaycastTarget: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+    m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI,
+      Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
+  m_Texture: {fileID: 0}
+  m_UVRect:
+    serializedVersion: 2
+    x: 0
+    y: 0
+    width: 1
+    height: 1
+  devicePixelRatioOverride: 0
+  hardwareAntiAliasing: 0
+--- !u!222 &1262432456
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1262432452}
+  m_CullTransparentMesh: 0
+--- !u!1 &1371170889
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 1371170890}
+  - component: {fileID: 1371170891}
+  - component: {fileID: 1371170892}
+  m_Layer: 5
+  m_Name: Panel Button
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &1371170890
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1371170889}
+  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: 354633980}
+  m_RootOrder: 1
+  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: -200, y: 200}
+  m_SizeDelta: {x: 300, y: 150}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &1371170891
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1371170889}
+  m_CullTransparentMesh: 0
+--- !u!114 &1371170892
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1371170889}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 4fc8b0d34b82c4c63a41e0cde280075a, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Material: {fileID: 0}
+  m_Color: {r: 1, g: 1, b: 1, a: 1}
+  m_RaycastTarget: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+    m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI,
+      Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
+  m_Texture: {fileID: 0}
+  m_UVRect:
+    serializedVersion: 2
+    x: 0
+    y: 0
+    width: 1
+    height: 1
+  devicePixelRatioOverride: 0
+  hardwareAntiAliasing: 0
+--- !u!1 &1742152755
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 1742152758}
+  - component: {fileID: 1742152757}
+  - component: {fileID: 1742152756}
+  m_Layer: 0
+  m_Name: EventSystem
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!114 &1742152756
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1742152755}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 1077351063, guid: f70555f144d8491a825f0804e09c671c, 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 &1742152757
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1742152755}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: -619905303, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_FirstSelected: {fileID: 1742152755}
+  m_sendNavigationEvents: 1
+  m_DragThreshold: 10
+--- !u!4 &1742152758
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1742152755}
+  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: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!1 &2108199657
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 2108199658}
+  - component: {fileID: 2108199661}
+  - component: {fileID: 2108199660}
+  - component: {fileID: 2108199659}
+  m_Layer: 5
+  m_Name: Panel Button With Filter (2)
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &2108199658
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 2108199657}
+  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: 354633980}
+  m_RootOrder: 5
+  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: 227, y: 0}
+  m_SizeDelta: {x: 300, y: 150}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &2108199659
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 2108199657}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 2455841904ff14258bae1b28c1363dc0, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  reversed: 0
+--- !u!114 &2108199660
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 2108199657}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 4fc8b0d34b82c4c63a41e0cde280075a, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Material: {fileID: 0}
+  m_Color: {r: 1, g: 1, b: 1, a: 1}
+  m_RaycastTarget: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+    m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI,
+      Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
+  m_Texture: {fileID: 0}
+  m_UVRect:
+    serializedVersion: 2
+    x: 0
+    y: 0
+    width: 1
+    height: 1
+  devicePixelRatioOverride: 0
+  hardwareAntiAliasing: 0
+--- !u!222 &2108199661
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 2108199657}
+  m_CullTransparentMesh: 0
diff --git a/Runtime/Plugins/Raycast/Sample/Raycast Simple Testbed.unity.meta b/Runtime/Plugins/Raycast/Sample/Raycast Simple Testbed.unity.meta
new file mode 100644
index 00000000..b54871ec
--- /dev/null
+++ b/Runtime/Plugins/Raycast/Sample/Raycast Simple Testbed.unity.meta	
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 83e4542c541b84d80ad625e366e30839
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Runtime/Plugins/Raycast/Sample/Raycast Testbed.unity b/Runtime/Plugins/Raycast/Sample/Raycast Testbed.unity
new file mode 100644
index 00000000..48aab60e
--- /dev/null
+++ b/Runtime/Plugins/Raycast/Sample/Raycast Testbed.unity	
@@ -0,0 +1,757 @@
+%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: 11
+  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: 0
+    m_PVRSampling: 1
+    m_PVRDirectSampleCount: 32
+    m_PVRSampleCount: 500
+    m_PVRBounces: 2
+    m_PVREnvironmentSampleCount: 500
+    m_PVREnvironmentReferencePointCount: 2048
+    m_PVRFilteringMode: 2
+    m_PVRDenoiserTypeDirect: 0
+    m_PVRDenoiserTypeIndirect: 0
+    m_PVRDenoiserTypeAO: 0
+    m_PVRFilterTypeDirect: 0
+    m_PVRFilterTypeIndirect: 0
+    m_PVRFilterTypeAO: 0
+    m_PVREnvironmentMIS: 0
+    m_PVRCulling: 1
+    m_PVRFilteringGaussRadiusDirect: 1
+    m_PVRFilteringGaussRadiusIndirect: 5
+    m_PVRFilteringGaussRadiusAO: 2
+    m_PVRFilteringAtrousPositionSigmaDirect: 0.5
+    m_PVRFilteringAtrousPositionSigmaIndirect: 2
+    m_PVRFilteringAtrousPositionSigmaAO: 1
+    m_ShowResolutionOverlay: 1
+    m_ExportTrainingData: 0
+  m_LightingDataAsset: {fileID: 0}
+  m_UseShadowmask: 1
+--- !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
+    debug:
+      m_Flags: 0
+  m_NavMeshData: {fileID: 0}
+--- !u!1 &354633976
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 354633980}
+  - component: {fileID: 354633979}
+  - component: {fileID: 354633978}
+  - component: {fileID: 354633977}
+  - component: {fileID: 354633981}
+  m_Layer: 5
+  m_Name: Canvas
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!114 &354633977
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 354633976}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 1301386320, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_IgnoreReversedGraphics: 1
+  m_BlockingObjects: 0
+  m_BlockingMask:
+    serializedVersion: 2
+    m_Bits: 4294967295
+--- !u!114 &354633978
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 354633976}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 1980459831, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_UiScaleMode: 0
+  m_ReferencePixelsPerUnit: 100
+  m_ScaleFactor: 1
+  m_ReferenceResolution: {x: 800, y: 600}
+  m_ScreenMatchMode: 0
+  m_MatchWidthOrHeight: 0
+  m_PhysicalUnit: 3
+  m_FallbackScreenDPI: 96
+  m_DefaultSpriteDPI: 96
+  m_DynamicPixelsPerUnit: 1
+--- !u!223 &354633979
+Canvas:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 354633976}
+  m_Enabled: 1
+  serializedVersion: 3
+  m_RenderMode: 1
+  m_Camera: {fileID: 519420031}
+  m_PlaneDistance: 1
+  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 &354633980
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 354633976}
+  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: 789225035}
+  - {fileID: 657653790}
+  - {fileID: 1942439624}
+  m_Father: {fileID: 0}
+  m_RootOrder: 2
+  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!222 &354633981
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 354633976}
+  m_CullTransparentMesh: 0
+--- !u!1 &519420028
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 519420032}
+  - component: {fileID: 519420031}
+  - component: {fileID: 519420029}
+  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 &519420029
+AudioListener:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 519420028}
+  m_Enabled: 1
+--- !u!20 &519420031
+Camera:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 519420028}
+  m_Enabled: 1
+  serializedVersion: 2
+  m_ClearFlags: 2
+  m_BackGroundColor: {r: 0, g: 0, b: 0, 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: 0
+  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: 0
+  m_HDR: 1
+  m_AllowMSAA: 0
+  m_AllowDynamicResolution: 0
+  m_ForceIntoRT: 0
+  m_OcclusionCulling: 0
+  m_StereoConvergence: 10
+  m_StereoSeparation: 0.022
+--- !u!4 &519420032
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 519420028}
+  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: 1
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!1 &657653789
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 657653790}
+  - component: {fileID: 657653792}
+  - component: {fileID: 657653791}
+  - component: {fileID: 657653793}
+  m_Layer: 5
+  m_Name: Raycast Testbed Panel
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &657653790
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 657653789}
+  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: 354633980}
+  m_RootOrder: 1
+  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: -203, y: 81.79999}
+  m_SizeDelta: {x: 1290.3, y: 471.4}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &657653791
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 657653789}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 1b02d547623984986a44973c4ba2bca0, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Material: {fileID: 0}
+  m_Color: {r: 1, g: 1, b: 1, a: 1}
+  m_RaycastTarget: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+    m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI,
+      Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
+  m_Texture: {fileID: 0}
+  m_UVRect:
+    serializedVersion: 2
+    x: 0
+    y: 0
+    width: 1
+    height: 1
+  devicePixelRatioOverride: 0
+  hardwareAntiAliasing: 0
+--- !u!222 &657653792
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 657653789}
+  m_CullTransparentMesh: 0
+--- !u!114 &657653793
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 657653789}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 2455841904ff14258bae1b28c1363dc0, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  reversed: 0
+--- !u!1 &789225034
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 789225035}
+  - component: {fileID: 789225038}
+  - component: {fileID: 789225037}
+  - component: {fileID: 789225036}
+  m_Layer: 5
+  m_Name: Button
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &789225035
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 789225034}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 3, y: 3, z: 1}
+  m_Children:
+  - {fileID: 812945430}
+  m_Father: {fileID: 354633980}
+  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.000030518, y: -0.000011444}
+  m_SizeDelta: {x: 436.8, y: 81.8}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &789225036
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 789225034}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 1392445389, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Navigation:
+    m_Mode: 3
+    m_SelectOnUp: {fileID: 0}
+    m_SelectOnDown: {fileID: 0}
+    m_SelectOnLeft: {fileID: 0}
+    m_SelectOnRight: {fileID: 0}
+  m_Transition: 1
+  m_Colors:
+    m_NormalColor: {r: 1, g: 1, b: 1, a: 1}
+    m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
+    m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}
+    m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
+    m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608}
+    m_ColorMultiplier: 1
+    m_FadeDuration: 0.1
+  m_SpriteState:
+    m_HighlightedSprite: {fileID: 0}
+    m_PressedSprite: {fileID: 0}
+    m_SelectedSprite: {fileID: 0}
+    m_DisabledSprite: {fileID: 0}
+  m_AnimationTriggers:
+    m_NormalTrigger: Normal
+    m_HighlightedTrigger: Highlighted
+    m_PressedTrigger: Pressed
+    m_SelectedTrigger: Selected
+    m_DisabledTrigger: Disabled
+  m_Interactable: 1
+  m_TargetGraphic: {fileID: 789225037}
+  m_OnClick:
+    m_PersistentCalls:
+      m_Calls: []
+    m_TypeName: UnityEngine.UI.Button+ButtonClickedEvent, UnityEngine.UI, Version=1.0.0.0,
+      Culture=neutral, PublicKeyToken=null
+--- !u!114 &789225037
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 789225034}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: -765806418, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Material: {fileID: 0}
+  m_Color: {r: 1, g: 1, b: 1, a: 1}
+  m_RaycastTarget: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+    m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI,
+      Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
+  m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0}
+  m_Type: 1
+  m_PreserveAspect: 0
+  m_FillCenter: 1
+  m_FillMethod: 4
+  m_FillAmount: 1
+  m_FillClockwise: 1
+  m_FillOrigin: 0
+  m_UseSpriteMesh: 0
+--- !u!222 &789225038
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 789225034}
+  m_CullTransparentMesh: 0
+--- !u!1 &812945429
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 812945430}
+  - component: {fileID: 812945432}
+  - component: {fileID: 812945431}
+  m_Layer: 5
+  m_Name: Text
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &812945430
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 812945429}
+  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: 789225035}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 0, y: 0}
+  m_AnchorMax: {x: 1, y: 1}
+  m_AnchoredPosition: {x: 0, y: 0}
+  m_SizeDelta: {x: 0, y: 0}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &812945431
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 812945429}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 708705254, guid: f70555f144d8491a825f0804e09c671c, 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_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+    m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI,
+      Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
+  m_FontData:
+    m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0}
+    m_FontSize: 14
+    m_FontStyle: 0
+    m_BestFit: 0
+    m_MinSize: 10
+    m_MaxSize: 40
+    m_Alignment: 4
+    m_AlignByGeometry: 0
+    m_RichText: 1
+    m_HorizontalOverflow: 0
+    m_VerticalOverflow: 0
+    m_LineSpacing: 1
+  m_Text: Button
+--- !u!222 &812945432
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 812945429}
+  m_CullTransparentMesh: 0
+--- !u!1 &1742152755
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 1742152758}
+  - component: {fileID: 1742152757}
+  - component: {fileID: 1742152756}
+  m_Layer: 0
+  m_Name: EventSystem
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!114 &1742152756
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1742152755}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 1077351063, guid: f70555f144d8491a825f0804e09c671c, 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 &1742152757
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1742152755}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: -619905303, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_FirstSelected: {fileID: 1742152755}
+  m_sendNavigationEvents: 1
+  m_DragThreshold: 10
+--- !u!4 &1742152758
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1742152755}
+  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: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!1 &1942439623
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 1942439624}
+  - component: {fileID: 1942439627}
+  - component: {fileID: 1942439626}
+  - component: {fileID: 1942439625}
+  m_Layer: 5
+  m_Name: Raycast Testbed Panel (1)
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &1942439624
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1942439623}
+  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: 354633980}
+  m_RootOrder: 2
+  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: 180.85, y: 42}
+  m_SizeDelta: {x: 1290.3, y: 471.4}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &1942439625
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1942439623}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 2455841904ff14258bae1b28c1363dc0, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  reversed: 0
+--- !u!114 &1942439626
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1942439623}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 1b02d547623984986a44973c4ba2bca0, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Material: {fileID: 0}
+  m_Color: {r: 1, g: 1, b: 1, a: 1}
+  m_RaycastTarget: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+    m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI,
+      Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
+  m_Texture: {fileID: 0}
+  m_UVRect:
+    serializedVersion: 2
+    x: 0
+    y: 0
+    width: 1
+    height: 1
+  devicePixelRatioOverride: 0
+  hardwareAntiAliasing: 0
+--- !u!222 &1942439627
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1942439623}
+  m_CullTransparentMesh: 0
diff --git a/Runtime/Plugins/Raycast/Sample/Raycast Testbed.unity.meta b/Runtime/Plugins/Raycast/Sample/Raycast Testbed.unity.meta
new file mode 100644
index 00000000..c04a9724
--- /dev/null
+++ b/Runtime/Plugins/Raycast/Sample/Raycast Testbed.unity.meta	
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: e1bac3be89f2644f6ad3a6ed1ff00617
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Runtime/Plugins/Raycast/Sample/RaycastSimpleTestbedPanel.cs b/Runtime/Plugins/Raycast/Sample/RaycastSimpleTestbedPanel.cs
new file mode 100644
index 00000000..2250678f
--- /dev/null
+++ b/Runtime/Plugins/Raycast/Sample/RaycastSimpleTestbedPanel.cs
@@ -0,0 +1,49 @@
+using Unity.UIWidgets.engine;
+using Unity.UIWidgets.foundation;
+using Unity.UIWidgets.material;
+using Unity.UIWidgets.plugins.raycast;
+using Unity.UIWidgets.ui;
+using Unity.UIWidgets.widgets;
+using UnityEngine;
+using Color = Unity.UIWidgets.ui.Color;
+using Material = Unity.UIWidgets.material.Material;
+
+namespace Unity.UIWidgets.Sample {
+    public class RaycastSimpleTestbedPanel : UIWidgetsPanel {
+        protected override void OnEnable() {
+            FontManager.instance.addFont(Resources.Load<Font>("fonts/MaterialIcons-Regular"), "Material Icons");
+            base.OnEnable();
+        }
+
+        protected override Widget createWidget() {
+            return new MaterialApp(
+                home: new RaycastSimpleTestbedWidget()
+            );
+        }
+    }
+
+    public class RaycastSimpleTestbedWidget : StatefulWidget {
+        public RaycastSimpleTestbedWidget(Key key = null) : base(key) { }
+
+        public override State createState() {
+            return new RaycastSimpleTestbedWidgetState();
+        }
+    }
+
+    public class RaycastSimpleTestbedWidgetState : State<RaycastSimpleTestbedWidget> {
+        public override Widget build(BuildContext context) {
+            return new Material(
+                color: new Color(0x44FFFF00),
+                child: new Center(
+                    child: new RaycastableContainer(
+                        new MaterialButton(
+                            child: new Text("Material Button"),
+                            onPressed: () => { },
+                            color: Colors.lightBlue
+                        )
+                    )
+                )
+            );
+        }
+    }
+}
\ No newline at end of file
diff --git a/Runtime/Plugins/Raycast/Sample/RaycastSimpleTestbedPanel.cs.meta b/Runtime/Plugins/Raycast/Sample/RaycastSimpleTestbedPanel.cs.meta
new file mode 100644
index 00000000..131091ab
--- /dev/null
+++ b/Runtime/Plugins/Raycast/Sample/RaycastSimpleTestbedPanel.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 4fc8b0d34b82c4c63a41e0cde280075a
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Runtime/Plugins/Raycast/Sample/RaycastTestbedPanel.cs b/Runtime/Plugins/Raycast/Sample/RaycastTestbedPanel.cs
new file mode 100644
index 00000000..1c484976
--- /dev/null
+++ b/Runtime/Plugins/Raycast/Sample/RaycastTestbedPanel.cs
@@ -0,0 +1,213 @@
+using System.Collections.Generic;
+using Unity.UIWidgets.engine;
+using Unity.UIWidgets.foundation;
+using Unity.UIWidgets.material;
+using Unity.UIWidgets.painting;
+using Unity.UIWidgets.plugins.raycast;
+using Unity.UIWidgets.rendering;
+using Unity.UIWidgets.ui;
+using Unity.UIWidgets.widgets;
+using UnityEngine;
+using Color = Unity.UIWidgets.ui.Color;
+using Material = Unity.UIWidgets.material.Material;
+using TextStyle = Unity.UIWidgets.painting.TextStyle;
+
+namespace Unity.UIWidgets.Sample {
+    public class RaycastTestbedPanel : UIWidgetsPanel {
+        protected override void OnEnable() {
+            FontManager.instance.addFont(Resources.Load<Font>("fonts/MaterialIcons-Regular"), "Material Icons");
+            base.OnEnable();
+        }
+
+        protected override Widget createWidget() {
+            return new MaterialApp(
+                home: new RaycastTestbedWidget()
+            );
+        }
+    }
+
+    public class RaycastTestbedWidget : StatefulWidget {
+        public RaycastTestbedWidget(Key key = null) : base(key) { }
+
+        public override State createState() {
+            return new RaycastTestbedWidgetState();
+        }
+    }
+
+    public class RaycastTestbedWidgetState : State<RaycastTestbedWidget> {
+        public bool enableState = false;
+        public int switchState = 0;
+        public int switchPosState = 0;
+        public bool enableState2 = false;
+        public int switchState2 = 0;
+        public int switchPosState2 = 2;
+
+        public override Widget build(BuildContext context) {
+            return new Material(
+                color: Colors.transparent,
+                child: new Center(
+                    child: new Column(
+                        mainAxisAlignment: MainAxisAlignment.center,
+                        children: new List<Widget> {
+                            new Row(
+                                mainAxisAlignment: MainAxisAlignment.center,
+                                children: new List<Widget> {
+                                    new RaycastableContainer(child: new MaterialButton(
+                                            child: new Text($"Enable State: {this.enableState.ToString()}"),
+                                            onPressed: () => {
+                                                this.setState(
+                                                    () => { this.enableState = !this.enableState; });
+                                            },
+                                            color: Colors.lightBlue
+                                        )
+                                    ),
+                                    new Padding(padding: EdgeInsets.symmetric(horizontal: 5f)),
+                                    new RaycastableContainer(child: new MaterialButton(
+                                        child: new Text($"Switch State: {this.switchState.ToString()}"),
+                                        onPressed: () => {
+                                            this.setState(
+                                                () => { this.switchState = (this.switchState + 1) % 3; });
+                                        },
+                                        color: Colors.lightBlue
+                                    )),
+                                    new Padding(padding: EdgeInsets.symmetric(horizontal: 5f)),
+                                    new RaycastableContainer(child: new MaterialButton(
+                                        child: new Text($"Switch Pos State: {this.switchPosState.ToString()}"),
+                                        onPressed: () => {
+                                            this.setState(
+                                                () => { this.switchPosState = (this.switchPosState + 1) % 2; });
+                                        },
+                                        color: Colors.lightBlue
+                                    ))
+                                }
+                            ),
+                            new Padding(padding: EdgeInsets.symmetric(5f)),
+                            new Row(
+                                mainAxisAlignment: MainAxisAlignment.center,
+                                children: new List<Widget> {
+                                    new RaycastableContainer(child: new MaterialButton(
+                                        child: new Text($"Enable State: {this.enableState2.ToString()}"),
+                                        onPressed: () => {
+                                            this.setState(
+                                                () => { this.enableState2 = !this.enableState2; });
+                                        },
+                                        color: Colors.lightBlue
+                                    )),
+                                    new Padding(padding: EdgeInsets.symmetric(horizontal: 5f)),
+                                    new RaycastableContainer(child: new MaterialButton(
+                                        child: new Text($"Switch State: {this.switchState2.ToString()}"),
+                                        onPressed: () => {
+                                            this.setState(
+                                                () => { this.switchState2 = (this.switchState2 + 1) % 3; });
+                                        },
+                                        color: Colors.lightBlue
+                                    )),
+                                    new Padding(padding: EdgeInsets.symmetric(horizontal: 5f)),
+                                    new RaycastableContainer(child: new MaterialButton(
+                                        child: new Text($"Switch Pos State: {this.switchPosState2.ToString()}"),
+                                        onPressed: () => {
+                                            this.setState(
+                                                () => { this.switchPosState2 = (this.switchPosState2) % 2 + 1; });
+                                        },
+                                        color: Colors.lightBlue
+                                    ))
+                                }
+                            ),
+                            new Padding(padding: EdgeInsets.symmetric(5f)),
+                            new Stack(
+                                children: new List<Widget> {
+                                    new Row(
+                                        mainAxisAlignment: MainAxisAlignment.center,
+                                        children: new List<Widget> {
+                                            new Container(
+                                                padding: EdgeInsets.only(top: 25f * this.switchPosState,
+                                                    bottom: 25f * (3 - this.switchPosState)),
+                                                child: this.enableState
+                                                    ? (Widget) new RaycastableContainer(
+                                                        new Container(
+                                                            child: new Text(
+                                                                data: this.switchState == 0
+                                                                    ? "特殊字符串"
+                                                                    : this.switchState == 1
+                                                                        ? "特殊字符串串"
+                                                                        : "特殊字符串串串",
+                                                                style: new TextStyle(
+                                                                    fontSize: 48,
+                                                                    fontWeight: FontWeight.bold,
+                                                                    decoration: TextDecoration.none,
+                                                                    color: Colors.red
+                                                                )
+                                                            ),
+                                                            decoration: new BoxDecoration(
+                                                                color: new Color(0x44FFFF00)
+                                                            )
+                                                        )
+                                                    )
+                                                    : new Text(
+                                                        data: this.switchState == 0
+                                                            ? "普通字符串"
+                                                            : this.switchState == 1
+                                                                ? "普通字符串串"
+                                                                : "普通字符串串串",
+                                                        style: new TextStyle(
+                                                            fontSize: 48,
+                                                            fontWeight: FontWeight.bold,
+                                                            decoration: TextDecoration.none,
+                                                            color: Colors.red
+                                                        )
+                                                    )
+                                            )
+                                        }
+                                    ),
+                                    new Row(
+                                        mainAxisAlignment: MainAxisAlignment.center,
+                                        children: new List<Widget> {
+                                            new Container(
+                                                padding: EdgeInsets.only(top: 25f * this.switchPosState2,
+                                                    bottom: 25f * (3 - this.switchPosState2)),
+                                                child: this.enableState2
+                                                    ? (Widget) new RaycastableContainer(
+                                                        new Container(
+                                                            child: new Text(
+                                                                data: this.switchState2 == 0
+                                                                    ? "特殊字符串"
+                                                                    : this.switchState2 == 1
+                                                                        ? "特殊字符串串"
+                                                                        : "特殊字符串串串",
+                                                                style: new TextStyle(
+                                                                    fontSize: 48,
+                                                                    fontWeight: FontWeight.bold,
+                                                                    decoration: TextDecoration.none,
+                                                                    color: Colors.red
+                                                                )
+                                                            ),
+                                                            decoration: new BoxDecoration(
+                                                                color: new Color(0x44FFFF00)
+                                                            )
+                                                        )
+                                                    )
+                                                    : (Widget) new Text(
+                                                        data: this.switchState2 == 0
+                                                            ? "普通字符串"
+                                                            : this.switchState2 == 1
+                                                                ? "普通字符串串"
+                                                                : "普通字符串串串",
+                                                        style: new TextStyle(
+                                                            fontSize: 48,
+                                                            fontWeight: FontWeight.bold,
+                                                            decoration: TextDecoration.none,
+                                                            color: Colors.red
+                                                        )
+                                                    )
+                                            )
+                                        }
+                                    )
+                                }
+                            )
+                        }
+                    )
+                )
+            );
+        }
+    }
+}
\ No newline at end of file
diff --git a/Runtime/Plugins/Raycast/Sample/RaycastTestbedPanel.cs.meta b/Runtime/Plugins/Raycast/Sample/RaycastTestbedPanel.cs.meta
new file mode 100644
index 00000000..3d3ced9d
--- /dev/null
+++ b/Runtime/Plugins/Raycast/Sample/RaycastTestbedPanel.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 1b02d547623984986a44973c4ba2bca0
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Runtime/Plugins/Raycast/UIWidgetsPanelRaycastFilter.cs b/Runtime/Plugins/Raycast/UIWidgetsPanelRaycastFilter.cs
new file mode 100644
index 00000000..f7c1a774
--- /dev/null
+++ b/Runtime/Plugins/Raycast/UIWidgetsPanelRaycastFilter.cs
@@ -0,0 +1,46 @@
+using Unity.UIWidgets.engine;
+using UnityEngine;
+
+namespace Unity.UIWidgets.plugins.raycast {
+    
+    [DisallowMultipleComponent]
+    [RequireComponent(typeof(UIWidgetsPanel))]
+    [DefaultExecutionOrder(1)]
+    public class UIWidgetsPanelRaycastFilter : MonoBehaviour, ICanvasRaycastFilter {
+        public bool reversed;
+        
+        UIWidgetsPanel panel;
+        int windowHashCode;
+
+        void OnEnable() {
+            this.panel = this.GetComponent<UIWidgetsPanel>();
+            this.windowHashCode = this.panel.window.GetHashCode();
+            RaycastManager.VerifyWindow(this.windowHashCode);
+        }
+
+        public bool IsRaycastLocationValid(Vector2 screenPoint, Camera eventCamera) {
+            if (!this.enabled) {
+                return true;
+            }
+
+            Vector2 local;
+            RectTransformUtility.ScreenPointToLocalPointInRectangle(this.panel.rectTransform, screenPoint, eventCamera,
+                out local);
+
+            Rect rect = this.panel.rectTransform.rect;
+
+            // Convert top left corner as reference origin point.
+            local.x += this.panel.rectTransform.pivot.x * rect.width;
+            local.y -= this.panel.rectTransform.pivot.y * rect.height;
+            local.x = local.x / this.panel.devicePixelRatio;
+            local.y = -local.y / this.panel.devicePixelRatio;
+
+            if (this.reversed) {
+                return RaycastManager.CheckCastThrough(this.windowHashCode, local);
+            }
+            else {
+                return !RaycastManager.CheckCastThrough(this.windowHashCode, local);
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/Runtime/Plugins/Raycast/UIWidgetsPanelRaycastFilter.cs.meta b/Runtime/Plugins/Raycast/UIWidgetsPanelRaycastFilter.cs.meta
new file mode 100644
index 00000000..59aa56ee
--- /dev/null
+++ b/Runtime/Plugins/Raycast/UIWidgetsPanelRaycastFilter.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 2455841904ff14258bae1b28c1363dc0
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

From 1334379e49d1136ebf5a7885160206d0cac2e8c9 Mon Sep 17 00:00:00 2001
From: iizzaya <linxuan_0709@icloud.com>
Date: Thu, 7 Nov 2019 16:13:56 +0800
Subject: [PATCH 2/6] [Fix] Wrong Spelling Name

---
 .../Raycast/{RaycastableConatiner.cs => RaycastableContainer.cs}  | 0
 ...{RaycastableConatiner.cs.meta => RaycastableContainer.cs.meta} | 0
 2 files changed, 0 insertions(+), 0 deletions(-)
 rename Runtime/Plugins/Raycast/{RaycastableConatiner.cs => RaycastableContainer.cs} (100%)
 rename Runtime/Plugins/Raycast/{RaycastableConatiner.cs.meta => RaycastableContainer.cs.meta} (100%)

diff --git a/Runtime/Plugins/Raycast/RaycastableConatiner.cs b/Runtime/Plugins/Raycast/RaycastableContainer.cs
similarity index 100%
rename from Runtime/Plugins/Raycast/RaycastableConatiner.cs
rename to Runtime/Plugins/Raycast/RaycastableContainer.cs
diff --git a/Runtime/Plugins/Raycast/RaycastableConatiner.cs.meta b/Runtime/Plugins/Raycast/RaycastableContainer.cs.meta
similarity index 100%
rename from Runtime/Plugins/Raycast/RaycastableConatiner.cs.meta
rename to Runtime/Plugins/Raycast/RaycastableContainer.cs.meta

From d1ebb51a3669a0600573e14dd7f07bf3405e47d2 Mon Sep 17 00:00:00 2001
From: iizzaya <linxuan_0709@icloud.com>
Date: Fri, 8 Nov 2019 19:36:41 +0800
Subject: [PATCH 3/6] [Raycast] Update

---
 Runtime/Plugins/Raycast/RaycastManager.cs     | 106 ++++++++++++------
 .../Plugins/Raycast/RaycastableContainer.cs   |  19 +---
 2 files changed, 79 insertions(+), 46 deletions(-)

diff --git a/Runtime/Plugins/Raycast/RaycastManager.cs b/Runtime/Plugins/Raycast/RaycastManager.cs
index 7b10b4fc..af102ad6 100644
--- a/Runtime/Plugins/Raycast/RaycastManager.cs
+++ b/Runtime/Plugins/Raycast/RaycastManager.cs
@@ -1,15 +1,41 @@
 using System.Collections.Generic;
+using Unity.UIWidgets.foundation;
 using Unity.UIWidgets.ui;
 using UnityEngine;
-using Rect = Unity.UIWidgets.ui.Rect;
 
 namespace Unity.UIWidgets.plugins.raycast {
     public class RaycastableRect {
-        public bool isDirty;
-        public Rect rect;
+        bool _isDirty = true;
 
-        public RaycastableRect(bool isDirty) {
-            this.isDirty = isDirty;
+        public bool isDirty {
+            get { return this._isDirty; }
+        }
+
+        public float left;
+        public float right;
+        public float top;
+        public float bottom;
+
+        public void MarkDirty() {
+            this._isDirty = true;
+        }
+
+        public void UnmarkDirty() {
+            this._isDirty = false;
+        }
+
+        public void UpdateRect(float left, float top, float width, float height) {
+            this.left = left;
+            this.right = left + width;
+            this.top = top;
+            this.bottom = top + height;
+        }
+
+        public bool CheckInRect(Vector2 pos) {
+            return pos.x >= this.left &&
+                   pos.x < this.right &&
+                   pos.y >= this.top &&
+                   pos.y < this.bottom;
         }
     }
 
@@ -26,52 +52,66 @@ public static RaycastManager instance {
             }
         }
 
-        public Dictionary<int, Dictionary<int, RaycastableRect>> hashCodeList =
+        public readonly Dictionary<int, Dictionary<int, RaycastableRect>> raycastHandlerMap =
             new Dictionary<int, Dictionary<int, RaycastableRect>>();
 
         public static void VerifyWindow(int windowHashCode) {
-            if (!instance.hashCodeList.ContainsKey(windowHashCode)) {
-                // Debug.Log($"New Window: @[{windowHashCode}] ({instance.hashCodeList.Count})");
-                instance.hashCodeList.Add(windowHashCode, new Dictionary<int, RaycastableRect>());
+            if (!instance.raycastHandlerMap.ContainsKey(windowHashCode)) {
+                Debug.Log($"New Window: @[{windowHashCode}] ({instance.raycastHandlerMap.Count})");
+                instance.raycastHandlerMap.Add(windowHashCode, new Dictionary<int, RaycastableRect>());
             }
         }
 
-        public static void AddToList(int key, int windowHashCode) {
+        public static void AddToList(int widgetHashCode, int windowHashCode) {
             VerifyWindow(windowHashCode);
-            // Debug.Log($"Add To List: [{key}]@[{windowHashCode}]");
-            if (!instance.hashCodeList[windowHashCode].ContainsKey(key)) {
-                instance.hashCodeList[windowHashCode][key] = new RaycastableRect(true);
+            Debug.Log($"Add To List: [{widgetHashCode}]@[{windowHashCode}]");
+            if (!instance.raycastHandlerMap[windowHashCode].ContainsKey(widgetHashCode)) {
+                instance.raycastHandlerMap[windowHashCode][widgetHashCode] = new RaycastableRect();
+                
             }
         }
 
-        public static void MarkDirty(int key, int windowHashCode) {
-            // Debug.Log($"Mark Dirty: [{key}]@[{windowHashCode}]");
-            if (instance.hashCodeList[windowHashCode].ContainsKey(key)) {
-                instance.hashCodeList[windowHashCode][key].isDirty = true;
-            }
+        public static void MarkDirty(int widgetHashCode, int windowHashCode) {
+            Debug.Log($"Mark Dirty: [{widgetHashCode}]@[{windowHashCode}]");
+            D.assert(instance.raycastHandlerMap.ContainsKey(windowHashCode), () =>
+                $"Raycast Handler Map doesn't contain Window {windowHashCode}");
+            D.assert(instance.raycastHandlerMap[windowHashCode].ContainsKey(widgetHashCode), () =>
+                $"Raycast Handler Map doesn't contain Widget {widgetHashCode} at Window {windowHashCode}");
+
+            instance.raycastHandlerMap[windowHashCode][widgetHashCode].MarkDirty();
         }
 
-        public static void UpdateSizeOffset(int key, int windowHashCode, Size size, Offset offset) {
-            // Debug.Log($"Update Size Offset: [{key}]@[{windowHashCode}]");
-            if (instance.hashCodeList[windowHashCode].ContainsKey(key)) {
-                if (instance.hashCodeList[windowHashCode][key].isDirty) {
-                    instance.hashCodeList[windowHashCode][key].rect =
-                        Rect.fromLTWH(offset.dx, offset.dy, size.width, size.height);
-                    instance.hashCodeList[windowHashCode][key].isDirty = false;
-                }
+        public static void UpdateSizeOffset(int widgetHashCode, int windowHashCode, Size size, Offset offset) {
+            
+            D.assert(instance.raycastHandlerMap.ContainsKey(windowHashCode), () =>
+                $"Raycast Handler Map doesn't contain Window {windowHashCode}");
+            D.assert(instance.raycastHandlerMap[windowHashCode].ContainsKey(widgetHashCode), () =>
+                $"Raycast Handler Map doesn't contain Widget {widgetHashCode} at Window {windowHashCode}");
+
+            if (instance.raycastHandlerMap[windowHashCode][widgetHashCode].isDirty) {
+                Debug.Log($"Update Size Offset: [{widgetHashCode}]@[{windowHashCode}]");
+                instance.raycastHandlerMap[windowHashCode][widgetHashCode]
+                    .UpdateRect(offset.dx, offset.dy, size.width, size.height);
+                instance.raycastHandlerMap[windowHashCode][widgetHashCode].UnmarkDirty();
             }
         }
 
-        public static void RemoveFromList(int key, int windowHashCode) {
-            // Debug.Log($"Remove From List: [{key}]@[{windowHashCode}]");
-            if (instance.hashCodeList[windowHashCode].ContainsKey(key)) {
-                instance.hashCodeList[windowHashCode].Remove(key);
-            }
+        public static void RemoveFromList(int widgetHashCode, int windowHashCode) {
+            Debug.Log($"Remove From List: [{widgetHashCode}]@[{windowHashCode}]");
+            D.assert(instance.raycastHandlerMap.ContainsKey(windowHashCode), () =>
+                $"Raycast Handler Map doesn't contain Window {windowHashCode}");
+            D.assert(instance.raycastHandlerMap[windowHashCode].ContainsKey(widgetHashCode), () =>
+                $"Raycast Handler Map doesn't contain Widget {widgetHashCode} at Window {windowHashCode}");
+
+            instance.raycastHandlerMap[windowHashCode].Remove(widgetHashCode);
         }
 
         public static bool CheckCastThrough(int windowHashCode, Vector2 pos) {
-            foreach (var item in instance.hashCodeList[windowHashCode]) {
-                if (item.Value.rect.contains(new Offset(pos.x, pos.y))) {
+            D.assert(instance.raycastHandlerMap.ContainsKey(windowHashCode), () =>
+                $"Raycast Handler Map doesn't contain Window {windowHashCode}");
+
+            foreach (var item in instance.raycastHandlerMap[windowHashCode]) {
+                if (item.Value.CheckInRect(pos)) {
                     return false;
                 }
             }
diff --git a/Runtime/Plugins/Raycast/RaycastableContainer.cs b/Runtime/Plugins/Raycast/RaycastableContainer.cs
index b1793467..bd73a565 100644
--- a/Runtime/Plugins/Raycast/RaycastableContainer.cs
+++ b/Runtime/Plugins/Raycast/RaycastableContainer.cs
@@ -22,32 +22,25 @@ public override RenderObject createRenderObject(BuildContext context) {
         }
 
         public override Element createElement() {
-            return new _RaycastableBoxRenderElement(this.windowHashCode, this);
+            return new _RaycastableBoxRenderElement(windowHashCode: this.windowHashCode, widget: this);
         }
     }
 
     class RenderRaycastableBox : RenderProxyBox {
         public RenderRaycastableBox(
             int windowHashCode,
-            RenderBox child = null,
-            RaycastableBox widget = null
-        ) : base(child) {
-            this.widget = widget;
+            RaycastableBox widget
+        ) {
+            this.widgetHashCode = widget.GetHashCode();
             this.windowHashCode = windowHashCode;
         }
 
+        readonly int widgetHashCode;
         readonly int windowHashCode;
-        RaycastableBox widget;
-
-        public override void detach() {
-            base.detach();
-            this.markNeedsPaint();
-        }
-
 
         public override void paint(PaintingContext context, Offset offset) {
             // Debug.Log($"[RenderRaycastableBox] Paint {this.widget.GetHashCode()}: {this.size}@{offset}");
-            RaycastManager.UpdateSizeOffset(this.widget.GetHashCode(), (int) this.windowHashCode, this.size, offset);
+            RaycastManager.UpdateSizeOffset(this.widgetHashCode, this.windowHashCode, this.size, offset);
 
             base.paint(context, offset);
         }

From dd7812025cf44bee7b46d8545219689f83ba80c0 Mon Sep 17 00:00:00 2001
From: iizzaya <linxuan_0709@icloud.com>
Date: Sat, 9 Nov 2019 10:27:38 +0800
Subject: [PATCH 4/6] [Raycast] Add UIWidgetsRaycastablePanel

---
 Runtime/Plugins/Raycast/RaycastManager.cs     |  33 ++--
 .../Sample/DefaultSimpleTestbedPanel.cs       |  49 ++++++
 .../DefaultSimpleTestbedPanel.cs.meta}        |   2 +-
 .../Sample/Raycast Simple Testbed.unity       | 145 +-----------------
 .../Sample/RaycastSimpleTestbedPanel.cs       |   3 +-
 .../Raycast/Sample/RaycastTestbedPanel.cs     |   2 +-
 .../Raycast/UIWidgetsPanelRaycastFilter.cs    |  46 ------
 .../Raycast/UIWidgetsRaycastablePanel.cs      |  40 +++++
 .../Raycast/UIWidgetsRaycastablePanel.cs.meta |  11 ++
 Runtime/engine/UIWidgetsPanel.cs              |  12 +-
 10 files changed, 139 insertions(+), 204 deletions(-)
 create mode 100644 Runtime/Plugins/Raycast/Sample/DefaultSimpleTestbedPanel.cs
 rename Runtime/Plugins/Raycast/{UIWidgetsPanelRaycastFilter.cs.meta => Sample/DefaultSimpleTestbedPanel.cs.meta} (83%)
 delete mode 100644 Runtime/Plugins/Raycast/UIWidgetsPanelRaycastFilter.cs
 create mode 100644 Runtime/Plugins/Raycast/UIWidgetsRaycastablePanel.cs
 create mode 100644 Runtime/Plugins/Raycast/UIWidgetsRaycastablePanel.cs.meta

diff --git a/Runtime/Plugins/Raycast/RaycastManager.cs b/Runtime/Plugins/Raycast/RaycastManager.cs
index af102ad6..6c4e1b99 100644
--- a/Runtime/Plugins/Raycast/RaycastManager.cs
+++ b/Runtime/Plugins/Raycast/RaycastManager.cs
@@ -55,24 +55,34 @@ public static RaycastManager instance {
         public readonly Dictionary<int, Dictionary<int, RaycastableRect>> raycastHandlerMap =
             new Dictionary<int, Dictionary<int, RaycastableRect>>();
 
-        public static void VerifyWindow(int windowHashCode) {
+        public static void NewWindow(int windowHashCode) {
             if (!instance.raycastHandlerMap.ContainsKey(windowHashCode)) {
-                Debug.Log($"New Window: @[{windowHashCode}] ({instance.raycastHandlerMap.Count})");
+                // Debug.Log($"New Window: @[{windowHashCode}] ({instance.raycastHandlerMap.Count})");
                 instance.raycastHandlerMap.Add(windowHashCode, new Dictionary<int, RaycastableRect>());
             }
         }
 
-        public static void AddToList(int widgetHashCode, int windowHashCode) {
-            VerifyWindow(windowHashCode);
-            Debug.Log($"Add To List: [{widgetHashCode}]@[{windowHashCode}]");
-            if (!instance.raycastHandlerMap[windowHashCode].ContainsKey(widgetHashCode)) {
-                instance.raycastHandlerMap[windowHashCode][widgetHashCode] = new RaycastableRect();
-                
+        public static void DisposeWindow(int windowHashCode) {
+            if (instance.raycastHandlerMap.ContainsKey(windowHashCode)) {
+                // Debug.Log($"Dispose Window: @[{windowHashCode}]");
+                instance.raycastHandlerMap.Remove(windowHashCode);
             }
         }
 
+        public static void AddToList(int widgetHashCode, int windowHashCode) {
+            // Debug.Log($"Add To List: [{widgetHashCode}]@[{windowHashCode}]");
+            D.assert(instance.raycastHandlerMap.ContainsKey(windowHashCode), () =>
+                $"Raycast Handler Map doesn't contain Window {windowHashCode}, " +
+                $"Make sure using UIWidgetsRaycastablePanel instead of UIWidgetsPanel " +
+                $"while using RaycastableContainer.");
+            D.assert(!instance.raycastHandlerMap[windowHashCode].ContainsKey(widgetHashCode), () =>
+                $"Raycast Handler Map already contains Widget {widgetHashCode} at Window {windowHashCode}");
+
+            instance.raycastHandlerMap[windowHashCode][widgetHashCode] = new RaycastableRect();
+        }
+
         public static void MarkDirty(int widgetHashCode, int windowHashCode) {
-            Debug.Log($"Mark Dirty: [{widgetHashCode}]@[{windowHashCode}]");
+            // Debug.Log($"Mark Dirty: [{widgetHashCode}]@[{windowHashCode}]");
             D.assert(instance.raycastHandlerMap.ContainsKey(windowHashCode), () =>
                 $"Raycast Handler Map doesn't contain Window {windowHashCode}");
             D.assert(instance.raycastHandlerMap[windowHashCode].ContainsKey(widgetHashCode), () =>
@@ -82,14 +92,13 @@ public static void MarkDirty(int widgetHashCode, int windowHashCode) {
         }
 
         public static void UpdateSizeOffset(int widgetHashCode, int windowHashCode, Size size, Offset offset) {
-            
             D.assert(instance.raycastHandlerMap.ContainsKey(windowHashCode), () =>
                 $"Raycast Handler Map doesn't contain Window {windowHashCode}");
             D.assert(instance.raycastHandlerMap[windowHashCode].ContainsKey(widgetHashCode), () =>
                 $"Raycast Handler Map doesn't contain Widget {widgetHashCode} at Window {windowHashCode}");
 
             if (instance.raycastHandlerMap[windowHashCode][widgetHashCode].isDirty) {
-                Debug.Log($"Update Size Offset: [{widgetHashCode}]@[{windowHashCode}]");
+                // Debug.Log($"Update Size Offset: [{widgetHashCode}]@[{windowHashCode}]");
                 instance.raycastHandlerMap[windowHashCode][widgetHashCode]
                     .UpdateRect(offset.dx, offset.dy, size.width, size.height);
                 instance.raycastHandlerMap[windowHashCode][widgetHashCode].UnmarkDirty();
@@ -97,7 +106,7 @@ public static void UpdateSizeOffset(int widgetHashCode, int windowHashCode, Size
         }
 
         public static void RemoveFromList(int widgetHashCode, int windowHashCode) {
-            Debug.Log($"Remove From List: [{widgetHashCode}]@[{windowHashCode}]");
+            // Debug.Log($"Remove From List: [{widgetHashCode}]@[{windowHashCode}]");
             D.assert(instance.raycastHandlerMap.ContainsKey(windowHashCode), () =>
                 $"Raycast Handler Map doesn't contain Window {windowHashCode}");
             D.assert(instance.raycastHandlerMap[windowHashCode].ContainsKey(widgetHashCode), () =>
diff --git a/Runtime/Plugins/Raycast/Sample/DefaultSimpleTestbedPanel.cs b/Runtime/Plugins/Raycast/Sample/DefaultSimpleTestbedPanel.cs
new file mode 100644
index 00000000..e4975995
--- /dev/null
+++ b/Runtime/Plugins/Raycast/Sample/DefaultSimpleTestbedPanel.cs
@@ -0,0 +1,49 @@
+using Unity.UIWidgets.engine;
+using Unity.UIWidgets.foundation;
+using Unity.UIWidgets.material;
+using Unity.UIWidgets.plugins.raycast;
+using Unity.UIWidgets.ui;
+using Unity.UIWidgets.widgets;
+using UnityEngine;
+using Color = Unity.UIWidgets.ui.Color;
+using Material = Unity.UIWidgets.material.Material;
+
+namespace Unity.UIWidgets.Sample {
+    public class DefaultSimpleTestbedPanel : UIWidgetsPanel {
+        protected override void OnEnable() {
+            FontManager.instance.addFont(Resources.Load<Font>("fonts/MaterialIcons-Regular"), "Material Icons");
+            base.OnEnable();
+        }
+
+        protected override Widget createWidget() {
+            return new MaterialApp(
+                home: new DefaultSimpleTestbedWidget()
+            );
+        }
+    }
+
+    public class DefaultSimpleTestbedWidget : StatefulWidget {
+        public DefaultSimpleTestbedWidget(Key key = null) : base(key) { }
+
+        public override State createState() {
+            return new DefaultSimpleTestbedWidgetState();
+        }
+    }
+
+    public class DefaultSimpleTestbedWidgetState : State<DefaultSimpleTestbedWidget> {
+        public override Widget build(BuildContext context) {
+            return new Material(
+                color: new Color(0x44FFFF00),
+                child: new Center(
+                    child: new Container(
+                        child: new MaterialButton(
+                            child: new Text("Material Button"),
+                            onPressed: () => { },
+                            color: Colors.lightBlue
+                        )
+                    )
+                )
+            );
+        }
+    }
+}
\ No newline at end of file
diff --git a/Runtime/Plugins/Raycast/UIWidgetsPanelRaycastFilter.cs.meta b/Runtime/Plugins/Raycast/Sample/DefaultSimpleTestbedPanel.cs.meta
similarity index 83%
rename from Runtime/Plugins/Raycast/UIWidgetsPanelRaycastFilter.cs.meta
rename to Runtime/Plugins/Raycast/Sample/DefaultSimpleTestbedPanel.cs.meta
index 59aa56ee..6d0e0746 100644
--- a/Runtime/Plugins/Raycast/UIWidgetsPanelRaycastFilter.cs.meta
+++ b/Runtime/Plugins/Raycast/Sample/DefaultSimpleTestbedPanel.cs.meta
@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: 2455841904ff14258bae1b28c1363dc0
+guid: 15ddf18357c864b1b822b471672fd391
 MonoImporter:
   externalObjects: {}
   serializedVersion: 2
diff --git a/Runtime/Plugins/Raycast/Sample/Raycast Simple Testbed.unity b/Runtime/Plugins/Raycast/Sample/Raycast Simple Testbed.unity
index e1a3c5d1..1c2f43eb 100644
--- a/Runtime/Plugins/Raycast/Sample/Raycast Simple Testbed.unity	
+++ b/Runtime/Plugins/Raycast/Sample/Raycast Simple Testbed.unity	
@@ -130,7 +130,6 @@ GameObject:
   m_Component:
   - component: {fileID: 238084977}
   - component: {fileID: 238084980}
-  - component: {fileID: 238084979}
   - component: {fileID: 238084978}
   m_Layer: 5
   m_Name: Panel Button With Filter
@@ -155,23 +154,10 @@ RectTransform:
   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: -200, y: 0.0000076294}
+  m_AnchoredPosition: {x: 0, y: 0.0000076294}
   m_SizeDelta: {x: 300, y: 150}
   m_Pivot: {x: 0.5, y: 0.5}
 --- !u!114 &238084978
-MonoBehaviour:
-  m_ObjectHideFlags: 0
-  m_CorrespondingSourceObject: {fileID: 0}
-  m_PrefabInstance: {fileID: 0}
-  m_PrefabAsset: {fileID: 0}
-  m_GameObject: {fileID: 238084976}
-  m_Enabled: 1
-  m_EditorHideFlags: 0
-  m_Script: {fileID: 11500000, guid: 2455841904ff14258bae1b28c1363dc0, type: 3}
-  m_Name: 
-  m_EditorClassIdentifier: 
-  reversed: 0
---- !u!114 &238084979
 MonoBehaviour:
   m_ObjectHideFlags: 0
   m_CorrespondingSourceObject: {fileID: 0}
@@ -302,7 +288,6 @@ RectTransform:
   - {fileID: 789225035}
   - {fileID: 1371170890}
   - {fileID: 238084977}
-  - {fileID: 1262432453}
   - {fileID: 409216488}
   - {fileID: 2108199658}
   m_Father: {fileID: 0}
@@ -332,7 +317,6 @@ GameObject:
   - component: {fileID: 409216488}
   - component: {fileID: 409216491}
   - component: {fileID: 409216490}
-  - component: {fileID: 409216489}
   m_Layer: 5
   m_Name: Panel Button With Filter (1)
   m_TagString: Untagged
@@ -352,26 +336,13 @@ RectTransform:
   m_LocalScale: {x: 1, y: 1, z: 1}
   m_Children: []
   m_Father: {fileID: 354633980}
-  m_RootOrder: 4
+  m_RootOrder: 3
   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: 150, y: 50}
+  m_AnchoredPosition: {x: 0, y: -200}
   m_SizeDelta: {x: 300, y: 150}
   m_Pivot: {x: 0.5, y: 0.5}
---- !u!114 &409216489
-MonoBehaviour:
-  m_ObjectHideFlags: 0
-  m_CorrespondingSourceObject: {fileID: 0}
-  m_PrefabInstance: {fileID: 0}
-  m_PrefabAsset: {fileID: 0}
-  m_GameObject: {fileID: 409216487}
-  m_Enabled: 1
-  m_EditorHideFlags: 0
-  m_Script: {fileID: 11500000, guid: 2455841904ff14258bae1b28c1363dc0, type: 3}
-  m_Name: 
-  m_EditorClassIdentifier: 
-  reversed: 0
 --- !u!114 &409216490
 MonoBehaviour:
   m_ObjectHideFlags: 0
@@ -692,94 +663,6 @@ CanvasRenderer:
   m_PrefabAsset: {fileID: 0}
   m_GameObject: {fileID: 1097866537}
   m_CullTransparentMesh: 0
---- !u!1 &1262432452
-GameObject:
-  m_ObjectHideFlags: 0
-  m_CorrespondingSourceObject: {fileID: 0}
-  m_PrefabInstance: {fileID: 0}
-  m_PrefabAsset: {fileID: 0}
-  serializedVersion: 6
-  m_Component:
-  - component: {fileID: 1262432453}
-  - component: {fileID: 1262432456}
-  - component: {fileID: 1262432455}
-  - component: {fileID: 1262432454}
-  m_Layer: 5
-  m_Name: Panel Button With Filter (Reversed)
-  m_TagString: Untagged
-  m_Icon: {fileID: 0}
-  m_NavMeshLayer: 0
-  m_StaticEditorFlags: 0
-  m_IsActive: 1
---- !u!224 &1262432453
-RectTransform:
-  m_ObjectHideFlags: 0
-  m_CorrespondingSourceObject: {fileID: 0}
-  m_PrefabInstance: {fileID: 0}
-  m_PrefabAsset: {fileID: 0}
-  m_GameObject: {fileID: 1262432452}
-  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: 354633980}
-  m_RootOrder: 3
-  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: -200, y: -200}
-  m_SizeDelta: {x: 300, y: 150}
-  m_Pivot: {x: 0.5, y: 0.5}
---- !u!114 &1262432454
-MonoBehaviour:
-  m_ObjectHideFlags: 0
-  m_CorrespondingSourceObject: {fileID: 0}
-  m_PrefabInstance: {fileID: 0}
-  m_PrefabAsset: {fileID: 0}
-  m_GameObject: {fileID: 1262432452}
-  m_Enabled: 1
-  m_EditorHideFlags: 0
-  m_Script: {fileID: 11500000, guid: 2455841904ff14258bae1b28c1363dc0, type: 3}
-  m_Name: 
-  m_EditorClassIdentifier: 
-  reversed: 1
---- !u!114 &1262432455
-MonoBehaviour:
-  m_ObjectHideFlags: 0
-  m_CorrespondingSourceObject: {fileID: 0}
-  m_PrefabInstance: {fileID: 0}
-  m_PrefabAsset: {fileID: 0}
-  m_GameObject: {fileID: 1262432452}
-  m_Enabled: 1
-  m_EditorHideFlags: 0
-  m_Script: {fileID: 11500000, guid: 4fc8b0d34b82c4c63a41e0cde280075a, type: 3}
-  m_Name: 
-  m_EditorClassIdentifier: 
-  m_Material: {fileID: 0}
-  m_Color: {r: 1, g: 1, b: 1, a: 1}
-  m_RaycastTarget: 1
-  m_OnCullStateChanged:
-    m_PersistentCalls:
-      m_Calls: []
-    m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI,
-      Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
-  m_Texture: {fileID: 0}
-  m_UVRect:
-    serializedVersion: 2
-    x: 0
-    y: 0
-    width: 1
-    height: 1
-  devicePixelRatioOverride: 0
-  hardwareAntiAliasing: 0
---- !u!222 &1262432456
-CanvasRenderer:
-  m_ObjectHideFlags: 0
-  m_CorrespondingSourceObject: {fileID: 0}
-  m_PrefabInstance: {fileID: 0}
-  m_PrefabAsset: {fileID: 0}
-  m_GameObject: {fileID: 1262432452}
-  m_CullTransparentMesh: 0
 --- !u!1 &1371170889
 GameObject:
   m_ObjectHideFlags: 0
@@ -814,7 +697,7 @@ RectTransform:
   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: -200, y: 200}
+  m_AnchoredPosition: {x: 0, y: 200}
   m_SizeDelta: {x: 300, y: 150}
   m_Pivot: {x: 0.5, y: 0.5}
 --- !u!222 &1371170891
@@ -834,7 +717,7 @@ MonoBehaviour:
   m_GameObject: {fileID: 1371170889}
   m_Enabled: 1
   m_EditorHideFlags: 0
-  m_Script: {fileID: 11500000, guid: 4fc8b0d34b82c4c63a41e0cde280075a, type: 3}
+  m_Script: {fileID: 11500000, guid: 15ddf18357c864b1b822b471672fd391, type: 3}
   m_Name: 
   m_EditorClassIdentifier: 
   m_Material: {fileID: 0}
@@ -931,7 +814,6 @@ GameObject:
   - component: {fileID: 2108199658}
   - component: {fileID: 2108199661}
   - component: {fileID: 2108199660}
-  - component: {fileID: 2108199659}
   m_Layer: 5
   m_Name: Panel Button With Filter (2)
   m_TagString: Untagged
@@ -951,26 +833,13 @@ RectTransform:
   m_LocalScale: {x: 1, y: 1, z: 1}
   m_Children: []
   m_Father: {fileID: 354633980}
-  m_RootOrder: 5
+  m_RootOrder: 4
   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: 227, y: 0}
+  m_AnchoredPosition: {x: 50, y: -240}
   m_SizeDelta: {x: 300, y: 150}
   m_Pivot: {x: 0.5, y: 0.5}
---- !u!114 &2108199659
-MonoBehaviour:
-  m_ObjectHideFlags: 0
-  m_CorrespondingSourceObject: {fileID: 0}
-  m_PrefabInstance: {fileID: 0}
-  m_PrefabAsset: {fileID: 0}
-  m_GameObject: {fileID: 2108199657}
-  m_Enabled: 1
-  m_EditorHideFlags: 0
-  m_Script: {fileID: 11500000, guid: 2455841904ff14258bae1b28c1363dc0, type: 3}
-  m_Name: 
-  m_EditorClassIdentifier: 
-  reversed: 0
 --- !u!114 &2108199660
 MonoBehaviour:
   m_ObjectHideFlags: 0
diff --git a/Runtime/Plugins/Raycast/Sample/RaycastSimpleTestbedPanel.cs b/Runtime/Plugins/Raycast/Sample/RaycastSimpleTestbedPanel.cs
index 2250678f..3ad1877b 100644
--- a/Runtime/Plugins/Raycast/Sample/RaycastSimpleTestbedPanel.cs
+++ b/Runtime/Plugins/Raycast/Sample/RaycastSimpleTestbedPanel.cs
@@ -1,4 +1,3 @@
-using Unity.UIWidgets.engine;
 using Unity.UIWidgets.foundation;
 using Unity.UIWidgets.material;
 using Unity.UIWidgets.plugins.raycast;
@@ -9,7 +8,7 @@
 using Material = Unity.UIWidgets.material.Material;
 
 namespace Unity.UIWidgets.Sample {
-    public class RaycastSimpleTestbedPanel : UIWidgetsPanel {
+    public class RaycastSimpleTestbedPanel : UIWidgetsRaycastablePanel {
         protected override void OnEnable() {
             FontManager.instance.addFont(Resources.Load<Font>("fonts/MaterialIcons-Regular"), "Material Icons");
             base.OnEnable();
diff --git a/Runtime/Plugins/Raycast/Sample/RaycastTestbedPanel.cs b/Runtime/Plugins/Raycast/Sample/RaycastTestbedPanel.cs
index 1c484976..779406ce 100644
--- a/Runtime/Plugins/Raycast/Sample/RaycastTestbedPanel.cs
+++ b/Runtime/Plugins/Raycast/Sample/RaycastTestbedPanel.cs
@@ -13,7 +13,7 @@
 using TextStyle = Unity.UIWidgets.painting.TextStyle;
 
 namespace Unity.UIWidgets.Sample {
-    public class RaycastTestbedPanel : UIWidgetsPanel {
+    public class RaycastTestbedPanel : UIWidgetsRaycastablePanel {
         protected override void OnEnable() {
             FontManager.instance.addFont(Resources.Load<Font>("fonts/MaterialIcons-Regular"), "Material Icons");
             base.OnEnable();
diff --git a/Runtime/Plugins/Raycast/UIWidgetsPanelRaycastFilter.cs b/Runtime/Plugins/Raycast/UIWidgetsPanelRaycastFilter.cs
deleted file mode 100644
index f7c1a774..00000000
--- a/Runtime/Plugins/Raycast/UIWidgetsPanelRaycastFilter.cs
+++ /dev/null
@@ -1,46 +0,0 @@
-using Unity.UIWidgets.engine;
-using UnityEngine;
-
-namespace Unity.UIWidgets.plugins.raycast {
-    
-    [DisallowMultipleComponent]
-    [RequireComponent(typeof(UIWidgetsPanel))]
-    [DefaultExecutionOrder(1)]
-    public class UIWidgetsPanelRaycastFilter : MonoBehaviour, ICanvasRaycastFilter {
-        public bool reversed;
-        
-        UIWidgetsPanel panel;
-        int windowHashCode;
-
-        void OnEnable() {
-            this.panel = this.GetComponent<UIWidgetsPanel>();
-            this.windowHashCode = this.panel.window.GetHashCode();
-            RaycastManager.VerifyWindow(this.windowHashCode);
-        }
-
-        public bool IsRaycastLocationValid(Vector2 screenPoint, Camera eventCamera) {
-            if (!this.enabled) {
-                return true;
-            }
-
-            Vector2 local;
-            RectTransformUtility.ScreenPointToLocalPointInRectangle(this.panel.rectTransform, screenPoint, eventCamera,
-                out local);
-
-            Rect rect = this.panel.rectTransform.rect;
-
-            // Convert top left corner as reference origin point.
-            local.x += this.panel.rectTransform.pivot.x * rect.width;
-            local.y -= this.panel.rectTransform.pivot.y * rect.height;
-            local.x = local.x / this.panel.devicePixelRatio;
-            local.y = -local.y / this.panel.devicePixelRatio;
-
-            if (this.reversed) {
-                return RaycastManager.CheckCastThrough(this.windowHashCode, local);
-            }
-            else {
-                return !RaycastManager.CheckCastThrough(this.windowHashCode, local);
-            }
-        }
-    }
-}
\ No newline at end of file
diff --git a/Runtime/Plugins/Raycast/UIWidgetsRaycastablePanel.cs b/Runtime/Plugins/Raycast/UIWidgetsRaycastablePanel.cs
new file mode 100644
index 00000000..e2961f36
--- /dev/null
+++ b/Runtime/Plugins/Raycast/UIWidgetsRaycastablePanel.cs
@@ -0,0 +1,40 @@
+using Unity.UIWidgets.engine;
+using UnityEngine;
+
+namespace Unity.UIWidgets.plugins.raycast {
+    [RequireComponent(typeof(RectTransform))]
+    public class UIWidgetsRaycastablePanel : UIWidgetsPanel, ICanvasRaycastFilter {
+        int windowHashCode;
+
+        protected override void InitWindowAdapter() {
+            base.InitWindowAdapter();
+            this.windowHashCode = this.window.GetHashCode();
+            RaycastManager.NewWindow(this.windowHashCode);
+        }
+
+        protected override void OnDisable() {
+            base.OnDisable();
+            RaycastManager.DisposeWindow(this.windowHashCode);
+        }
+
+        public bool IsRaycastLocationValid(Vector2 screenPoint, Camera eventCamera) {
+            if (!this.enabled) {
+                return true;
+            }
+
+            Vector2 local;
+            RectTransformUtility.ScreenPointToLocalPointInRectangle(this.rectTransform, screenPoint, eventCamera,
+                out local);
+
+            Rect rect = this.rectTransform.rect;
+
+            // Convert top left corner as reference origin point.
+            local.x += this.rectTransform.pivot.x * rect.width;
+            local.y -= this.rectTransform.pivot.y * rect.height;
+            local.x = local.x / this.devicePixelRatio;
+            local.y = -local.y / this.devicePixelRatio;
+
+            return !RaycastManager.CheckCastThrough(this.windowHashCode, local);
+        }
+    }
+}
\ No newline at end of file
diff --git a/Runtime/Plugins/Raycast/UIWidgetsRaycastablePanel.cs.meta b/Runtime/Plugins/Raycast/UIWidgetsRaycastablePanel.cs.meta
new file mode 100644
index 00000000..f5ff1f78
--- /dev/null
+++ b/Runtime/Plugins/Raycast/UIWidgetsRaycastablePanel.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: e5265d12f7193408b90993bdf987f058
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Runtime/engine/UIWidgetsPanel.cs b/Runtime/engine/UIWidgetsPanel.cs
index a72ffabf..c886fea3 100644
--- a/Runtime/engine/UIWidgetsPanel.cs
+++ b/Runtime/engine/UIWidgetsPanel.cs
@@ -138,6 +138,13 @@ void _handleViewMetricsChanged(string method, List<JSONNode> args) {
             this._displayMetrics.onViewMetricsChanged();
         }
 
+        protected virtual void InitWindowAdapter() {
+            D.assert(this._windowAdapter == null);
+            this._windowAdapter = new UIWidgetWindowAdapter(this);
+
+            this._windowAdapter.OnEnable();
+        }
+
         protected override void OnEnable() {
             base.OnEnable();
 
@@ -153,10 +160,7 @@ protected override void OnEnable() {
                 _repaintEvent = new Event {type = EventType.Repaint};
             }
 
-            D.assert(this._windowAdapter == null);
-            this._windowAdapter = new UIWidgetWindowAdapter(this);
-
-            this._windowAdapter.OnEnable();
+            this.InitWindowAdapter();
 
             Widget root;
             using (this._windowAdapter.getScope()) {

From 368dc8f9c2df7862ce608ed23b729275c28d06d2 Mon Sep 17 00:00:00 2001
From: iizzaya <linxuan_0709@icloud.com>
Date: Sat, 9 Nov 2019 10:29:23 +0800
Subject: [PATCH 5/6] [Raycast] Remove Debug.Log

---
 Runtime/Plugins/Raycast/RaycastManager.cs       | 6 ------
 Runtime/Plugins/Raycast/RaycastableContainer.cs | 5 -----
 2 files changed, 11 deletions(-)

diff --git a/Runtime/Plugins/Raycast/RaycastManager.cs b/Runtime/Plugins/Raycast/RaycastManager.cs
index 6c4e1b99..9f5beae7 100644
--- a/Runtime/Plugins/Raycast/RaycastManager.cs
+++ b/Runtime/Plugins/Raycast/RaycastManager.cs
@@ -57,20 +57,17 @@ public static RaycastManager instance {
 
         public static void NewWindow(int windowHashCode) {
             if (!instance.raycastHandlerMap.ContainsKey(windowHashCode)) {
-                // Debug.Log($"New Window: @[{windowHashCode}] ({instance.raycastHandlerMap.Count})");
                 instance.raycastHandlerMap.Add(windowHashCode, new Dictionary<int, RaycastableRect>());
             }
         }
 
         public static void DisposeWindow(int windowHashCode) {
             if (instance.raycastHandlerMap.ContainsKey(windowHashCode)) {
-                // Debug.Log($"Dispose Window: @[{windowHashCode}]");
                 instance.raycastHandlerMap.Remove(windowHashCode);
             }
         }
 
         public static void AddToList(int widgetHashCode, int windowHashCode) {
-            // Debug.Log($"Add To List: [{widgetHashCode}]@[{windowHashCode}]");
             D.assert(instance.raycastHandlerMap.ContainsKey(windowHashCode), () =>
                 $"Raycast Handler Map doesn't contain Window {windowHashCode}, " +
                 $"Make sure using UIWidgetsRaycastablePanel instead of UIWidgetsPanel " +
@@ -82,7 +79,6 @@ public static void AddToList(int widgetHashCode, int windowHashCode) {
         }
 
         public static void MarkDirty(int widgetHashCode, int windowHashCode) {
-            // Debug.Log($"Mark Dirty: [{widgetHashCode}]@[{windowHashCode}]");
             D.assert(instance.raycastHandlerMap.ContainsKey(windowHashCode), () =>
                 $"Raycast Handler Map doesn't contain Window {windowHashCode}");
             D.assert(instance.raycastHandlerMap[windowHashCode].ContainsKey(widgetHashCode), () =>
@@ -98,7 +94,6 @@ public static void UpdateSizeOffset(int widgetHashCode, int windowHashCode, Size
                 $"Raycast Handler Map doesn't contain Widget {widgetHashCode} at Window {windowHashCode}");
 
             if (instance.raycastHandlerMap[windowHashCode][widgetHashCode].isDirty) {
-                // Debug.Log($"Update Size Offset: [{widgetHashCode}]@[{windowHashCode}]");
                 instance.raycastHandlerMap[windowHashCode][widgetHashCode]
                     .UpdateRect(offset.dx, offset.dy, size.width, size.height);
                 instance.raycastHandlerMap[windowHashCode][widgetHashCode].UnmarkDirty();
@@ -106,7 +101,6 @@ public static void UpdateSizeOffset(int widgetHashCode, int windowHashCode, Size
         }
 
         public static void RemoveFromList(int widgetHashCode, int windowHashCode) {
-            // Debug.Log($"Remove From List: [{widgetHashCode}]@[{windowHashCode}]");
             D.assert(instance.raycastHandlerMap.ContainsKey(windowHashCode), () =>
                 $"Raycast Handler Map doesn't contain Window {windowHashCode}");
             D.assert(instance.raycastHandlerMap[windowHashCode].ContainsKey(widgetHashCode), () =>
diff --git a/Runtime/Plugins/Raycast/RaycastableContainer.cs b/Runtime/Plugins/Raycast/RaycastableContainer.cs
index bd73a565..8f2b9459 100644
--- a/Runtime/Plugins/Raycast/RaycastableContainer.cs
+++ b/Runtime/Plugins/Raycast/RaycastableContainer.cs
@@ -39,7 +39,6 @@ RaycastableBox widget
         readonly int windowHashCode;
 
         public override void paint(PaintingContext context, Offset offset) {
-            // Debug.Log($"[RenderRaycastableBox] Paint {this.widget.GetHashCode()}: {this.size}@{offset}");
             RaycastManager.UpdateSizeOffset(this.widgetHashCode, this.windowHashCode, this.size, offset);
 
             base.paint(context, offset);
@@ -63,20 +62,16 @@ RaycastableBox widget
 
         public override void mount(Element parent, object newSlot) {
             this.widgetHashCode = this.widget.GetHashCode();
-
-            // Debug.Log($"[RaycastableBox] Mount: {this.initHashCode}");
             RaycastManager.AddToList(this.widgetHashCode, this.windowHashCode);
             base.mount(parent, newSlot);
         }
 
         public override void update(Widget newWidget) {
-            // Debug.Log($"[RaycastableBox] Update: {this.initHashCode}");
             RaycastManager.MarkDirty(this.widgetHashCode, this.windowHashCode);
             base.update(newWidget);
         }
 
         public override void unmount() {
-            // Debug.Log($"[RaycastableBox] Unmount: {this.initHashCode}");
             RaycastManager.RemoveFromList(this.widgetHashCode, this.windowHashCode);
             base.unmount();
         }

From e5b9bd55c4b331d3ebe7a24ea0fd06e4edad3cb7 Mon Sep 17 00:00:00 2001
From: iizzaya <linxuan_0709@icloud.com>
Date: Sat, 30 Nov 2019 14:00:00 +0800
Subject: [PATCH 6/6] [Raycast] Move Files' Location

---
 Runtime/Plugins/Raycast/Sample.meta           |   8 -
 .../Sample/DefaultSimpleTestbedPanel.cs       |  49 -
 .../Sample/DefaultSimpleTestbedPanel.cs.meta  |  11 -
 .../Sample/Raycast Simple Testbed.unity       | 879 ------------------
 .../Sample/Raycast Simple Testbed.unity.meta  |   7 -
 .../Raycast/Sample/Raycast Testbed.unity      | 757 ---------------
 .../Raycast/Sample/Raycast Testbed.unity.meta |   7 -
 .../Sample/RaycastSimpleTestbedPanel.cs       |  48 -
 .../Sample/RaycastSimpleTestbedPanel.cs.meta  |  11 -
 .../Raycast/Sample/RaycastTestbedPanel.cs     | 213 -----
 .../Sample/RaycastTestbedPanel.cs.meta        |  11 -
 .../Raycast.meta => engine/raycastable.meta}  |   2 +-
 .../raycastable}/RaycastManager.cs            |   2 +-
 .../raycastable}/RaycastManager.cs.meta       |   0
 .../raycastable}/RaycastableContainer.cs      |   2 +-
 .../raycastable}/RaycastableContainer.cs.meta |   0
 .../raycastable}/UIWidgetsRaycastablePanel.cs |   2 +-
 .../UIWidgetsRaycastablePanel.cs.meta         |   0
 18 files changed, 4 insertions(+), 2005 deletions(-)
 delete mode 100644 Runtime/Plugins/Raycast/Sample.meta
 delete mode 100644 Runtime/Plugins/Raycast/Sample/DefaultSimpleTestbedPanel.cs
 delete mode 100644 Runtime/Plugins/Raycast/Sample/DefaultSimpleTestbedPanel.cs.meta
 delete mode 100644 Runtime/Plugins/Raycast/Sample/Raycast Simple Testbed.unity
 delete mode 100644 Runtime/Plugins/Raycast/Sample/Raycast Simple Testbed.unity.meta
 delete mode 100644 Runtime/Plugins/Raycast/Sample/Raycast Testbed.unity
 delete mode 100644 Runtime/Plugins/Raycast/Sample/Raycast Testbed.unity.meta
 delete mode 100644 Runtime/Plugins/Raycast/Sample/RaycastSimpleTestbedPanel.cs
 delete mode 100644 Runtime/Plugins/Raycast/Sample/RaycastSimpleTestbedPanel.cs.meta
 delete mode 100644 Runtime/Plugins/Raycast/Sample/RaycastTestbedPanel.cs
 delete mode 100644 Runtime/Plugins/Raycast/Sample/RaycastTestbedPanel.cs.meta
 rename Runtime/{Plugins/Raycast.meta => engine/raycastable.meta} (77%)
 rename Runtime/{Plugins/Raycast => engine/raycastable}/RaycastManager.cs (99%)
 rename Runtime/{Plugins/Raycast => engine/raycastable}/RaycastManager.cs.meta (100%)
 rename Runtime/{Plugins/Raycast => engine/raycastable}/RaycastableContainer.cs (98%)
 rename Runtime/{Plugins/Raycast => engine/raycastable}/RaycastableContainer.cs.meta (100%)
 rename Runtime/{Plugins/Raycast => engine/raycastable}/UIWidgetsRaycastablePanel.cs (96%)
 rename Runtime/{Plugins/Raycast => engine/raycastable}/UIWidgetsRaycastablePanel.cs.meta (100%)

diff --git a/Runtime/Plugins/Raycast/Sample.meta b/Runtime/Plugins/Raycast/Sample.meta
deleted file mode 100644
index 28885504..00000000
--- a/Runtime/Plugins/Raycast/Sample.meta
+++ /dev/null
@@ -1,8 +0,0 @@
-fileFormatVersion: 2
-guid: a722cfcd498904dd68cd954f2a5a1892
-folderAsset: yes
-DefaultImporter:
-  externalObjects: {}
-  userData: 
-  assetBundleName: 
-  assetBundleVariant: 
diff --git a/Runtime/Plugins/Raycast/Sample/DefaultSimpleTestbedPanel.cs b/Runtime/Plugins/Raycast/Sample/DefaultSimpleTestbedPanel.cs
deleted file mode 100644
index e4975995..00000000
--- a/Runtime/Plugins/Raycast/Sample/DefaultSimpleTestbedPanel.cs
+++ /dev/null
@@ -1,49 +0,0 @@
-using Unity.UIWidgets.engine;
-using Unity.UIWidgets.foundation;
-using Unity.UIWidgets.material;
-using Unity.UIWidgets.plugins.raycast;
-using Unity.UIWidgets.ui;
-using Unity.UIWidgets.widgets;
-using UnityEngine;
-using Color = Unity.UIWidgets.ui.Color;
-using Material = Unity.UIWidgets.material.Material;
-
-namespace Unity.UIWidgets.Sample {
-    public class DefaultSimpleTestbedPanel : UIWidgetsPanel {
-        protected override void OnEnable() {
-            FontManager.instance.addFont(Resources.Load<Font>("fonts/MaterialIcons-Regular"), "Material Icons");
-            base.OnEnable();
-        }
-
-        protected override Widget createWidget() {
-            return new MaterialApp(
-                home: new DefaultSimpleTestbedWidget()
-            );
-        }
-    }
-
-    public class DefaultSimpleTestbedWidget : StatefulWidget {
-        public DefaultSimpleTestbedWidget(Key key = null) : base(key) { }
-
-        public override State createState() {
-            return new DefaultSimpleTestbedWidgetState();
-        }
-    }
-
-    public class DefaultSimpleTestbedWidgetState : State<DefaultSimpleTestbedWidget> {
-        public override Widget build(BuildContext context) {
-            return new Material(
-                color: new Color(0x44FFFF00),
-                child: new Center(
-                    child: new Container(
-                        child: new MaterialButton(
-                            child: new Text("Material Button"),
-                            onPressed: () => { },
-                            color: Colors.lightBlue
-                        )
-                    )
-                )
-            );
-        }
-    }
-}
\ No newline at end of file
diff --git a/Runtime/Plugins/Raycast/Sample/DefaultSimpleTestbedPanel.cs.meta b/Runtime/Plugins/Raycast/Sample/DefaultSimpleTestbedPanel.cs.meta
deleted file mode 100644
index 6d0e0746..00000000
--- a/Runtime/Plugins/Raycast/Sample/DefaultSimpleTestbedPanel.cs.meta
+++ /dev/null
@@ -1,11 +0,0 @@
-fileFormatVersion: 2
-guid: 15ddf18357c864b1b822b471672fd391
-MonoImporter:
-  externalObjects: {}
-  serializedVersion: 2
-  defaultReferences: []
-  executionOrder: 0
-  icon: {instanceID: 0}
-  userData: 
-  assetBundleName: 
-  assetBundleVariant: 
diff --git a/Runtime/Plugins/Raycast/Sample/Raycast Simple Testbed.unity b/Runtime/Plugins/Raycast/Sample/Raycast Simple Testbed.unity
deleted file mode 100644
index 1c2f43eb..00000000
--- a/Runtime/Plugins/Raycast/Sample/Raycast Simple Testbed.unity	
+++ /dev/null
@@ -1,879 +0,0 @@
-%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: 11
-  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: 0
-    m_PVRSampling: 1
-    m_PVRDirectSampleCount: 32
-    m_PVRSampleCount: 500
-    m_PVRBounces: 2
-    m_PVREnvironmentSampleCount: 500
-    m_PVREnvironmentReferencePointCount: 2048
-    m_PVRFilteringMode: 2
-    m_PVRDenoiserTypeDirect: 0
-    m_PVRDenoiserTypeIndirect: 0
-    m_PVRDenoiserTypeAO: 0
-    m_PVRFilterTypeDirect: 0
-    m_PVRFilterTypeIndirect: 0
-    m_PVRFilterTypeAO: 0
-    m_PVREnvironmentMIS: 0
-    m_PVRCulling: 1
-    m_PVRFilteringGaussRadiusDirect: 1
-    m_PVRFilteringGaussRadiusIndirect: 5
-    m_PVRFilteringGaussRadiusAO: 2
-    m_PVRFilteringAtrousPositionSigmaDirect: 0.5
-    m_PVRFilteringAtrousPositionSigmaIndirect: 2
-    m_PVRFilteringAtrousPositionSigmaAO: 1
-    m_ShowResolutionOverlay: 1
-    m_ExportTrainingData: 0
-  m_LightingDataAsset: {fileID: 0}
-  m_UseShadowmask: 1
---- !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
-    debug:
-      m_Flags: 0
-  m_NavMeshData: {fileID: 0}
---- !u!1 &238084976
-GameObject:
-  m_ObjectHideFlags: 0
-  m_CorrespondingSourceObject: {fileID: 0}
-  m_PrefabInstance: {fileID: 0}
-  m_PrefabAsset: {fileID: 0}
-  serializedVersion: 6
-  m_Component:
-  - component: {fileID: 238084977}
-  - component: {fileID: 238084980}
-  - component: {fileID: 238084978}
-  m_Layer: 5
-  m_Name: Panel Button With Filter
-  m_TagString: Untagged
-  m_Icon: {fileID: 0}
-  m_NavMeshLayer: 0
-  m_StaticEditorFlags: 0
-  m_IsActive: 1
---- !u!224 &238084977
-RectTransform:
-  m_ObjectHideFlags: 0
-  m_CorrespondingSourceObject: {fileID: 0}
-  m_PrefabInstance: {fileID: 0}
-  m_PrefabAsset: {fileID: 0}
-  m_GameObject: {fileID: 238084976}
-  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: 354633980}
-  m_RootOrder: 2
-  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.0000076294}
-  m_SizeDelta: {x: 300, y: 150}
-  m_Pivot: {x: 0.5, y: 0.5}
---- !u!114 &238084978
-MonoBehaviour:
-  m_ObjectHideFlags: 0
-  m_CorrespondingSourceObject: {fileID: 0}
-  m_PrefabInstance: {fileID: 0}
-  m_PrefabAsset: {fileID: 0}
-  m_GameObject: {fileID: 238084976}
-  m_Enabled: 1
-  m_EditorHideFlags: 0
-  m_Script: {fileID: 11500000, guid: 4fc8b0d34b82c4c63a41e0cde280075a, type: 3}
-  m_Name: 
-  m_EditorClassIdentifier: 
-  m_Material: {fileID: 0}
-  m_Color: {r: 1, g: 1, b: 1, a: 1}
-  m_RaycastTarget: 1
-  m_OnCullStateChanged:
-    m_PersistentCalls:
-      m_Calls: []
-    m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI,
-      Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
-  m_Texture: {fileID: 0}
-  m_UVRect:
-    serializedVersion: 2
-    x: 0
-    y: 0
-    width: 1
-    height: 1
-  devicePixelRatioOverride: 0
-  hardwareAntiAliasing: 0
---- !u!222 &238084980
-CanvasRenderer:
-  m_ObjectHideFlags: 0
-  m_CorrespondingSourceObject: {fileID: 0}
-  m_PrefabInstance: {fileID: 0}
-  m_PrefabAsset: {fileID: 0}
-  m_GameObject: {fileID: 238084976}
-  m_CullTransparentMesh: 0
---- !u!1 &354633976
-GameObject:
-  m_ObjectHideFlags: 0
-  m_CorrespondingSourceObject: {fileID: 0}
-  m_PrefabInstance: {fileID: 0}
-  m_PrefabAsset: {fileID: 0}
-  serializedVersion: 6
-  m_Component:
-  - component: {fileID: 354633980}
-  - component: {fileID: 354633979}
-  - component: {fileID: 354633978}
-  - component: {fileID: 354633977}
-  - component: {fileID: 354633981}
-  m_Layer: 5
-  m_Name: Canvas
-  m_TagString: Untagged
-  m_Icon: {fileID: 0}
-  m_NavMeshLayer: 0
-  m_StaticEditorFlags: 0
-  m_IsActive: 1
---- !u!114 &354633977
-MonoBehaviour:
-  m_ObjectHideFlags: 0
-  m_CorrespondingSourceObject: {fileID: 0}
-  m_PrefabInstance: {fileID: 0}
-  m_PrefabAsset: {fileID: 0}
-  m_GameObject: {fileID: 354633976}
-  m_Enabled: 1
-  m_EditorHideFlags: 0
-  m_Script: {fileID: 1301386320, guid: f70555f144d8491a825f0804e09c671c, type: 3}
-  m_Name: 
-  m_EditorClassIdentifier: 
-  m_IgnoreReversedGraphics: 1
-  m_BlockingObjects: 0
-  m_BlockingMask:
-    serializedVersion: 2
-    m_Bits: 4294967295
---- !u!114 &354633978
-MonoBehaviour:
-  m_ObjectHideFlags: 0
-  m_CorrespondingSourceObject: {fileID: 0}
-  m_PrefabInstance: {fileID: 0}
-  m_PrefabAsset: {fileID: 0}
-  m_GameObject: {fileID: 354633976}
-  m_Enabled: 1
-  m_EditorHideFlags: 0
-  m_Script: {fileID: 1980459831, guid: f70555f144d8491a825f0804e09c671c, type: 3}
-  m_Name: 
-  m_EditorClassIdentifier: 
-  m_UiScaleMode: 0
-  m_ReferencePixelsPerUnit: 100
-  m_ScaleFactor: 1
-  m_ReferenceResolution: {x: 800, y: 600}
-  m_ScreenMatchMode: 0
-  m_MatchWidthOrHeight: 0
-  m_PhysicalUnit: 3
-  m_FallbackScreenDPI: 96
-  m_DefaultSpriteDPI: 96
-  m_DynamicPixelsPerUnit: 1
---- !u!223 &354633979
-Canvas:
-  m_ObjectHideFlags: 0
-  m_CorrespondingSourceObject: {fileID: 0}
-  m_PrefabInstance: {fileID: 0}
-  m_PrefabAsset: {fileID: 0}
-  m_GameObject: {fileID: 354633976}
-  m_Enabled: 1
-  serializedVersion: 3
-  m_RenderMode: 1
-  m_Camera: {fileID: 519420031}
-  m_PlaneDistance: 1
-  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 &354633980
-RectTransform:
-  m_ObjectHideFlags: 0
-  m_CorrespondingSourceObject: {fileID: 0}
-  m_PrefabInstance: {fileID: 0}
-  m_PrefabAsset: {fileID: 0}
-  m_GameObject: {fileID: 354633976}
-  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: 789225035}
-  - {fileID: 1371170890}
-  - {fileID: 238084977}
-  - {fileID: 409216488}
-  - {fileID: 2108199658}
-  m_Father: {fileID: 0}
-  m_RootOrder: 2
-  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!222 &354633981
-CanvasRenderer:
-  m_ObjectHideFlags: 0
-  m_CorrespondingSourceObject: {fileID: 0}
-  m_PrefabInstance: {fileID: 0}
-  m_PrefabAsset: {fileID: 0}
-  m_GameObject: {fileID: 354633976}
-  m_CullTransparentMesh: 0
---- !u!1 &409216487
-GameObject:
-  m_ObjectHideFlags: 0
-  m_CorrespondingSourceObject: {fileID: 0}
-  m_PrefabInstance: {fileID: 0}
-  m_PrefabAsset: {fileID: 0}
-  serializedVersion: 6
-  m_Component:
-  - component: {fileID: 409216488}
-  - component: {fileID: 409216491}
-  - component: {fileID: 409216490}
-  m_Layer: 5
-  m_Name: Panel Button With Filter (1)
-  m_TagString: Untagged
-  m_Icon: {fileID: 0}
-  m_NavMeshLayer: 0
-  m_StaticEditorFlags: 0
-  m_IsActive: 1
---- !u!224 &409216488
-RectTransform:
-  m_ObjectHideFlags: 0
-  m_CorrespondingSourceObject: {fileID: 0}
-  m_PrefabInstance: {fileID: 0}
-  m_PrefabAsset: {fileID: 0}
-  m_GameObject: {fileID: 409216487}
-  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: 354633980}
-  m_RootOrder: 3
-  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: -200}
-  m_SizeDelta: {x: 300, y: 150}
-  m_Pivot: {x: 0.5, y: 0.5}
---- !u!114 &409216490
-MonoBehaviour:
-  m_ObjectHideFlags: 0
-  m_CorrespondingSourceObject: {fileID: 0}
-  m_PrefabInstance: {fileID: 0}
-  m_PrefabAsset: {fileID: 0}
-  m_GameObject: {fileID: 409216487}
-  m_Enabled: 1
-  m_EditorHideFlags: 0
-  m_Script: {fileID: 11500000, guid: 4fc8b0d34b82c4c63a41e0cde280075a, type: 3}
-  m_Name: 
-  m_EditorClassIdentifier: 
-  m_Material: {fileID: 0}
-  m_Color: {r: 1, g: 1, b: 1, a: 1}
-  m_RaycastTarget: 1
-  m_OnCullStateChanged:
-    m_PersistentCalls:
-      m_Calls: []
-    m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI,
-      Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
-  m_Texture: {fileID: 0}
-  m_UVRect:
-    serializedVersion: 2
-    x: 0
-    y: 0
-    width: 1
-    height: 1
-  devicePixelRatioOverride: 0
-  hardwareAntiAliasing: 0
---- !u!222 &409216491
-CanvasRenderer:
-  m_ObjectHideFlags: 0
-  m_CorrespondingSourceObject: {fileID: 0}
-  m_PrefabInstance: {fileID: 0}
-  m_PrefabAsset: {fileID: 0}
-  m_GameObject: {fileID: 409216487}
-  m_CullTransparentMesh: 0
---- !u!1 &519420028
-GameObject:
-  m_ObjectHideFlags: 0
-  m_CorrespondingSourceObject: {fileID: 0}
-  m_PrefabInstance: {fileID: 0}
-  m_PrefabAsset: {fileID: 0}
-  serializedVersion: 6
-  m_Component:
-  - component: {fileID: 519420032}
-  - component: {fileID: 519420031}
-  - component: {fileID: 519420029}
-  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 &519420029
-AudioListener:
-  m_ObjectHideFlags: 0
-  m_CorrespondingSourceObject: {fileID: 0}
-  m_PrefabInstance: {fileID: 0}
-  m_PrefabAsset: {fileID: 0}
-  m_GameObject: {fileID: 519420028}
-  m_Enabled: 1
---- !u!20 &519420031
-Camera:
-  m_ObjectHideFlags: 0
-  m_CorrespondingSourceObject: {fileID: 0}
-  m_PrefabInstance: {fileID: 0}
-  m_PrefabAsset: {fileID: 0}
-  m_GameObject: {fileID: 519420028}
-  m_Enabled: 1
-  serializedVersion: 2
-  m_ClearFlags: 2
-  m_BackGroundColor: {r: 0, g: 0, b: 0, 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: 0
-  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: 0
-  m_HDR: 1
-  m_AllowMSAA: 0
-  m_AllowDynamicResolution: 0
-  m_ForceIntoRT: 0
-  m_OcclusionCulling: 0
-  m_StereoConvergence: 10
-  m_StereoSeparation: 0.022
---- !u!4 &519420032
-Transform:
-  m_ObjectHideFlags: 0
-  m_CorrespondingSourceObject: {fileID: 0}
-  m_PrefabInstance: {fileID: 0}
-  m_PrefabAsset: {fileID: 0}
-  m_GameObject: {fileID: 519420028}
-  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: 1
-  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
---- !u!1 &789225034
-GameObject:
-  m_ObjectHideFlags: 0
-  m_CorrespondingSourceObject: {fileID: 0}
-  m_PrefabInstance: {fileID: 0}
-  m_PrefabAsset: {fileID: 0}
-  serializedVersion: 6
-  m_Component:
-  - component: {fileID: 789225035}
-  - component: {fileID: 789225038}
-  - component: {fileID: 789225037}
-  - component: {fileID: 789225036}
-  m_Layer: 5
-  m_Name: Button
-  m_TagString: Untagged
-  m_Icon: {fileID: 0}
-  m_NavMeshLayer: 0
-  m_StaticEditorFlags: 0
-  m_IsActive: 1
---- !u!224 &789225035
-RectTransform:
-  m_ObjectHideFlags: 0
-  m_CorrespondingSourceObject: {fileID: 0}
-  m_PrefabInstance: {fileID: 0}
-  m_PrefabAsset: {fileID: 0}
-  m_GameObject: {fileID: 789225034}
-  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:
-  - {fileID: 1097866538}
-  m_Father: {fileID: 354633980}
-  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.000030518, y: -0.000011444}
-  m_SizeDelta: {x: 400, y: 600}
-  m_Pivot: {x: 0.5, y: 0.5}
---- !u!114 &789225036
-MonoBehaviour:
-  m_ObjectHideFlags: 0
-  m_CorrespondingSourceObject: {fileID: 0}
-  m_PrefabInstance: {fileID: 0}
-  m_PrefabAsset: {fileID: 0}
-  m_GameObject: {fileID: 789225034}
-  m_Enabled: 1
-  m_EditorHideFlags: 0
-  m_Script: {fileID: 1392445389, guid: f70555f144d8491a825f0804e09c671c, type: 3}
-  m_Name: 
-  m_EditorClassIdentifier: 
-  m_Navigation:
-    m_Mode: 3
-    m_SelectOnUp: {fileID: 0}
-    m_SelectOnDown: {fileID: 0}
-    m_SelectOnLeft: {fileID: 0}
-    m_SelectOnRight: {fileID: 0}
-  m_Transition: 1
-  m_Colors:
-    m_NormalColor: {r: 1, g: 1, b: 1, a: 1}
-    m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
-    m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}
-    m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
-    m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608}
-    m_ColorMultiplier: 1
-    m_FadeDuration: 0.1
-  m_SpriteState:
-    m_HighlightedSprite: {fileID: 0}
-    m_PressedSprite: {fileID: 0}
-    m_SelectedSprite: {fileID: 0}
-    m_DisabledSprite: {fileID: 0}
-  m_AnimationTriggers:
-    m_NormalTrigger: Normal
-    m_HighlightedTrigger: Highlighted
-    m_PressedTrigger: Pressed
-    m_SelectedTrigger: Selected
-    m_DisabledTrigger: Disabled
-  m_Interactable: 1
-  m_TargetGraphic: {fileID: 789225037}
-  m_OnClick:
-    m_PersistentCalls:
-      m_Calls: []
-    m_TypeName: UnityEngine.UI.Button+ButtonClickedEvent, UnityEngine.UI, Version=1.0.0.0,
-      Culture=neutral, PublicKeyToken=null
---- !u!114 &789225037
-MonoBehaviour:
-  m_ObjectHideFlags: 0
-  m_CorrespondingSourceObject: {fileID: 0}
-  m_PrefabInstance: {fileID: 0}
-  m_PrefabAsset: {fileID: 0}
-  m_GameObject: {fileID: 789225034}
-  m_Enabled: 1
-  m_EditorHideFlags: 0
-  m_Script: {fileID: -765806418, guid: f70555f144d8491a825f0804e09c671c, type: 3}
-  m_Name: 
-  m_EditorClassIdentifier: 
-  m_Material: {fileID: 0}
-  m_Color: {r: 1, g: 1, b: 1, a: 1}
-  m_RaycastTarget: 1
-  m_OnCullStateChanged:
-    m_PersistentCalls:
-      m_Calls: []
-    m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI,
-      Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
-  m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0}
-  m_Type: 1
-  m_PreserveAspect: 0
-  m_FillCenter: 1
-  m_FillMethod: 4
-  m_FillAmount: 1
-  m_FillClockwise: 1
-  m_FillOrigin: 0
-  m_UseSpriteMesh: 0
---- !u!222 &789225038
-CanvasRenderer:
-  m_ObjectHideFlags: 0
-  m_CorrespondingSourceObject: {fileID: 0}
-  m_PrefabInstance: {fileID: 0}
-  m_PrefabAsset: {fileID: 0}
-  m_GameObject: {fileID: 789225034}
-  m_CullTransparentMesh: 0
---- !u!1 &1097866537
-GameObject:
-  m_ObjectHideFlags: 0
-  m_CorrespondingSourceObject: {fileID: 0}
-  m_PrefabInstance: {fileID: 0}
-  m_PrefabAsset: {fileID: 0}
-  serializedVersion: 6
-  m_Component:
-  - component: {fileID: 1097866538}
-  - component: {fileID: 1097866540}
-  - component: {fileID: 1097866539}
-  m_Layer: 5
-  m_Name: Text
-  m_TagString: Untagged
-  m_Icon: {fileID: 0}
-  m_NavMeshLayer: 0
-  m_StaticEditorFlags: 0
-  m_IsActive: 1
---- !u!224 &1097866538
-RectTransform:
-  m_ObjectHideFlags: 0
-  m_CorrespondingSourceObject: {fileID: 0}
-  m_PrefabInstance: {fileID: 0}
-  m_PrefabAsset: {fileID: 0}
-  m_GameObject: {fileID: 1097866537}
-  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: 789225035}
-  m_RootOrder: 0
-  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
-  m_AnchorMin: {x: 0, y: 0}
-  m_AnchorMax: {x: 1, y: 1}
-  m_AnchoredPosition: {x: 0, y: 0}
-  m_SizeDelta: {x: 0, y: 0}
-  m_Pivot: {x: 0.5, y: 0.5}
---- !u!114 &1097866539
-MonoBehaviour:
-  m_ObjectHideFlags: 0
-  m_CorrespondingSourceObject: {fileID: 0}
-  m_PrefabInstance: {fileID: 0}
-  m_PrefabAsset: {fileID: 0}
-  m_GameObject: {fileID: 1097866537}
-  m_Enabled: 1
-  m_EditorHideFlags: 0
-  m_Script: {fileID: 708705254, guid: f70555f144d8491a825f0804e09c671c, 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_OnCullStateChanged:
-    m_PersistentCalls:
-      m_Calls: []
-    m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI,
-      Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
-  m_FontData:
-    m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0}
-    m_FontSize: 55
-    m_FontStyle: 0
-    m_BestFit: 0
-    m_MinSize: 0
-    m_MaxSize: 68
-    m_Alignment: 4
-    m_AlignByGeometry: 0
-    m_RichText: 1
-    m_HorizontalOverflow: 0
-    m_VerticalOverflow: 0
-    m_LineSpacing: 1
-  m_Text: Button
---- !u!222 &1097866540
-CanvasRenderer:
-  m_ObjectHideFlags: 0
-  m_CorrespondingSourceObject: {fileID: 0}
-  m_PrefabInstance: {fileID: 0}
-  m_PrefabAsset: {fileID: 0}
-  m_GameObject: {fileID: 1097866537}
-  m_CullTransparentMesh: 0
---- !u!1 &1371170889
-GameObject:
-  m_ObjectHideFlags: 0
-  m_CorrespondingSourceObject: {fileID: 0}
-  m_PrefabInstance: {fileID: 0}
-  m_PrefabAsset: {fileID: 0}
-  serializedVersion: 6
-  m_Component:
-  - component: {fileID: 1371170890}
-  - component: {fileID: 1371170891}
-  - component: {fileID: 1371170892}
-  m_Layer: 5
-  m_Name: Panel Button
-  m_TagString: Untagged
-  m_Icon: {fileID: 0}
-  m_NavMeshLayer: 0
-  m_StaticEditorFlags: 0
-  m_IsActive: 1
---- !u!224 &1371170890
-RectTransform:
-  m_ObjectHideFlags: 0
-  m_CorrespondingSourceObject: {fileID: 0}
-  m_PrefabInstance: {fileID: 0}
-  m_PrefabAsset: {fileID: 0}
-  m_GameObject: {fileID: 1371170889}
-  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: 354633980}
-  m_RootOrder: 1
-  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: 200}
-  m_SizeDelta: {x: 300, y: 150}
-  m_Pivot: {x: 0.5, y: 0.5}
---- !u!222 &1371170891
-CanvasRenderer:
-  m_ObjectHideFlags: 0
-  m_CorrespondingSourceObject: {fileID: 0}
-  m_PrefabInstance: {fileID: 0}
-  m_PrefabAsset: {fileID: 0}
-  m_GameObject: {fileID: 1371170889}
-  m_CullTransparentMesh: 0
---- !u!114 &1371170892
-MonoBehaviour:
-  m_ObjectHideFlags: 0
-  m_CorrespondingSourceObject: {fileID: 0}
-  m_PrefabInstance: {fileID: 0}
-  m_PrefabAsset: {fileID: 0}
-  m_GameObject: {fileID: 1371170889}
-  m_Enabled: 1
-  m_EditorHideFlags: 0
-  m_Script: {fileID: 11500000, guid: 15ddf18357c864b1b822b471672fd391, type: 3}
-  m_Name: 
-  m_EditorClassIdentifier: 
-  m_Material: {fileID: 0}
-  m_Color: {r: 1, g: 1, b: 1, a: 1}
-  m_RaycastTarget: 1
-  m_OnCullStateChanged:
-    m_PersistentCalls:
-      m_Calls: []
-    m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI,
-      Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
-  m_Texture: {fileID: 0}
-  m_UVRect:
-    serializedVersion: 2
-    x: 0
-    y: 0
-    width: 1
-    height: 1
-  devicePixelRatioOverride: 0
-  hardwareAntiAliasing: 0
---- !u!1 &1742152755
-GameObject:
-  m_ObjectHideFlags: 0
-  m_CorrespondingSourceObject: {fileID: 0}
-  m_PrefabInstance: {fileID: 0}
-  m_PrefabAsset: {fileID: 0}
-  serializedVersion: 6
-  m_Component:
-  - component: {fileID: 1742152758}
-  - component: {fileID: 1742152757}
-  - component: {fileID: 1742152756}
-  m_Layer: 0
-  m_Name: EventSystem
-  m_TagString: Untagged
-  m_Icon: {fileID: 0}
-  m_NavMeshLayer: 0
-  m_StaticEditorFlags: 0
-  m_IsActive: 1
---- !u!114 &1742152756
-MonoBehaviour:
-  m_ObjectHideFlags: 0
-  m_CorrespondingSourceObject: {fileID: 0}
-  m_PrefabInstance: {fileID: 0}
-  m_PrefabAsset: {fileID: 0}
-  m_GameObject: {fileID: 1742152755}
-  m_Enabled: 1
-  m_EditorHideFlags: 0
-  m_Script: {fileID: 1077351063, guid: f70555f144d8491a825f0804e09c671c, 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 &1742152757
-MonoBehaviour:
-  m_ObjectHideFlags: 0
-  m_CorrespondingSourceObject: {fileID: 0}
-  m_PrefabInstance: {fileID: 0}
-  m_PrefabAsset: {fileID: 0}
-  m_GameObject: {fileID: 1742152755}
-  m_Enabled: 1
-  m_EditorHideFlags: 0
-  m_Script: {fileID: -619905303, guid: f70555f144d8491a825f0804e09c671c, type: 3}
-  m_Name: 
-  m_EditorClassIdentifier: 
-  m_FirstSelected: {fileID: 1742152755}
-  m_sendNavigationEvents: 1
-  m_DragThreshold: 10
---- !u!4 &1742152758
-Transform:
-  m_ObjectHideFlags: 0
-  m_CorrespondingSourceObject: {fileID: 0}
-  m_PrefabInstance: {fileID: 0}
-  m_PrefabAsset: {fileID: 0}
-  m_GameObject: {fileID: 1742152755}
-  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: 0
-  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
---- !u!1 &2108199657
-GameObject:
-  m_ObjectHideFlags: 0
-  m_CorrespondingSourceObject: {fileID: 0}
-  m_PrefabInstance: {fileID: 0}
-  m_PrefabAsset: {fileID: 0}
-  serializedVersion: 6
-  m_Component:
-  - component: {fileID: 2108199658}
-  - component: {fileID: 2108199661}
-  - component: {fileID: 2108199660}
-  m_Layer: 5
-  m_Name: Panel Button With Filter (2)
-  m_TagString: Untagged
-  m_Icon: {fileID: 0}
-  m_NavMeshLayer: 0
-  m_StaticEditorFlags: 0
-  m_IsActive: 1
---- !u!224 &2108199658
-RectTransform:
-  m_ObjectHideFlags: 0
-  m_CorrespondingSourceObject: {fileID: 0}
-  m_PrefabInstance: {fileID: 0}
-  m_PrefabAsset: {fileID: 0}
-  m_GameObject: {fileID: 2108199657}
-  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: 354633980}
-  m_RootOrder: 4
-  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: 50, y: -240}
-  m_SizeDelta: {x: 300, y: 150}
-  m_Pivot: {x: 0.5, y: 0.5}
---- !u!114 &2108199660
-MonoBehaviour:
-  m_ObjectHideFlags: 0
-  m_CorrespondingSourceObject: {fileID: 0}
-  m_PrefabInstance: {fileID: 0}
-  m_PrefabAsset: {fileID: 0}
-  m_GameObject: {fileID: 2108199657}
-  m_Enabled: 1
-  m_EditorHideFlags: 0
-  m_Script: {fileID: 11500000, guid: 4fc8b0d34b82c4c63a41e0cde280075a, type: 3}
-  m_Name: 
-  m_EditorClassIdentifier: 
-  m_Material: {fileID: 0}
-  m_Color: {r: 1, g: 1, b: 1, a: 1}
-  m_RaycastTarget: 1
-  m_OnCullStateChanged:
-    m_PersistentCalls:
-      m_Calls: []
-    m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI,
-      Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
-  m_Texture: {fileID: 0}
-  m_UVRect:
-    serializedVersion: 2
-    x: 0
-    y: 0
-    width: 1
-    height: 1
-  devicePixelRatioOverride: 0
-  hardwareAntiAliasing: 0
---- !u!222 &2108199661
-CanvasRenderer:
-  m_ObjectHideFlags: 0
-  m_CorrespondingSourceObject: {fileID: 0}
-  m_PrefabInstance: {fileID: 0}
-  m_PrefabAsset: {fileID: 0}
-  m_GameObject: {fileID: 2108199657}
-  m_CullTransparentMesh: 0
diff --git a/Runtime/Plugins/Raycast/Sample/Raycast Simple Testbed.unity.meta b/Runtime/Plugins/Raycast/Sample/Raycast Simple Testbed.unity.meta
deleted file mode 100644
index b54871ec..00000000
--- a/Runtime/Plugins/Raycast/Sample/Raycast Simple Testbed.unity.meta	
+++ /dev/null
@@ -1,7 +0,0 @@
-fileFormatVersion: 2
-guid: 83e4542c541b84d80ad625e366e30839
-DefaultImporter:
-  externalObjects: {}
-  userData: 
-  assetBundleName: 
-  assetBundleVariant: 
diff --git a/Runtime/Plugins/Raycast/Sample/Raycast Testbed.unity b/Runtime/Plugins/Raycast/Sample/Raycast Testbed.unity
deleted file mode 100644
index 48aab60e..00000000
--- a/Runtime/Plugins/Raycast/Sample/Raycast Testbed.unity	
+++ /dev/null
@@ -1,757 +0,0 @@
-%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: 11
-  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: 0
-    m_PVRSampling: 1
-    m_PVRDirectSampleCount: 32
-    m_PVRSampleCount: 500
-    m_PVRBounces: 2
-    m_PVREnvironmentSampleCount: 500
-    m_PVREnvironmentReferencePointCount: 2048
-    m_PVRFilteringMode: 2
-    m_PVRDenoiserTypeDirect: 0
-    m_PVRDenoiserTypeIndirect: 0
-    m_PVRDenoiserTypeAO: 0
-    m_PVRFilterTypeDirect: 0
-    m_PVRFilterTypeIndirect: 0
-    m_PVRFilterTypeAO: 0
-    m_PVREnvironmentMIS: 0
-    m_PVRCulling: 1
-    m_PVRFilteringGaussRadiusDirect: 1
-    m_PVRFilteringGaussRadiusIndirect: 5
-    m_PVRFilteringGaussRadiusAO: 2
-    m_PVRFilteringAtrousPositionSigmaDirect: 0.5
-    m_PVRFilteringAtrousPositionSigmaIndirect: 2
-    m_PVRFilteringAtrousPositionSigmaAO: 1
-    m_ShowResolutionOverlay: 1
-    m_ExportTrainingData: 0
-  m_LightingDataAsset: {fileID: 0}
-  m_UseShadowmask: 1
---- !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
-    debug:
-      m_Flags: 0
-  m_NavMeshData: {fileID: 0}
---- !u!1 &354633976
-GameObject:
-  m_ObjectHideFlags: 0
-  m_CorrespondingSourceObject: {fileID: 0}
-  m_PrefabInstance: {fileID: 0}
-  m_PrefabAsset: {fileID: 0}
-  serializedVersion: 6
-  m_Component:
-  - component: {fileID: 354633980}
-  - component: {fileID: 354633979}
-  - component: {fileID: 354633978}
-  - component: {fileID: 354633977}
-  - component: {fileID: 354633981}
-  m_Layer: 5
-  m_Name: Canvas
-  m_TagString: Untagged
-  m_Icon: {fileID: 0}
-  m_NavMeshLayer: 0
-  m_StaticEditorFlags: 0
-  m_IsActive: 1
---- !u!114 &354633977
-MonoBehaviour:
-  m_ObjectHideFlags: 0
-  m_CorrespondingSourceObject: {fileID: 0}
-  m_PrefabInstance: {fileID: 0}
-  m_PrefabAsset: {fileID: 0}
-  m_GameObject: {fileID: 354633976}
-  m_Enabled: 1
-  m_EditorHideFlags: 0
-  m_Script: {fileID: 1301386320, guid: f70555f144d8491a825f0804e09c671c, type: 3}
-  m_Name: 
-  m_EditorClassIdentifier: 
-  m_IgnoreReversedGraphics: 1
-  m_BlockingObjects: 0
-  m_BlockingMask:
-    serializedVersion: 2
-    m_Bits: 4294967295
---- !u!114 &354633978
-MonoBehaviour:
-  m_ObjectHideFlags: 0
-  m_CorrespondingSourceObject: {fileID: 0}
-  m_PrefabInstance: {fileID: 0}
-  m_PrefabAsset: {fileID: 0}
-  m_GameObject: {fileID: 354633976}
-  m_Enabled: 1
-  m_EditorHideFlags: 0
-  m_Script: {fileID: 1980459831, guid: f70555f144d8491a825f0804e09c671c, type: 3}
-  m_Name: 
-  m_EditorClassIdentifier: 
-  m_UiScaleMode: 0
-  m_ReferencePixelsPerUnit: 100
-  m_ScaleFactor: 1
-  m_ReferenceResolution: {x: 800, y: 600}
-  m_ScreenMatchMode: 0
-  m_MatchWidthOrHeight: 0
-  m_PhysicalUnit: 3
-  m_FallbackScreenDPI: 96
-  m_DefaultSpriteDPI: 96
-  m_DynamicPixelsPerUnit: 1
---- !u!223 &354633979
-Canvas:
-  m_ObjectHideFlags: 0
-  m_CorrespondingSourceObject: {fileID: 0}
-  m_PrefabInstance: {fileID: 0}
-  m_PrefabAsset: {fileID: 0}
-  m_GameObject: {fileID: 354633976}
-  m_Enabled: 1
-  serializedVersion: 3
-  m_RenderMode: 1
-  m_Camera: {fileID: 519420031}
-  m_PlaneDistance: 1
-  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 &354633980
-RectTransform:
-  m_ObjectHideFlags: 0
-  m_CorrespondingSourceObject: {fileID: 0}
-  m_PrefabInstance: {fileID: 0}
-  m_PrefabAsset: {fileID: 0}
-  m_GameObject: {fileID: 354633976}
-  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: 789225035}
-  - {fileID: 657653790}
-  - {fileID: 1942439624}
-  m_Father: {fileID: 0}
-  m_RootOrder: 2
-  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!222 &354633981
-CanvasRenderer:
-  m_ObjectHideFlags: 0
-  m_CorrespondingSourceObject: {fileID: 0}
-  m_PrefabInstance: {fileID: 0}
-  m_PrefabAsset: {fileID: 0}
-  m_GameObject: {fileID: 354633976}
-  m_CullTransparentMesh: 0
---- !u!1 &519420028
-GameObject:
-  m_ObjectHideFlags: 0
-  m_CorrespondingSourceObject: {fileID: 0}
-  m_PrefabInstance: {fileID: 0}
-  m_PrefabAsset: {fileID: 0}
-  serializedVersion: 6
-  m_Component:
-  - component: {fileID: 519420032}
-  - component: {fileID: 519420031}
-  - component: {fileID: 519420029}
-  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 &519420029
-AudioListener:
-  m_ObjectHideFlags: 0
-  m_CorrespondingSourceObject: {fileID: 0}
-  m_PrefabInstance: {fileID: 0}
-  m_PrefabAsset: {fileID: 0}
-  m_GameObject: {fileID: 519420028}
-  m_Enabled: 1
---- !u!20 &519420031
-Camera:
-  m_ObjectHideFlags: 0
-  m_CorrespondingSourceObject: {fileID: 0}
-  m_PrefabInstance: {fileID: 0}
-  m_PrefabAsset: {fileID: 0}
-  m_GameObject: {fileID: 519420028}
-  m_Enabled: 1
-  serializedVersion: 2
-  m_ClearFlags: 2
-  m_BackGroundColor: {r: 0, g: 0, b: 0, 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: 0
-  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: 0
-  m_HDR: 1
-  m_AllowMSAA: 0
-  m_AllowDynamicResolution: 0
-  m_ForceIntoRT: 0
-  m_OcclusionCulling: 0
-  m_StereoConvergence: 10
-  m_StereoSeparation: 0.022
---- !u!4 &519420032
-Transform:
-  m_ObjectHideFlags: 0
-  m_CorrespondingSourceObject: {fileID: 0}
-  m_PrefabInstance: {fileID: 0}
-  m_PrefabAsset: {fileID: 0}
-  m_GameObject: {fileID: 519420028}
-  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: 1
-  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
---- !u!1 &657653789
-GameObject:
-  m_ObjectHideFlags: 0
-  m_CorrespondingSourceObject: {fileID: 0}
-  m_PrefabInstance: {fileID: 0}
-  m_PrefabAsset: {fileID: 0}
-  serializedVersion: 6
-  m_Component:
-  - component: {fileID: 657653790}
-  - component: {fileID: 657653792}
-  - component: {fileID: 657653791}
-  - component: {fileID: 657653793}
-  m_Layer: 5
-  m_Name: Raycast Testbed Panel
-  m_TagString: Untagged
-  m_Icon: {fileID: 0}
-  m_NavMeshLayer: 0
-  m_StaticEditorFlags: 0
-  m_IsActive: 1
---- !u!224 &657653790
-RectTransform:
-  m_ObjectHideFlags: 0
-  m_CorrespondingSourceObject: {fileID: 0}
-  m_PrefabInstance: {fileID: 0}
-  m_PrefabAsset: {fileID: 0}
-  m_GameObject: {fileID: 657653789}
-  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: 354633980}
-  m_RootOrder: 1
-  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: -203, y: 81.79999}
-  m_SizeDelta: {x: 1290.3, y: 471.4}
-  m_Pivot: {x: 0.5, y: 0.5}
---- !u!114 &657653791
-MonoBehaviour:
-  m_ObjectHideFlags: 0
-  m_CorrespondingSourceObject: {fileID: 0}
-  m_PrefabInstance: {fileID: 0}
-  m_PrefabAsset: {fileID: 0}
-  m_GameObject: {fileID: 657653789}
-  m_Enabled: 1
-  m_EditorHideFlags: 0
-  m_Script: {fileID: 11500000, guid: 1b02d547623984986a44973c4ba2bca0, type: 3}
-  m_Name: 
-  m_EditorClassIdentifier: 
-  m_Material: {fileID: 0}
-  m_Color: {r: 1, g: 1, b: 1, a: 1}
-  m_RaycastTarget: 1
-  m_OnCullStateChanged:
-    m_PersistentCalls:
-      m_Calls: []
-    m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI,
-      Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
-  m_Texture: {fileID: 0}
-  m_UVRect:
-    serializedVersion: 2
-    x: 0
-    y: 0
-    width: 1
-    height: 1
-  devicePixelRatioOverride: 0
-  hardwareAntiAliasing: 0
---- !u!222 &657653792
-CanvasRenderer:
-  m_ObjectHideFlags: 0
-  m_CorrespondingSourceObject: {fileID: 0}
-  m_PrefabInstance: {fileID: 0}
-  m_PrefabAsset: {fileID: 0}
-  m_GameObject: {fileID: 657653789}
-  m_CullTransparentMesh: 0
---- !u!114 &657653793
-MonoBehaviour:
-  m_ObjectHideFlags: 0
-  m_CorrespondingSourceObject: {fileID: 0}
-  m_PrefabInstance: {fileID: 0}
-  m_PrefabAsset: {fileID: 0}
-  m_GameObject: {fileID: 657653789}
-  m_Enabled: 1
-  m_EditorHideFlags: 0
-  m_Script: {fileID: 11500000, guid: 2455841904ff14258bae1b28c1363dc0, type: 3}
-  m_Name: 
-  m_EditorClassIdentifier: 
-  reversed: 0
---- !u!1 &789225034
-GameObject:
-  m_ObjectHideFlags: 0
-  m_CorrespondingSourceObject: {fileID: 0}
-  m_PrefabInstance: {fileID: 0}
-  m_PrefabAsset: {fileID: 0}
-  serializedVersion: 6
-  m_Component:
-  - component: {fileID: 789225035}
-  - component: {fileID: 789225038}
-  - component: {fileID: 789225037}
-  - component: {fileID: 789225036}
-  m_Layer: 5
-  m_Name: Button
-  m_TagString: Untagged
-  m_Icon: {fileID: 0}
-  m_NavMeshLayer: 0
-  m_StaticEditorFlags: 0
-  m_IsActive: 1
---- !u!224 &789225035
-RectTransform:
-  m_ObjectHideFlags: 0
-  m_CorrespondingSourceObject: {fileID: 0}
-  m_PrefabInstance: {fileID: 0}
-  m_PrefabAsset: {fileID: 0}
-  m_GameObject: {fileID: 789225034}
-  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
-  m_LocalPosition: {x: 0, y: 0, z: 0}
-  m_LocalScale: {x: 3, y: 3, z: 1}
-  m_Children:
-  - {fileID: 812945430}
-  m_Father: {fileID: 354633980}
-  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.000030518, y: -0.000011444}
-  m_SizeDelta: {x: 436.8, y: 81.8}
-  m_Pivot: {x: 0.5, y: 0.5}
---- !u!114 &789225036
-MonoBehaviour:
-  m_ObjectHideFlags: 0
-  m_CorrespondingSourceObject: {fileID: 0}
-  m_PrefabInstance: {fileID: 0}
-  m_PrefabAsset: {fileID: 0}
-  m_GameObject: {fileID: 789225034}
-  m_Enabled: 1
-  m_EditorHideFlags: 0
-  m_Script: {fileID: 1392445389, guid: f70555f144d8491a825f0804e09c671c, type: 3}
-  m_Name: 
-  m_EditorClassIdentifier: 
-  m_Navigation:
-    m_Mode: 3
-    m_SelectOnUp: {fileID: 0}
-    m_SelectOnDown: {fileID: 0}
-    m_SelectOnLeft: {fileID: 0}
-    m_SelectOnRight: {fileID: 0}
-  m_Transition: 1
-  m_Colors:
-    m_NormalColor: {r: 1, g: 1, b: 1, a: 1}
-    m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
-    m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}
-    m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
-    m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608}
-    m_ColorMultiplier: 1
-    m_FadeDuration: 0.1
-  m_SpriteState:
-    m_HighlightedSprite: {fileID: 0}
-    m_PressedSprite: {fileID: 0}
-    m_SelectedSprite: {fileID: 0}
-    m_DisabledSprite: {fileID: 0}
-  m_AnimationTriggers:
-    m_NormalTrigger: Normal
-    m_HighlightedTrigger: Highlighted
-    m_PressedTrigger: Pressed
-    m_SelectedTrigger: Selected
-    m_DisabledTrigger: Disabled
-  m_Interactable: 1
-  m_TargetGraphic: {fileID: 789225037}
-  m_OnClick:
-    m_PersistentCalls:
-      m_Calls: []
-    m_TypeName: UnityEngine.UI.Button+ButtonClickedEvent, UnityEngine.UI, Version=1.0.0.0,
-      Culture=neutral, PublicKeyToken=null
---- !u!114 &789225037
-MonoBehaviour:
-  m_ObjectHideFlags: 0
-  m_CorrespondingSourceObject: {fileID: 0}
-  m_PrefabInstance: {fileID: 0}
-  m_PrefabAsset: {fileID: 0}
-  m_GameObject: {fileID: 789225034}
-  m_Enabled: 1
-  m_EditorHideFlags: 0
-  m_Script: {fileID: -765806418, guid: f70555f144d8491a825f0804e09c671c, type: 3}
-  m_Name: 
-  m_EditorClassIdentifier: 
-  m_Material: {fileID: 0}
-  m_Color: {r: 1, g: 1, b: 1, a: 1}
-  m_RaycastTarget: 1
-  m_OnCullStateChanged:
-    m_PersistentCalls:
-      m_Calls: []
-    m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI,
-      Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
-  m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0}
-  m_Type: 1
-  m_PreserveAspect: 0
-  m_FillCenter: 1
-  m_FillMethod: 4
-  m_FillAmount: 1
-  m_FillClockwise: 1
-  m_FillOrigin: 0
-  m_UseSpriteMesh: 0
---- !u!222 &789225038
-CanvasRenderer:
-  m_ObjectHideFlags: 0
-  m_CorrespondingSourceObject: {fileID: 0}
-  m_PrefabInstance: {fileID: 0}
-  m_PrefabAsset: {fileID: 0}
-  m_GameObject: {fileID: 789225034}
-  m_CullTransparentMesh: 0
---- !u!1 &812945429
-GameObject:
-  m_ObjectHideFlags: 0
-  m_CorrespondingSourceObject: {fileID: 0}
-  m_PrefabInstance: {fileID: 0}
-  m_PrefabAsset: {fileID: 0}
-  serializedVersion: 6
-  m_Component:
-  - component: {fileID: 812945430}
-  - component: {fileID: 812945432}
-  - component: {fileID: 812945431}
-  m_Layer: 5
-  m_Name: Text
-  m_TagString: Untagged
-  m_Icon: {fileID: 0}
-  m_NavMeshLayer: 0
-  m_StaticEditorFlags: 0
-  m_IsActive: 1
---- !u!224 &812945430
-RectTransform:
-  m_ObjectHideFlags: 0
-  m_CorrespondingSourceObject: {fileID: 0}
-  m_PrefabInstance: {fileID: 0}
-  m_PrefabAsset: {fileID: 0}
-  m_GameObject: {fileID: 812945429}
-  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: 789225035}
-  m_RootOrder: 0
-  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
-  m_AnchorMin: {x: 0, y: 0}
-  m_AnchorMax: {x: 1, y: 1}
-  m_AnchoredPosition: {x: 0, y: 0}
-  m_SizeDelta: {x: 0, y: 0}
-  m_Pivot: {x: 0.5, y: 0.5}
---- !u!114 &812945431
-MonoBehaviour:
-  m_ObjectHideFlags: 0
-  m_CorrespondingSourceObject: {fileID: 0}
-  m_PrefabInstance: {fileID: 0}
-  m_PrefabAsset: {fileID: 0}
-  m_GameObject: {fileID: 812945429}
-  m_Enabled: 1
-  m_EditorHideFlags: 0
-  m_Script: {fileID: 708705254, guid: f70555f144d8491a825f0804e09c671c, 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_OnCullStateChanged:
-    m_PersistentCalls:
-      m_Calls: []
-    m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI,
-      Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
-  m_FontData:
-    m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0}
-    m_FontSize: 14
-    m_FontStyle: 0
-    m_BestFit: 0
-    m_MinSize: 10
-    m_MaxSize: 40
-    m_Alignment: 4
-    m_AlignByGeometry: 0
-    m_RichText: 1
-    m_HorizontalOverflow: 0
-    m_VerticalOverflow: 0
-    m_LineSpacing: 1
-  m_Text: Button
---- !u!222 &812945432
-CanvasRenderer:
-  m_ObjectHideFlags: 0
-  m_CorrespondingSourceObject: {fileID: 0}
-  m_PrefabInstance: {fileID: 0}
-  m_PrefabAsset: {fileID: 0}
-  m_GameObject: {fileID: 812945429}
-  m_CullTransparentMesh: 0
---- !u!1 &1742152755
-GameObject:
-  m_ObjectHideFlags: 0
-  m_CorrespondingSourceObject: {fileID: 0}
-  m_PrefabInstance: {fileID: 0}
-  m_PrefabAsset: {fileID: 0}
-  serializedVersion: 6
-  m_Component:
-  - component: {fileID: 1742152758}
-  - component: {fileID: 1742152757}
-  - component: {fileID: 1742152756}
-  m_Layer: 0
-  m_Name: EventSystem
-  m_TagString: Untagged
-  m_Icon: {fileID: 0}
-  m_NavMeshLayer: 0
-  m_StaticEditorFlags: 0
-  m_IsActive: 1
---- !u!114 &1742152756
-MonoBehaviour:
-  m_ObjectHideFlags: 0
-  m_CorrespondingSourceObject: {fileID: 0}
-  m_PrefabInstance: {fileID: 0}
-  m_PrefabAsset: {fileID: 0}
-  m_GameObject: {fileID: 1742152755}
-  m_Enabled: 1
-  m_EditorHideFlags: 0
-  m_Script: {fileID: 1077351063, guid: f70555f144d8491a825f0804e09c671c, 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 &1742152757
-MonoBehaviour:
-  m_ObjectHideFlags: 0
-  m_CorrespondingSourceObject: {fileID: 0}
-  m_PrefabInstance: {fileID: 0}
-  m_PrefabAsset: {fileID: 0}
-  m_GameObject: {fileID: 1742152755}
-  m_Enabled: 1
-  m_EditorHideFlags: 0
-  m_Script: {fileID: -619905303, guid: f70555f144d8491a825f0804e09c671c, type: 3}
-  m_Name: 
-  m_EditorClassIdentifier: 
-  m_FirstSelected: {fileID: 1742152755}
-  m_sendNavigationEvents: 1
-  m_DragThreshold: 10
---- !u!4 &1742152758
-Transform:
-  m_ObjectHideFlags: 0
-  m_CorrespondingSourceObject: {fileID: 0}
-  m_PrefabInstance: {fileID: 0}
-  m_PrefabAsset: {fileID: 0}
-  m_GameObject: {fileID: 1742152755}
-  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: 0
-  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
---- !u!1 &1942439623
-GameObject:
-  m_ObjectHideFlags: 0
-  m_CorrespondingSourceObject: {fileID: 0}
-  m_PrefabInstance: {fileID: 0}
-  m_PrefabAsset: {fileID: 0}
-  serializedVersion: 6
-  m_Component:
-  - component: {fileID: 1942439624}
-  - component: {fileID: 1942439627}
-  - component: {fileID: 1942439626}
-  - component: {fileID: 1942439625}
-  m_Layer: 5
-  m_Name: Raycast Testbed Panel (1)
-  m_TagString: Untagged
-  m_Icon: {fileID: 0}
-  m_NavMeshLayer: 0
-  m_StaticEditorFlags: 0
-  m_IsActive: 1
---- !u!224 &1942439624
-RectTransform:
-  m_ObjectHideFlags: 0
-  m_CorrespondingSourceObject: {fileID: 0}
-  m_PrefabInstance: {fileID: 0}
-  m_PrefabAsset: {fileID: 0}
-  m_GameObject: {fileID: 1942439623}
-  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: 354633980}
-  m_RootOrder: 2
-  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: 180.85, y: 42}
-  m_SizeDelta: {x: 1290.3, y: 471.4}
-  m_Pivot: {x: 0.5, y: 0.5}
---- !u!114 &1942439625
-MonoBehaviour:
-  m_ObjectHideFlags: 0
-  m_CorrespondingSourceObject: {fileID: 0}
-  m_PrefabInstance: {fileID: 0}
-  m_PrefabAsset: {fileID: 0}
-  m_GameObject: {fileID: 1942439623}
-  m_Enabled: 1
-  m_EditorHideFlags: 0
-  m_Script: {fileID: 11500000, guid: 2455841904ff14258bae1b28c1363dc0, type: 3}
-  m_Name: 
-  m_EditorClassIdentifier: 
-  reversed: 0
---- !u!114 &1942439626
-MonoBehaviour:
-  m_ObjectHideFlags: 0
-  m_CorrespondingSourceObject: {fileID: 0}
-  m_PrefabInstance: {fileID: 0}
-  m_PrefabAsset: {fileID: 0}
-  m_GameObject: {fileID: 1942439623}
-  m_Enabled: 1
-  m_EditorHideFlags: 0
-  m_Script: {fileID: 11500000, guid: 1b02d547623984986a44973c4ba2bca0, type: 3}
-  m_Name: 
-  m_EditorClassIdentifier: 
-  m_Material: {fileID: 0}
-  m_Color: {r: 1, g: 1, b: 1, a: 1}
-  m_RaycastTarget: 1
-  m_OnCullStateChanged:
-    m_PersistentCalls:
-      m_Calls: []
-    m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI,
-      Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
-  m_Texture: {fileID: 0}
-  m_UVRect:
-    serializedVersion: 2
-    x: 0
-    y: 0
-    width: 1
-    height: 1
-  devicePixelRatioOverride: 0
-  hardwareAntiAliasing: 0
---- !u!222 &1942439627
-CanvasRenderer:
-  m_ObjectHideFlags: 0
-  m_CorrespondingSourceObject: {fileID: 0}
-  m_PrefabInstance: {fileID: 0}
-  m_PrefabAsset: {fileID: 0}
-  m_GameObject: {fileID: 1942439623}
-  m_CullTransparentMesh: 0
diff --git a/Runtime/Plugins/Raycast/Sample/Raycast Testbed.unity.meta b/Runtime/Plugins/Raycast/Sample/Raycast Testbed.unity.meta
deleted file mode 100644
index c04a9724..00000000
--- a/Runtime/Plugins/Raycast/Sample/Raycast Testbed.unity.meta	
+++ /dev/null
@@ -1,7 +0,0 @@
-fileFormatVersion: 2
-guid: e1bac3be89f2644f6ad3a6ed1ff00617
-DefaultImporter:
-  externalObjects: {}
-  userData: 
-  assetBundleName: 
-  assetBundleVariant: 
diff --git a/Runtime/Plugins/Raycast/Sample/RaycastSimpleTestbedPanel.cs b/Runtime/Plugins/Raycast/Sample/RaycastSimpleTestbedPanel.cs
deleted file mode 100644
index 3ad1877b..00000000
--- a/Runtime/Plugins/Raycast/Sample/RaycastSimpleTestbedPanel.cs
+++ /dev/null
@@ -1,48 +0,0 @@
-using Unity.UIWidgets.foundation;
-using Unity.UIWidgets.material;
-using Unity.UIWidgets.plugins.raycast;
-using Unity.UIWidgets.ui;
-using Unity.UIWidgets.widgets;
-using UnityEngine;
-using Color = Unity.UIWidgets.ui.Color;
-using Material = Unity.UIWidgets.material.Material;
-
-namespace Unity.UIWidgets.Sample {
-    public class RaycastSimpleTestbedPanel : UIWidgetsRaycastablePanel {
-        protected override void OnEnable() {
-            FontManager.instance.addFont(Resources.Load<Font>("fonts/MaterialIcons-Regular"), "Material Icons");
-            base.OnEnable();
-        }
-
-        protected override Widget createWidget() {
-            return new MaterialApp(
-                home: new RaycastSimpleTestbedWidget()
-            );
-        }
-    }
-
-    public class RaycastSimpleTestbedWidget : StatefulWidget {
-        public RaycastSimpleTestbedWidget(Key key = null) : base(key) { }
-
-        public override State createState() {
-            return new RaycastSimpleTestbedWidgetState();
-        }
-    }
-
-    public class RaycastSimpleTestbedWidgetState : State<RaycastSimpleTestbedWidget> {
-        public override Widget build(BuildContext context) {
-            return new Material(
-                color: new Color(0x44FFFF00),
-                child: new Center(
-                    child: new RaycastableContainer(
-                        new MaterialButton(
-                            child: new Text("Material Button"),
-                            onPressed: () => { },
-                            color: Colors.lightBlue
-                        )
-                    )
-                )
-            );
-        }
-    }
-}
\ No newline at end of file
diff --git a/Runtime/Plugins/Raycast/Sample/RaycastSimpleTestbedPanel.cs.meta b/Runtime/Plugins/Raycast/Sample/RaycastSimpleTestbedPanel.cs.meta
deleted file mode 100644
index 131091ab..00000000
--- a/Runtime/Plugins/Raycast/Sample/RaycastSimpleTestbedPanel.cs.meta
+++ /dev/null
@@ -1,11 +0,0 @@
-fileFormatVersion: 2
-guid: 4fc8b0d34b82c4c63a41e0cde280075a
-MonoImporter:
-  externalObjects: {}
-  serializedVersion: 2
-  defaultReferences: []
-  executionOrder: 0
-  icon: {instanceID: 0}
-  userData: 
-  assetBundleName: 
-  assetBundleVariant: 
diff --git a/Runtime/Plugins/Raycast/Sample/RaycastTestbedPanel.cs b/Runtime/Plugins/Raycast/Sample/RaycastTestbedPanel.cs
deleted file mode 100644
index 779406ce..00000000
--- a/Runtime/Plugins/Raycast/Sample/RaycastTestbedPanel.cs
+++ /dev/null
@@ -1,213 +0,0 @@
-using System.Collections.Generic;
-using Unity.UIWidgets.engine;
-using Unity.UIWidgets.foundation;
-using Unity.UIWidgets.material;
-using Unity.UIWidgets.painting;
-using Unity.UIWidgets.plugins.raycast;
-using Unity.UIWidgets.rendering;
-using Unity.UIWidgets.ui;
-using Unity.UIWidgets.widgets;
-using UnityEngine;
-using Color = Unity.UIWidgets.ui.Color;
-using Material = Unity.UIWidgets.material.Material;
-using TextStyle = Unity.UIWidgets.painting.TextStyle;
-
-namespace Unity.UIWidgets.Sample {
-    public class RaycastTestbedPanel : UIWidgetsRaycastablePanel {
-        protected override void OnEnable() {
-            FontManager.instance.addFont(Resources.Load<Font>("fonts/MaterialIcons-Regular"), "Material Icons");
-            base.OnEnable();
-        }
-
-        protected override Widget createWidget() {
-            return new MaterialApp(
-                home: new RaycastTestbedWidget()
-            );
-        }
-    }
-
-    public class RaycastTestbedWidget : StatefulWidget {
-        public RaycastTestbedWidget(Key key = null) : base(key) { }
-
-        public override State createState() {
-            return new RaycastTestbedWidgetState();
-        }
-    }
-
-    public class RaycastTestbedWidgetState : State<RaycastTestbedWidget> {
-        public bool enableState = false;
-        public int switchState = 0;
-        public int switchPosState = 0;
-        public bool enableState2 = false;
-        public int switchState2 = 0;
-        public int switchPosState2 = 2;
-
-        public override Widget build(BuildContext context) {
-            return new Material(
-                color: Colors.transparent,
-                child: new Center(
-                    child: new Column(
-                        mainAxisAlignment: MainAxisAlignment.center,
-                        children: new List<Widget> {
-                            new Row(
-                                mainAxisAlignment: MainAxisAlignment.center,
-                                children: new List<Widget> {
-                                    new RaycastableContainer(child: new MaterialButton(
-                                            child: new Text($"Enable State: {this.enableState.ToString()}"),
-                                            onPressed: () => {
-                                                this.setState(
-                                                    () => { this.enableState = !this.enableState; });
-                                            },
-                                            color: Colors.lightBlue
-                                        )
-                                    ),
-                                    new Padding(padding: EdgeInsets.symmetric(horizontal: 5f)),
-                                    new RaycastableContainer(child: new MaterialButton(
-                                        child: new Text($"Switch State: {this.switchState.ToString()}"),
-                                        onPressed: () => {
-                                            this.setState(
-                                                () => { this.switchState = (this.switchState + 1) % 3; });
-                                        },
-                                        color: Colors.lightBlue
-                                    )),
-                                    new Padding(padding: EdgeInsets.symmetric(horizontal: 5f)),
-                                    new RaycastableContainer(child: new MaterialButton(
-                                        child: new Text($"Switch Pos State: {this.switchPosState.ToString()}"),
-                                        onPressed: () => {
-                                            this.setState(
-                                                () => { this.switchPosState = (this.switchPosState + 1) % 2; });
-                                        },
-                                        color: Colors.lightBlue
-                                    ))
-                                }
-                            ),
-                            new Padding(padding: EdgeInsets.symmetric(5f)),
-                            new Row(
-                                mainAxisAlignment: MainAxisAlignment.center,
-                                children: new List<Widget> {
-                                    new RaycastableContainer(child: new MaterialButton(
-                                        child: new Text($"Enable State: {this.enableState2.ToString()}"),
-                                        onPressed: () => {
-                                            this.setState(
-                                                () => { this.enableState2 = !this.enableState2; });
-                                        },
-                                        color: Colors.lightBlue
-                                    )),
-                                    new Padding(padding: EdgeInsets.symmetric(horizontal: 5f)),
-                                    new RaycastableContainer(child: new MaterialButton(
-                                        child: new Text($"Switch State: {this.switchState2.ToString()}"),
-                                        onPressed: () => {
-                                            this.setState(
-                                                () => { this.switchState2 = (this.switchState2 + 1) % 3; });
-                                        },
-                                        color: Colors.lightBlue
-                                    )),
-                                    new Padding(padding: EdgeInsets.symmetric(horizontal: 5f)),
-                                    new RaycastableContainer(child: new MaterialButton(
-                                        child: new Text($"Switch Pos State: {this.switchPosState2.ToString()}"),
-                                        onPressed: () => {
-                                            this.setState(
-                                                () => { this.switchPosState2 = (this.switchPosState2) % 2 + 1; });
-                                        },
-                                        color: Colors.lightBlue
-                                    ))
-                                }
-                            ),
-                            new Padding(padding: EdgeInsets.symmetric(5f)),
-                            new Stack(
-                                children: new List<Widget> {
-                                    new Row(
-                                        mainAxisAlignment: MainAxisAlignment.center,
-                                        children: new List<Widget> {
-                                            new Container(
-                                                padding: EdgeInsets.only(top: 25f * this.switchPosState,
-                                                    bottom: 25f * (3 - this.switchPosState)),
-                                                child: this.enableState
-                                                    ? (Widget) new RaycastableContainer(
-                                                        new Container(
-                                                            child: new Text(
-                                                                data: this.switchState == 0
-                                                                    ? "特殊字符串"
-                                                                    : this.switchState == 1
-                                                                        ? "特殊字符串串"
-                                                                        : "特殊字符串串串",
-                                                                style: new TextStyle(
-                                                                    fontSize: 48,
-                                                                    fontWeight: FontWeight.bold,
-                                                                    decoration: TextDecoration.none,
-                                                                    color: Colors.red
-                                                                )
-                                                            ),
-                                                            decoration: new BoxDecoration(
-                                                                color: new Color(0x44FFFF00)
-                                                            )
-                                                        )
-                                                    )
-                                                    : new Text(
-                                                        data: this.switchState == 0
-                                                            ? "普通字符串"
-                                                            : this.switchState == 1
-                                                                ? "普通字符串串"
-                                                                : "普通字符串串串",
-                                                        style: new TextStyle(
-                                                            fontSize: 48,
-                                                            fontWeight: FontWeight.bold,
-                                                            decoration: TextDecoration.none,
-                                                            color: Colors.red
-                                                        )
-                                                    )
-                                            )
-                                        }
-                                    ),
-                                    new Row(
-                                        mainAxisAlignment: MainAxisAlignment.center,
-                                        children: new List<Widget> {
-                                            new Container(
-                                                padding: EdgeInsets.only(top: 25f * this.switchPosState2,
-                                                    bottom: 25f * (3 - this.switchPosState2)),
-                                                child: this.enableState2
-                                                    ? (Widget) new RaycastableContainer(
-                                                        new Container(
-                                                            child: new Text(
-                                                                data: this.switchState2 == 0
-                                                                    ? "特殊字符串"
-                                                                    : this.switchState2 == 1
-                                                                        ? "特殊字符串串"
-                                                                        : "特殊字符串串串",
-                                                                style: new TextStyle(
-                                                                    fontSize: 48,
-                                                                    fontWeight: FontWeight.bold,
-                                                                    decoration: TextDecoration.none,
-                                                                    color: Colors.red
-                                                                )
-                                                            ),
-                                                            decoration: new BoxDecoration(
-                                                                color: new Color(0x44FFFF00)
-                                                            )
-                                                        )
-                                                    )
-                                                    : (Widget) new Text(
-                                                        data: this.switchState2 == 0
-                                                            ? "普通字符串"
-                                                            : this.switchState2 == 1
-                                                                ? "普通字符串串"
-                                                                : "普通字符串串串",
-                                                        style: new TextStyle(
-                                                            fontSize: 48,
-                                                            fontWeight: FontWeight.bold,
-                                                            decoration: TextDecoration.none,
-                                                            color: Colors.red
-                                                        )
-                                                    )
-                                            )
-                                        }
-                                    )
-                                }
-                            )
-                        }
-                    )
-                )
-            );
-        }
-    }
-}
\ No newline at end of file
diff --git a/Runtime/Plugins/Raycast/Sample/RaycastTestbedPanel.cs.meta b/Runtime/Plugins/Raycast/Sample/RaycastTestbedPanel.cs.meta
deleted file mode 100644
index 3d3ced9d..00000000
--- a/Runtime/Plugins/Raycast/Sample/RaycastTestbedPanel.cs.meta
+++ /dev/null
@@ -1,11 +0,0 @@
-fileFormatVersion: 2
-guid: 1b02d547623984986a44973c4ba2bca0
-MonoImporter:
-  externalObjects: {}
-  serializedVersion: 2
-  defaultReferences: []
-  executionOrder: 0
-  icon: {instanceID: 0}
-  userData: 
-  assetBundleName: 
-  assetBundleVariant: 
diff --git a/Runtime/Plugins/Raycast.meta b/Runtime/engine/raycastable.meta
similarity index 77%
rename from Runtime/Plugins/Raycast.meta
rename to Runtime/engine/raycastable.meta
index f4661cef..4b305bd7 100644
--- a/Runtime/Plugins/Raycast.meta
+++ b/Runtime/engine/raycastable.meta
@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: 536a3d78629ef4c00adb8dc15d9988df
+guid: d8e15e1221dae40e68226ec6d8ed8ddb
 folderAsset: yes
 DefaultImporter:
   externalObjects: {}
diff --git a/Runtime/Plugins/Raycast/RaycastManager.cs b/Runtime/engine/raycastable/RaycastManager.cs
similarity index 99%
rename from Runtime/Plugins/Raycast/RaycastManager.cs
rename to Runtime/engine/raycastable/RaycastManager.cs
index 9f5beae7..f9c7aca8 100644
--- a/Runtime/Plugins/Raycast/RaycastManager.cs
+++ b/Runtime/engine/raycastable/RaycastManager.cs
@@ -3,7 +3,7 @@
 using Unity.UIWidgets.ui;
 using UnityEngine;
 
-namespace Unity.UIWidgets.plugins.raycast {
+namespace Unity.UIWidgets.engine.raycast {
     public class RaycastableRect {
         bool _isDirty = true;
 
diff --git a/Runtime/Plugins/Raycast/RaycastManager.cs.meta b/Runtime/engine/raycastable/RaycastManager.cs.meta
similarity index 100%
rename from Runtime/Plugins/Raycast/RaycastManager.cs.meta
rename to Runtime/engine/raycastable/RaycastManager.cs.meta
diff --git a/Runtime/Plugins/Raycast/RaycastableContainer.cs b/Runtime/engine/raycastable/RaycastableContainer.cs
similarity index 98%
rename from Runtime/Plugins/Raycast/RaycastableContainer.cs
rename to Runtime/engine/raycastable/RaycastableContainer.cs
index 8f2b9459..429d6524 100644
--- a/Runtime/Plugins/Raycast/RaycastableContainer.cs
+++ b/Runtime/engine/raycastable/RaycastableContainer.cs
@@ -3,7 +3,7 @@
 using Unity.UIWidgets.ui;
 using Unity.UIWidgets.widgets;
 
-namespace Unity.UIWidgets.plugins.raycast {
+namespace Unity.UIWidgets.engine.raycast {
     class RaycastableBox : SingleChildRenderObjectWidget {
         public RaycastableBox(
             Key key = null,
diff --git a/Runtime/Plugins/Raycast/RaycastableContainer.cs.meta b/Runtime/engine/raycastable/RaycastableContainer.cs.meta
similarity index 100%
rename from Runtime/Plugins/Raycast/RaycastableContainer.cs.meta
rename to Runtime/engine/raycastable/RaycastableContainer.cs.meta
diff --git a/Runtime/Plugins/Raycast/UIWidgetsRaycastablePanel.cs b/Runtime/engine/raycastable/UIWidgetsRaycastablePanel.cs
similarity index 96%
rename from Runtime/Plugins/Raycast/UIWidgetsRaycastablePanel.cs
rename to Runtime/engine/raycastable/UIWidgetsRaycastablePanel.cs
index e2961f36..2fc70de1 100644
--- a/Runtime/Plugins/Raycast/UIWidgetsRaycastablePanel.cs
+++ b/Runtime/engine/raycastable/UIWidgetsRaycastablePanel.cs
@@ -1,7 +1,7 @@
 using Unity.UIWidgets.engine;
 using UnityEngine;
 
-namespace Unity.UIWidgets.plugins.raycast {
+namespace Unity.UIWidgets.engine.raycast {
     [RequireComponent(typeof(RectTransform))]
     public class UIWidgetsRaycastablePanel : UIWidgetsPanel, ICanvasRaycastFilter {
         int windowHashCode;
diff --git a/Runtime/Plugins/Raycast/UIWidgetsRaycastablePanel.cs.meta b/Runtime/engine/raycastable/UIWidgetsRaycastablePanel.cs.meta
similarity index 100%
rename from Runtime/Plugins/Raycast/UIWidgetsRaycastablePanel.cs.meta
rename to Runtime/engine/raycastable/UIWidgetsRaycastablePanel.cs.meta