├── AndroidPanelModule.prefab ├── AndroidPanelModule.prefab.meta ├── LICENSE ├── LICENSE.meta ├── PortablePanel.prefab ├── PortablePanel.prefab.meta ├── Prefabs.meta ├── Prefabs ├── Basic Example.meta ├── Basic Example │ ├── GrabbablePanel.prefab │ └── GrabbablePanel.prefab.meta ├── RigidBody Example.meta └── RigidBody Example │ ├── GrabbablePanelWithRigidBody.prefab │ ├── GrabbablePanelWithRigidBody.prefab.meta │ ├── Panel Material.mat │ ├── Panel Material.mat.meta │ ├── PanelParticleMaterial.mat │ ├── PanelParticleMaterial.mat.meta │ ├── PortablePanelWithRigidBody.asset │ ├── PortablePanelWithRigidBody.asset.meta │ ├── PortablePanelWithRigidBody.cs │ └── PortablePanelWithRigidBody.cs.meta ├── README.md ├── README.md.meta ├── Res.meta ├── Res ├── Android.PNG ├── Android.PNG.meta ├── PanelHierarchy.PNG ├── PanelHierarchy.PNG.meta ├── Parameters.png ├── Parameters.png.meta ├── Presentation1.gif ├── Presentation1.gif.meta ├── Presentation2.gif └── Presentation2.gif.meta ├── Scripts.meta ├── Scripts ├── AndroidPanelModule.asset ├── AndroidPanelModule.asset.meta ├── AndroidPanelModule.cs ├── AndroidPanelModule.cs.meta ├── PortablePanel.asset ├── PortablePanel.asset.meta ├── PortablePanel.cs ├── PortablePanel.cs.meta ├── PortablePanelPickupModule.asset ├── PortablePanelPickupModule.asset.meta ├── PortablePanelPickupModule.cs └── PortablePanelPickupModule.cs.meta ├── ThrowablePanel.prefab └── ThrowablePanel.prefab.meta /AndroidPanelModule.prefab: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!1 &3764922133343136984 4 | GameObject: 5 | m_ObjectHideFlags: 0 6 | m_CorrespondingSourceObject: {fileID: 0} 7 | m_PrefabInstance: {fileID: 0} 8 | m_PrefabAsset: {fileID: 0} 9 | serializedVersion: 6 10 | m_Component: 11 | - component: {fileID: 1884747349897913452} 12 | - component: {fileID: 4472827621752594383} 13 | - component: {fileID: 3375193750615995457} 14 | m_Layer: 0 15 | m_Name: AndroidModule 16 | m_TagString: Untagged 17 | m_Icon: {fileID: 0} 18 | m_NavMeshLayer: 0 19 | m_StaticEditorFlags: 0 20 | m_IsActive: 1 21 | --- !u!4 &1884747349897913452 22 | Transform: 23 | m_ObjectHideFlags: 0 24 | m_CorrespondingSourceObject: {fileID: 0} 25 | m_PrefabInstance: {fileID: 0} 26 | m_PrefabAsset: {fileID: 0} 27 | m_GameObject: {fileID: 3764922133343136984} 28 | m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} 29 | m_LocalPosition: {x: 0.6869443, y: -1.5459756, z: 6.192684} 30 | m_LocalScale: {x: 1, y: 1, z: 1} 31 | m_Children: 32 | - {fileID: 6322727466328258209} 33 | m_Father: {fileID: 0} 34 | m_RootOrder: 0 35 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 36 | --- !u!114 &4472827621752594383 37 | MonoBehaviour: 38 | m_ObjectHideFlags: 0 39 | m_CorrespondingSourceObject: {fileID: 0} 40 | m_PrefabInstance: {fileID: 0} 41 | m_PrefabAsset: {fileID: 0} 42 | m_GameObject: {fileID: 3764922133343136984} 43 | m_Enabled: 1 44 | m_EditorHideFlags: 0 45 | m_Script: {fileID: 11500000, guid: f043114674f43f2448af5493f1cacf41, type: 3} 46 | m_Name: 47 | m_EditorClassIdentifier: 48 | serializationData: 49 | SerializedFormat: 2 50 | SerializedBytes: 51 | ReferencedUnityObjects: [] 52 | SerializedBytesString: 53 | Prefab: {fileID: 0} 54 | PrefabModificationsReferencedUnityObjects: [] 55 | PrefabModifications: [] 56 | SerializationNodes: [] 57 | _udonSharpBackingUdonBehaviour: {fileID: 3375193750615995457} 58 | PortablePanelInstance: {fileID: 0} 59 | CanvasInstance: {fileID: 5806126486146550018} 60 | --- !u!114 &3375193750615995457 61 | MonoBehaviour: 62 | m_ObjectHideFlags: 0 63 | m_CorrespondingSourceObject: {fileID: 0} 64 | m_PrefabInstance: {fileID: 0} 65 | m_PrefabAsset: {fileID: 0} 66 | m_GameObject: {fileID: 3764922133343136984} 67 | m_Enabled: 1 68 | m_EditorHideFlags: 0 69 | m_Script: {fileID: 11500000, guid: 45115577ef41a5b4ca741ed302693907, type: 3} 70 | m_Name: 71 | m_EditorClassIdentifier: 72 | interactTextPlacement: {fileID: 0} 73 | interactText: Use 74 | interactTextGO: {fileID: 0} 75 | proximity: 2 76 | SynchronizePosition: 0 77 | AllowCollisionOwnershipTransfer: 0 78 | Reliable: 0 79 | _syncMethod: 1 80 | serializedProgramAsset: {fileID: 11400000, guid: d934a01d057aa214c832458f807b8003, 81 | type: 2} 82 | programSource: {fileID: 11400000, guid: 872edc65781d9904a950c69f6602c83c, type: 2} 83 | serializedPublicVariablesBytesString: Ai8AAAAAATIAAABWAFIAQwAuAFUAZABvAG4ALgBDAG8AbQBtAG8AbgAuAFUAZABvAG4AVgBhAHIAaQBhAGIAbABlAFQAYQBiAGwAZQAsACAAVgBSAEMALgBVAGQAbwBuAC4AQwBvAG0AbQBvAG4AAAAAAAYBAAAAAAAAACcBBAAAAHQAeQBwAGUAAWgAAABTAHkAcwB0AGUAbQAuAEMAbwBsAGwAZQBjAHQAaQBvAG4AcwAuAEcAZQBuAGUAcgBpAGMALgBMAGkAcwB0AGAAMQBbAFsAVgBSAEMALgBVAGQAbwBuAC4AQwBvAG0AbQBvAG4ALgBJAG4AdABlAHIAZgBhAGMAZQBzAC4ASQBVAGQAbwBuAFYAYQByAGkAYQBiAGwAZQAsACAAVgBSAEMALgBVAGQAbwBuAC4AQwBvAG0AbQBvAG4AXQBdACwAIABtAHMAYwBvAHIAbABpAGIAAQEJAAAAVgBhAHIAaQBhAGIAbABlAHMALwEAAAABaAAAAFMAeQBzAHQAZQBtAC4AQwBvAGwAbABlAGMAdABpAG8AbgBzAC4ARwBlAG4AZQByAGkAYwAuAEwAaQBzAHQAYAAxAFsAWwBWAFIAQwAuAFUAZABvAG4ALgBDAG8AbQBtAG8AbgAuAEkAbgB0AGUAcgBmAGEAYwBlAHMALgBJAFUAZABvAG4AVgBhAHIAaQBhAGIAbABlACwAIABWAFIAQwAuAFUAZABvAG4ALgBDAG8AbQBtAG8AbgBdAF0ALAAgAG0AcwBjAG8AcgBsAGkAYgABAAAABgEAAAAAAAAAAi8CAAAAAUkAAABWAFIAQwAuAFUAZABvAG4ALgBDAG8AbQBtAG8AbgAuAFUAZABvAG4AVgBhAHIAaQBhAGIAbABlAGAAMQBbAFsAUwB5AHMAdABlAG0ALgBJAG4AdAAzADIALAAgAG0AcwBjAG8AcgBsAGkAYgBdAF0ALAAgAFYAUgBDAC4AVQBkAG8AbgAuAEMAbwBtAG0AbwBuAAIAAAAGAgAAAAAAAAAnAQQAAAB0AHkAcABlAAEXAAAAUwB5AHMAdABlAG0ALgBTAHQAcgBpAG4AZwAsACAAbQBzAGMAbwByAGwAaQBiACcBCgAAAFMAeQBtAGIAbwBsAE4AYQBtAGUAAR8AAABfAF8AXwBVAGQAbwBuAFMAaABhAHIAcABCAGUAaABhAHYAaQBvAHUAcgBWAGUAcgBzAGkAbwBuAF8AXwBfACcBBAAAAHQAeQBwAGUAARYAAABTAHkAcwB0AGUAbQAuAEkAbgB0ADMAMgAsACAAbQBzAGMAbwByAGwAaQBiABcBBQAAAFYAYQBsAHUAZQACAAAABwUHBQcF 84 | publicVariablesUnityEngineObjects: [] 85 | publicVariablesSerializationDataFormat: 0 86 | --- !u!1 &4367019252113600669 87 | GameObject: 88 | m_ObjectHideFlags: 0 89 | m_CorrespondingSourceObject: {fileID: 0} 90 | m_PrefabInstance: {fileID: 0} 91 | m_PrefabAsset: {fileID: 0} 92 | serializedVersion: 6 93 | m_Component: 94 | - component: {fileID: 1588211458845382089} 95 | - component: {fileID: 5942941983311299061} 96 | - component: {fileID: 7594780536231908624} 97 | m_Layer: 0 98 | m_Name: Text (TMP) 99 | m_TagString: Untagged 100 | m_Icon: {fileID: 0} 101 | m_NavMeshLayer: 0 102 | m_StaticEditorFlags: 0 103 | m_IsActive: 1 104 | --- !u!224 &1588211458845382089 105 | RectTransform: 106 | m_ObjectHideFlags: 0 107 | m_CorrespondingSourceObject: {fileID: 0} 108 | m_PrefabInstance: {fileID: 0} 109 | m_PrefabAsset: {fileID: 0} 110 | m_GameObject: {fileID: 4367019252113600669} 111 | m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} 112 | m_LocalPosition: {x: 0, y: 0, z: 0} 113 | m_LocalScale: {x: 1, y: 1, z: 1} 114 | m_Children: [] 115 | m_Father: {fileID: 1531182488482796981} 116 | m_RootOrder: 0 117 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 118 | m_AnchorMin: {x: 0, y: 0} 119 | m_AnchorMax: {x: 1, y: 1} 120 | m_AnchoredPosition: {x: 0, y: 0} 121 | m_SizeDelta: {x: 0, y: 0} 122 | m_Pivot: {x: 0.5, y: 0.5} 123 | --- !u!222 &5942941983311299061 124 | CanvasRenderer: 125 | m_ObjectHideFlags: 0 126 | m_CorrespondingSourceObject: {fileID: 0} 127 | m_PrefabInstance: {fileID: 0} 128 | m_PrefabAsset: {fileID: 0} 129 | m_GameObject: {fileID: 4367019252113600669} 130 | m_CullTransparentMesh: 0 131 | --- !u!114 &7594780536231908624 132 | MonoBehaviour: 133 | m_ObjectHideFlags: 0 134 | m_CorrespondingSourceObject: {fileID: 0} 135 | m_PrefabInstance: {fileID: 0} 136 | m_PrefabAsset: {fileID: 0} 137 | m_GameObject: {fileID: 4367019252113600669} 138 | m_Enabled: 1 139 | m_EditorHideFlags: 0 140 | m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} 141 | m_Name: 142 | m_EditorClassIdentifier: 143 | m_Material: {fileID: 0} 144 | m_Color: {r: 1, g: 1, b: 1, a: 1} 145 | m_RaycastTarget: 1 146 | m_Maskable: 1 147 | m_OnCullStateChanged: 148 | m_PersistentCalls: 149 | m_Calls: [] 150 | m_text: Panel 151 | m_isRightToLeft: 0 152 | m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} 153 | m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} 154 | m_fontSharedMaterials: [] 155 | m_fontMaterial: {fileID: 0} 156 | m_fontMaterials: [] 157 | m_fontColor32: 158 | serializedVersion: 2 159 | rgba: 4281479730 160 | m_fontColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} 161 | m_enableVertexGradient: 0 162 | m_colorMode: 3 163 | m_fontColorGradient: 164 | topLeft: {r: 1, g: 1, b: 1, a: 1} 165 | topRight: {r: 1, g: 1, b: 1, a: 1} 166 | bottomLeft: {r: 1, g: 1, b: 1, a: 1} 167 | bottomRight: {r: 1, g: 1, b: 1, a: 1} 168 | m_fontColorGradientPreset: {fileID: 0} 169 | m_spriteAsset: {fileID: 0} 170 | m_tintAllSprites: 0 171 | m_StyleSheet: {fileID: 0} 172 | m_TextStyleHashCode: -1183493901 173 | m_overrideHtmlColors: 0 174 | m_faceColor: 175 | serializedVersion: 2 176 | rgba: 4294967295 177 | m_fontSize: 24 178 | m_fontSizeBase: 24 179 | m_fontWeight: 400 180 | m_enableAutoSizing: 0 181 | m_fontSizeMin: 18 182 | m_fontSizeMax: 72 183 | m_fontStyle: 0 184 | m_HorizontalAlignment: 2 185 | m_VerticalAlignment: 512 186 | m_textAlignment: 65535 187 | m_characterSpacing: 0 188 | m_wordSpacing: 0 189 | m_lineSpacing: 0 190 | m_lineSpacingMax: 0 191 | m_paragraphSpacing: 0 192 | m_charWidthMaxAdj: 0 193 | m_enableWordWrapping: 1 194 | m_wordWrappingRatios: 0.4 195 | m_overflowMode: 0 196 | m_linkedTextComponent: {fileID: 0} 197 | parentLinkedComponent: {fileID: 0} 198 | m_enableKerning: 1 199 | m_enableExtraPadding: 0 200 | checkPaddingRequired: 0 201 | m_isRichText: 1 202 | m_parseCtrlCharacters: 1 203 | m_isOrthographic: 1 204 | m_isCullingEnabled: 0 205 | m_horizontalMapping: 0 206 | m_verticalMapping: 0 207 | m_uvLineOffset: 0 208 | m_geometrySortingOrder: 0 209 | m_IsTextObjectScaleStatic: 0 210 | m_VertexBufferAutoSizeReduction: 0 211 | m_useMaxVisibleDescender: 1 212 | m_pageToDisplay: 1 213 | m_margin: {x: 0, y: 0, z: 0, w: 0} 214 | m_isUsingLegacyAnimationComponent: 0 215 | m_isVolumetricText: 0 216 | m_hasFontAssetChanged: 0 217 | m_baseMaterial: {fileID: 0} 218 | m_maskOffset: {x: 0, y: 0, z: 0, w: 0} 219 | --- !u!1 &8098409514734976703 220 | GameObject: 221 | m_ObjectHideFlags: 0 222 | m_CorrespondingSourceObject: {fileID: 0} 223 | m_PrefabInstance: {fileID: 0} 224 | m_PrefabAsset: {fileID: 0} 225 | serializedVersion: 6 226 | m_Component: 227 | - component: {fileID: 1531182488482796981} 228 | - component: {fileID: 3638087404488727502} 229 | - component: {fileID: 7302953359352975616} 230 | - component: {fileID: 7058503471817273753} 231 | m_Layer: 0 232 | m_Name: Button 233 | m_TagString: Untagged 234 | m_Icon: {fileID: 0} 235 | m_NavMeshLayer: 0 236 | m_StaticEditorFlags: 0 237 | m_IsActive: 1 238 | --- !u!224 &1531182488482796981 239 | RectTransform: 240 | m_ObjectHideFlags: 0 241 | m_CorrespondingSourceObject: {fileID: 0} 242 | m_PrefabInstance: {fileID: 0} 243 | m_PrefabAsset: {fileID: 0} 244 | m_GameObject: {fileID: 8098409514734976703} 245 | m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} 246 | m_LocalPosition: {x: 0, y: 0, z: 0} 247 | m_LocalScale: {x: 1, y: 1, z: 1} 248 | m_Children: 249 | - {fileID: 1588211458845382089} 250 | m_Father: {fileID: 6322727466328258209} 251 | m_RootOrder: 0 252 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 253 | m_AnchorMin: {x: 0, y: 1} 254 | m_AnchorMax: {x: 0, y: 1} 255 | m_AnchoredPosition: {x: 20, y: -20} 256 | m_SizeDelta: {x: 160, y: 40} 257 | m_Pivot: {x: 0, y: 1} 258 | --- !u!222 &3638087404488727502 259 | CanvasRenderer: 260 | m_ObjectHideFlags: 0 261 | m_CorrespondingSourceObject: {fileID: 0} 262 | m_PrefabInstance: {fileID: 0} 263 | m_PrefabAsset: {fileID: 0} 264 | m_GameObject: {fileID: 8098409514734976703} 265 | m_CullTransparentMesh: 0 266 | --- !u!114 &7302953359352975616 267 | MonoBehaviour: 268 | m_ObjectHideFlags: 0 269 | m_CorrespondingSourceObject: {fileID: 0} 270 | m_PrefabInstance: {fileID: 0} 271 | m_PrefabAsset: {fileID: 0} 272 | m_GameObject: {fileID: 8098409514734976703} 273 | m_Enabled: 1 274 | m_EditorHideFlags: 0 275 | m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} 276 | m_Name: 277 | m_EditorClassIdentifier: 278 | m_Material: {fileID: 0} 279 | m_Color: {r: 1, g: 1, b: 1, a: 1} 280 | m_RaycastTarget: 1 281 | m_Maskable: 1 282 | m_OnCullStateChanged: 283 | m_PersistentCalls: 284 | m_Calls: [] 285 | m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} 286 | m_Type: 1 287 | m_PreserveAspect: 0 288 | m_FillCenter: 1 289 | m_FillMethod: 4 290 | m_FillAmount: 1 291 | m_FillClockwise: 1 292 | m_FillOrigin: 0 293 | m_UseSpriteMesh: 0 294 | m_PixelsPerUnitMultiplier: 1 295 | --- !u!114 &7058503471817273753 296 | MonoBehaviour: 297 | m_ObjectHideFlags: 0 298 | m_CorrespondingSourceObject: {fileID: 0} 299 | m_PrefabInstance: {fileID: 0} 300 | m_PrefabAsset: {fileID: 0} 301 | m_GameObject: {fileID: 8098409514734976703} 302 | m_Enabled: 1 303 | m_EditorHideFlags: 0 304 | m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} 305 | m_Name: 306 | m_EditorClassIdentifier: 307 | m_Navigation: 308 | m_Mode: 3 309 | m_SelectOnUp: {fileID: 0} 310 | m_SelectOnDown: {fileID: 0} 311 | m_SelectOnLeft: {fileID: 0} 312 | m_SelectOnRight: {fileID: 0} 313 | m_Transition: 1 314 | m_Colors: 315 | m_NormalColor: {r: 1, g: 1, b: 1, a: 1} 316 | m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} 317 | m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} 318 | m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} 319 | m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} 320 | m_ColorMultiplier: 1 321 | m_FadeDuration: 0.1 322 | m_SpriteState: 323 | m_HighlightedSprite: {fileID: 0} 324 | m_PressedSprite: {fileID: 0} 325 | m_SelectedSprite: {fileID: 0} 326 | m_DisabledSprite: {fileID: 0} 327 | m_AnimationTriggers: 328 | m_NormalTrigger: Normal 329 | m_HighlightedTrigger: Highlighted 330 | m_PressedTrigger: Pressed 331 | m_SelectedTrigger: Selected 332 | m_DisabledTrigger: Disabled 333 | m_Interactable: 1 334 | m_TargetGraphic: {fileID: 7302953359352975616} 335 | m_OnClick: 336 | m_PersistentCalls: 337 | m_Calls: 338 | - m_Target: {fileID: 3375193750615995457} 339 | m_MethodName: SendCustomEvent 340 | m_Mode: 5 341 | m_Arguments: 342 | m_ObjectArgument: {fileID: 0} 343 | m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine 344 | m_IntArgument: 0 345 | m_FloatArgument: 0 346 | m_StringArgument: ToggleMenu 347 | m_BoolArgument: 0 348 | m_CallState: 2 349 | --- !u!1 &8782409873214502432 350 | GameObject: 351 | m_ObjectHideFlags: 0 352 | m_CorrespondingSourceObject: {fileID: 0} 353 | m_PrefabInstance: {fileID: 0} 354 | m_PrefabAsset: {fileID: 0} 355 | serializedVersion: 6 356 | m_Component: 357 | - component: {fileID: 6322727466328258209} 358 | - component: {fileID: 5806126486146550018} 359 | - component: {fileID: 5072826710587021207} 360 | - component: {fileID: 3933027235913866682} 361 | m_Layer: 0 362 | m_Name: Canvas 363 | m_TagString: Untagged 364 | m_Icon: {fileID: 0} 365 | m_NavMeshLayer: 0 366 | m_StaticEditorFlags: 0 367 | m_IsActive: 0 368 | --- !u!224 &6322727466328258209 369 | RectTransform: 370 | m_ObjectHideFlags: 0 371 | m_CorrespondingSourceObject: {fileID: 0} 372 | m_PrefabInstance: {fileID: 0} 373 | m_PrefabAsset: {fileID: 0} 374 | m_GameObject: {fileID: 8782409873214502432} 375 | m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} 376 | m_LocalPosition: {x: 0, y: 0, z: 0} 377 | m_LocalScale: {x: 0, y: 0, z: 0} 378 | m_Children: 379 | - {fileID: 1531182488482796981} 380 | m_Father: {fileID: 1884747349897913452} 381 | m_RootOrder: 0 382 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 383 | m_AnchorMin: {x: 0, y: 0} 384 | m_AnchorMax: {x: 0, y: 0} 385 | m_AnchoredPosition: {x: 0, y: 0} 386 | m_SizeDelta: {x: 0, y: 0} 387 | m_Pivot: {x: 0, y: 0} 388 | --- !u!223 &5806126486146550018 389 | Canvas: 390 | m_ObjectHideFlags: 0 391 | m_CorrespondingSourceObject: {fileID: 0} 392 | m_PrefabInstance: {fileID: 0} 393 | m_PrefabAsset: {fileID: 0} 394 | m_GameObject: {fileID: 8782409873214502432} 395 | m_Enabled: 1 396 | serializedVersion: 3 397 | m_RenderMode: 0 398 | m_Camera: {fileID: 0} 399 | m_PlaneDistance: 100 400 | m_PixelPerfect: 0 401 | m_ReceivesEvents: 1 402 | m_OverrideSorting: 0 403 | m_OverridePixelPerfect: 0 404 | m_SortingBucketNormalizedSize: 0 405 | m_AdditionalShaderChannelsFlag: 25 406 | m_SortingLayerID: 0 407 | m_SortingOrder: 0 408 | m_TargetDisplay: 0 409 | --- !u!114 &5072826710587021207 410 | MonoBehaviour: 411 | m_ObjectHideFlags: 0 412 | m_CorrespondingSourceObject: {fileID: 0} 413 | m_PrefabInstance: {fileID: 0} 414 | m_PrefabAsset: {fileID: 0} 415 | m_GameObject: {fileID: 8782409873214502432} 416 | m_Enabled: 1 417 | m_EditorHideFlags: 0 418 | m_Script: {fileID: 11500000, guid: 0cd44c1031e13a943bb63640046fad76, type: 3} 419 | m_Name: 420 | m_EditorClassIdentifier: 421 | m_UiScaleMode: 1 422 | m_ReferencePixelsPerUnit: 100 423 | m_ScaleFactor: 1 424 | m_ReferenceResolution: {x: 1280, y: 720} 425 | m_ScreenMatchMode: 0 426 | m_MatchWidthOrHeight: 0 427 | m_PhysicalUnit: 3 428 | m_FallbackScreenDPI: 96 429 | m_DefaultSpriteDPI: 96 430 | m_DynamicPixelsPerUnit: 1 431 | --- !u!114 &3933027235913866682 432 | MonoBehaviour: 433 | m_ObjectHideFlags: 0 434 | m_CorrespondingSourceObject: {fileID: 0} 435 | m_PrefabInstance: {fileID: 0} 436 | m_PrefabAsset: {fileID: 0} 437 | m_GameObject: {fileID: 8782409873214502432} 438 | m_Enabled: 1 439 | m_EditorHideFlags: 0 440 | m_Script: {fileID: 11500000, guid: dc42784cf147c0c48a680349fa168899, type: 3} 441 | m_Name: 442 | m_EditorClassIdentifier: 443 | m_IgnoreReversedGraphics: 1 444 | m_BlockingObjects: 0 445 | m_BlockingMask: 446 | serializedVersion: 2 447 | m_Bits: 4294967295 448 | -------------------------------------------------------------------------------- /AndroidPanelModule.prefab.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 2c8d1f92e6885a74f886ec168beeac66 3 | PrefabImporter: 4 | externalObjects: {} 5 | userData: 6 | assetBundleName: 7 | assetBundleVariant: 8 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2023 MyroP 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /LICENSE.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: b9f5155ef9654064d9e0894a64862339 3 | DefaultImporter: 4 | externalObjects: {} 5 | userData: 6 | assetBundleName: 7 | assetBundleVariant: 8 | -------------------------------------------------------------------------------- /PortablePanel.prefab: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!1 &1216727722377721200 4 | GameObject: 5 | m_ObjectHideFlags: 0 6 | m_CorrespondingSourceObject: {fileID: 0} 7 | m_PrefabInstance: {fileID: 0} 8 | m_PrefabAsset: {fileID: 0} 9 | serializedVersion: 6 10 | m_Component: 11 | - component: {fileID: 7531146285904012144} 12 | m_Layer: 0 13 | m_Name: '[ADD YOUR PANEL AS A CHILD OF THIS GAMEOBJECT]' 14 | m_TagString: Untagged 15 | m_Icon: {fileID: 0} 16 | m_NavMeshLayer: 0 17 | m_StaticEditorFlags: 0 18 | m_IsActive: 1 19 | --- !u!4 &7531146285904012144 20 | Transform: 21 | m_ObjectHideFlags: 0 22 | m_CorrespondingSourceObject: {fileID: 0} 23 | m_PrefabInstance: {fileID: 0} 24 | m_PrefabAsset: {fileID: 0} 25 | m_GameObject: {fileID: 1216727722377721200} 26 | m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} 27 | m_LocalPosition: {x: 0, y: 0, z: 0} 28 | m_LocalScale: {x: 1, y: 1, z: 1} 29 | m_Children: 30 | - {fileID: 3658407098491778260} 31 | m_Father: {fileID: 8659203161166647251} 32 | m_RootOrder: 0 33 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 34 | --- !u!1 &3258420194863700279 35 | GameObject: 36 | m_ObjectHideFlags: 0 37 | m_CorrespondingSourceObject: {fileID: 0} 38 | m_PrefabInstance: {fileID: 0} 39 | m_PrefabAsset: {fileID: 0} 40 | serializedVersion: 6 41 | m_Component: 42 | - component: {fileID: 8659203161166647251} 43 | - component: {fileID: 7443599571650023776} 44 | - component: {fileID: 8874036614593792104} 45 | m_Layer: 0 46 | m_Name: PortablePanel 47 | m_TagString: Untagged 48 | m_Icon: {fileID: 0} 49 | m_NavMeshLayer: 0 50 | m_StaticEditorFlags: 0 51 | m_IsActive: 1 52 | --- !u!4 &8659203161166647251 53 | Transform: 54 | m_ObjectHideFlags: 0 55 | m_CorrespondingSourceObject: {fileID: 0} 56 | m_PrefabInstance: {fileID: 0} 57 | m_PrefabAsset: {fileID: 0} 58 | m_GameObject: {fileID: 3258420194863700279} 59 | m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} 60 | m_LocalPosition: {x: 0, y: 0, z: 0} 61 | m_LocalScale: {x: 1, y: 1, z: 1} 62 | m_Children: 63 | - {fileID: 7531146285904012144} 64 | m_Father: {fileID: 0} 65 | m_RootOrder: 0 66 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 67 | --- !u!114 &7443599571650023776 68 | MonoBehaviour: 69 | m_ObjectHideFlags: 0 70 | m_CorrespondingSourceObject: {fileID: 0} 71 | m_PrefabInstance: {fileID: 0} 72 | m_PrefabAsset: {fileID: 0} 73 | m_GameObject: {fileID: 3258420194863700279} 74 | m_Enabled: 1 75 | m_EditorHideFlags: 0 76 | m_Script: {fileID: 11500000, guid: 6c16e461e59a5a340a22f538d64095e8, type: 3} 77 | m_Name: 78 | m_EditorClassIdentifier: 79 | serializationData: 80 | SerializedFormat: 2 81 | SerializedBytes: 82 | ReferencedUnityObjects: [] 83 | SerializedBytesString: 84 | Prefab: {fileID: 0} 85 | PrefabModificationsReferencedUnityObjects: [] 86 | PrefabModifications: [] 87 | SerializationNodes: [] 88 | _udonSharpBackingUdonBehaviour: {fileID: 8874036614593792104} 89 | Panel: {fileID: 1216727722377721200} 90 | TabOnHold: 1 91 | GestureMode: 0 92 | CloseBehaviour: 0 93 | _isPickupable: 1 94 | MaxScale: 3 95 | MinScale: 0.1 96 | MaxDistanceBeforeClosingThePanel: 2 97 | PanelScaleOnDesktop: 0.5 98 | _delayInitialisation: 0 99 | --- !u!114 &8874036614593792104 100 | MonoBehaviour: 101 | m_ObjectHideFlags: 0 102 | m_CorrespondingSourceObject: {fileID: 0} 103 | m_PrefabInstance: {fileID: 0} 104 | m_PrefabAsset: {fileID: 0} 105 | m_GameObject: {fileID: 3258420194863700279} 106 | m_Enabled: 1 107 | m_EditorHideFlags: 0 108 | m_Script: {fileID: 11500000, guid: 45115577ef41a5b4ca741ed302693907, type: 3} 109 | m_Name: 110 | m_EditorClassIdentifier: 111 | interactTextPlacement: {fileID: 0} 112 | interactText: Use 113 | interactTextGO: {fileID: 0} 114 | proximity: 2 115 | SynchronizePosition: 0 116 | AllowCollisionOwnershipTransfer: 0 117 | Reliable: 0 118 | _syncMethod: 1 119 | serializedProgramAsset: {fileID: 11400000, guid: fc0a2d339cee7da4d9d94b4b65d2d2d1, 120 | type: 2} 121 | programSource: {fileID: 11400000, guid: 16f82f9ec93c4be49951c5183c885032, type: 2} 122 | serializedPublicVariablesBytesString: Ai8AAAAAATIAAABWAFIAQwAuAFUAZABvAG4ALgBDAG8AbQBtAG8AbgAuAFUAZABvAG4AVgBhAHIAaQBhAGIAbABlAFQAYQBiAGwAZQAsACAAVgBSAEMALgBVAGQAbwBuAC4AQwBvAG0AbQBvAG4AAAAAAAYBAAAAAAAAACcBBAAAAHQAeQBwAGUAAWgAAABTAHkAcwB0AGUAbQAuAEMAbwBsAGwAZQBjAHQAaQBvAG4AcwAuAEcAZQBuAGUAcgBpAGMALgBMAGkAcwB0AGAAMQBbAFsAVgBSAEMALgBVAGQAbwBuAC4AQwBvAG0AbQBvAG4ALgBJAG4AdABlAHIAZgBhAGMAZQBzAC4ASQBVAGQAbwBuAFYAYQByAGkAYQBiAGwAZQAsACAAVgBSAEMALgBVAGQAbwBuAC4AQwBvAG0AbQBvAG4AXQBdACwAIABtAHMAYwBvAHIAbABpAGIAAQEJAAAAVgBhAHIAaQBhAGIAbABlAHMALwEAAAABaAAAAFMAeQBzAHQAZQBtAC4AQwBvAGwAbABlAGMAdABpAG8AbgBzAC4ARwBlAG4AZQByAGkAYwAuAEwAaQBzAHQAYAAxAFsAWwBWAFIAQwAuAFUAZABvAG4ALgBDAG8AbQBtAG8AbgAuAEkAbgB0AGUAcgBmAGEAYwBlAHMALgBJAFUAZABvAG4AVgBhAHIAaQBhAGIAbABlACwAIABWAFIAQwAuAFUAZABvAG4ALgBDAG8AbQBtAG8AbgBdAF0ALAAgAG0AcwBjAG8AcgBsAGkAYgABAAAABgEAAAAAAAAAAi8CAAAAAUkAAABWAFIAQwAuAFUAZABvAG4ALgBDAG8AbQBtAG8AbgAuAFUAZABvAG4AVgBhAHIAaQBhAGIAbABlAGAAMQBbAFsAUwB5AHMAdABlAG0ALgBJAG4AdAAzADIALAAgAG0AcwBjAG8AcgBsAGkAYgBdAF0ALAAgAFYAUgBDAC4AVQBkAG8AbgAuAEMAbwBtAG0AbwBuAAIAAAAGAgAAAAAAAAAnAQQAAAB0AHkAcABlAAEXAAAAUwB5AHMAdABlAG0ALgBTAHQAcgBpAG4AZwAsACAAbQBzAGMAbwByAGwAaQBiACcBCgAAAFMAeQBtAGIAbwBsAE4AYQBtAGUAAR8AAABfAF8AXwBVAGQAbwBuAFMAaABhAHIAcABCAGUAaABhAHYAaQBvAHUAcgBWAGUAcgBzAGkAbwBuAF8AXwBfACcBBAAAAHQAeQBwAGUAARYAAABTAHkAcwB0AGUAbQAuAEkAbgB0ADMAMgAsACAAbQBzAGMAbwByAGwAaQBiABcBBQAAAFYAYQBsAHUAZQACAAAABwUHBQcF 123 | publicVariablesUnityEngineObjects: [] 124 | publicVariablesSerializationDataFormat: 0 125 | --- !u!1 &3967312580591935724 126 | GameObject: 127 | m_ObjectHideFlags: 0 128 | m_CorrespondingSourceObject: {fileID: 0} 129 | m_PrefabInstance: {fileID: 0} 130 | m_PrefabAsset: {fileID: 0} 131 | serializedVersion: 6 132 | m_Component: 133 | - component: {fileID: 4275710173028544777} 134 | - component: {fileID: 7773693860768129393} 135 | - component: {fileID: 2457320658494291693} 136 | m_Layer: 0 137 | m_Name: Text (TMP) 138 | m_TagString: Untagged 139 | m_Icon: {fileID: 0} 140 | m_NavMeshLayer: 0 141 | m_StaticEditorFlags: 0 142 | m_IsActive: 1 143 | --- !u!224 &4275710173028544777 144 | RectTransform: 145 | m_ObjectHideFlags: 0 146 | m_CorrespondingSourceObject: {fileID: 0} 147 | m_PrefabInstance: {fileID: 0} 148 | m_PrefabAsset: {fileID: 0} 149 | m_GameObject: {fileID: 3967312580591935724} 150 | m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} 151 | m_LocalPosition: {x: 0, y: 0, z: 0} 152 | m_LocalScale: {x: 1, y: 1, z: 1} 153 | m_Children: [] 154 | m_Father: {fileID: 1245948148898441782} 155 | m_RootOrder: 0 156 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 157 | m_AnchorMin: {x: 0, y: 0} 158 | m_AnchorMax: {x: 1, y: 1} 159 | m_AnchoredPosition: {x: 0, y: 0} 160 | m_SizeDelta: {x: 0, y: 0} 161 | m_Pivot: {x: 0.5, y: 0.5} 162 | --- !u!222 &7773693860768129393 163 | CanvasRenderer: 164 | m_ObjectHideFlags: 0 165 | m_CorrespondingSourceObject: {fileID: 0} 166 | m_PrefabInstance: {fileID: 0} 167 | m_PrefabAsset: {fileID: 0} 168 | m_GameObject: {fileID: 3967312580591935724} 169 | m_CullTransparentMesh: 0 170 | --- !u!114 &2457320658494291693 171 | MonoBehaviour: 172 | m_ObjectHideFlags: 0 173 | m_CorrespondingSourceObject: {fileID: 0} 174 | m_PrefabInstance: {fileID: 0} 175 | m_PrefabAsset: {fileID: 0} 176 | m_GameObject: {fileID: 3967312580591935724} 177 | m_Enabled: 1 178 | m_EditorHideFlags: 0 179 | m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} 180 | m_Name: 181 | m_EditorClassIdentifier: 182 | m_Material: {fileID: 0} 183 | m_Color: {r: 1, g: 1, b: 1, a: 1} 184 | m_RaycastTarget: 1 185 | m_Maskable: 1 186 | m_OnCullStateChanged: 187 | m_PersistentCalls: 188 | m_Calls: [] 189 | m_text: Front 190 | m_isRightToLeft: 0 191 | m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} 192 | m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} 193 | m_fontSharedMaterials: [] 194 | m_fontMaterial: {fileID: 0} 195 | m_fontMaterials: [] 196 | m_fontColor32: 197 | serializedVersion: 2 198 | rgba: 4278190080 199 | m_fontColor: {r: 0, g: 0, b: 0, a: 1} 200 | m_enableVertexGradient: 0 201 | m_colorMode: 3 202 | m_fontColorGradient: 203 | topLeft: {r: 1, g: 1, b: 1, a: 1} 204 | topRight: {r: 1, g: 1, b: 1, a: 1} 205 | bottomLeft: {r: 1, g: 1, b: 1, a: 1} 206 | bottomRight: {r: 1, g: 1, b: 1, a: 1} 207 | m_fontColorGradientPreset: {fileID: 0} 208 | m_spriteAsset: {fileID: 0} 209 | m_tintAllSprites: 0 210 | m_StyleSheet: {fileID: 0} 211 | m_TextStyleHashCode: -1183493901 212 | m_overrideHtmlColors: 0 213 | m_faceColor: 214 | serializedVersion: 2 215 | rgba: 4294967295 216 | m_fontSize: 13 217 | m_fontSizeBase: 13 218 | m_fontWeight: 400 219 | m_enableAutoSizing: 0 220 | m_fontSizeMin: 18 221 | m_fontSizeMax: 72 222 | m_fontStyle: 0 223 | m_HorizontalAlignment: 2 224 | m_VerticalAlignment: 512 225 | m_textAlignment: 65535 226 | m_characterSpacing: 0 227 | m_wordSpacing: 0 228 | m_lineSpacing: 0 229 | m_lineSpacingMax: 0 230 | m_paragraphSpacing: 0 231 | m_charWidthMaxAdj: 0 232 | m_enableWordWrapping: 1 233 | m_wordWrappingRatios: 0.4 234 | m_overflowMode: 0 235 | m_linkedTextComponent: {fileID: 0} 236 | parentLinkedComponent: {fileID: 0} 237 | m_enableKerning: 1 238 | m_enableExtraPadding: 0 239 | checkPaddingRequired: 0 240 | m_isRichText: 1 241 | m_parseCtrlCharacters: 1 242 | m_isOrthographic: 1 243 | m_isCullingEnabled: 0 244 | m_horizontalMapping: 0 245 | m_verticalMapping: 0 246 | m_uvLineOffset: 0 247 | m_geometrySortingOrder: 0 248 | m_IsTextObjectScaleStatic: 0 249 | m_VertexBufferAutoSizeReduction: 0 250 | m_useMaxVisibleDescender: 1 251 | m_pageToDisplay: 1 252 | m_margin: {x: 0, y: 0, z: 0, w: 46.387047} 253 | m_isUsingLegacyAnimationComponent: 0 254 | m_isVolumetricText: 0 255 | m_hasFontAssetChanged: 0 256 | m_baseMaterial: {fileID: 0} 257 | m_maskOffset: {x: 0, y: 0, z: 0, w: 0} 258 | --- !u!1 &3986745309421431315 259 | GameObject: 260 | m_ObjectHideFlags: 0 261 | m_CorrespondingSourceObject: {fileID: 0} 262 | m_PrefabInstance: {fileID: 0} 263 | m_PrefabAsset: {fileID: 0} 264 | serializedVersion: 6 265 | m_Component: 266 | - component: {fileID: 3658407098491778260} 267 | - component: {fileID: 6105147029748509206} 268 | - component: {fileID: 1244028421486629802} 269 | m_Layer: 0 270 | m_Name: '[DELETE THIS]' 271 | m_TagString: Untagged 272 | m_Icon: {fileID: 0} 273 | m_NavMeshLayer: 0 274 | m_StaticEditorFlags: 0 275 | m_IsActive: 1 276 | --- !u!4 &3658407098491778260 277 | Transform: 278 | m_ObjectHideFlags: 0 279 | m_CorrespondingSourceObject: {fileID: 0} 280 | m_PrefabInstance: {fileID: 0} 281 | m_PrefabAsset: {fileID: 0} 282 | m_GameObject: {fileID: 3986745309421431315} 283 | m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} 284 | m_LocalPosition: {x: 0, y: 0, z: 0} 285 | m_LocalScale: {x: 1, y: 0.5685, z: 0.025936} 286 | m_Children: 287 | - {fileID: 1245948148898441782} 288 | m_Father: {fileID: 7531146285904012144} 289 | m_RootOrder: 0 290 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 291 | --- !u!33 &6105147029748509206 292 | MeshFilter: 293 | m_ObjectHideFlags: 0 294 | m_CorrespondingSourceObject: {fileID: 0} 295 | m_PrefabInstance: {fileID: 0} 296 | m_PrefabAsset: {fileID: 0} 297 | m_GameObject: {fileID: 3986745309421431315} 298 | m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} 299 | --- !u!23 &1244028421486629802 300 | MeshRenderer: 301 | m_ObjectHideFlags: 0 302 | m_CorrespondingSourceObject: {fileID: 0} 303 | m_PrefabInstance: {fileID: 0} 304 | m_PrefabAsset: {fileID: 0} 305 | m_GameObject: {fileID: 3986745309421431315} 306 | m_Enabled: 1 307 | m_CastShadows: 1 308 | m_ReceiveShadows: 1 309 | m_DynamicOccludee: 1 310 | m_MotionVectors: 1 311 | m_LightProbeUsage: 1 312 | m_ReflectionProbeUsage: 1 313 | m_RayTracingMode: 2 314 | m_RenderingLayerMask: 1 315 | m_RendererPriority: 0 316 | m_Materials: 317 | - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} 318 | m_StaticBatchInfo: 319 | firstSubMesh: 0 320 | subMeshCount: 0 321 | m_StaticBatchRoot: {fileID: 0} 322 | m_ProbeAnchor: {fileID: 0} 323 | m_LightProbeVolumeOverride: {fileID: 0} 324 | m_ScaleInLightmap: 1 325 | m_ReceiveGI: 1 326 | m_PreserveUVs: 0 327 | m_IgnoreNormalsForChartDetection: 0 328 | m_ImportantGI: 0 329 | m_StitchLightmapSeams: 1 330 | m_SelectedEditorRenderState: 3 331 | m_MinimumChartSize: 4 332 | m_AutoUVMaxDistance: 0.5 333 | m_AutoUVMaxAngle: 89 334 | m_LightmapParameters: {fileID: 0} 335 | m_SortingLayerID: 0 336 | m_SortingLayer: 0 337 | m_SortingOrder: 0 338 | --- !u!1 &6495216020917304646 339 | GameObject: 340 | m_ObjectHideFlags: 0 341 | m_CorrespondingSourceObject: {fileID: 0} 342 | m_PrefabInstance: {fileID: 0} 343 | m_PrefabAsset: {fileID: 0} 344 | serializedVersion: 6 345 | m_Component: 346 | - component: {fileID: 1245948148898441782} 347 | - component: {fileID: 3523353780344268111} 348 | - component: {fileID: 4432120425424414615} 349 | - component: {fileID: 8966109807728725698} 350 | - component: {fileID: 3806969658428941430} 351 | - component: {fileID: 6817875292097603696} 352 | m_Layer: 0 353 | m_Name: Canvas 354 | m_TagString: Untagged 355 | m_Icon: {fileID: 0} 356 | m_NavMeshLayer: 0 357 | m_StaticEditorFlags: 0 358 | m_IsActive: 1 359 | --- !u!224 &1245948148898441782 360 | RectTransform: 361 | m_ObjectHideFlags: 0 362 | m_CorrespondingSourceObject: {fileID: 0} 363 | m_PrefabInstance: {fileID: 0} 364 | m_PrefabAsset: {fileID: 0} 365 | m_GameObject: {fileID: 6495216020917304646} 366 | m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} 367 | m_LocalPosition: {x: 0, y: 0, z: -1.0795805} 368 | m_LocalScale: {x: 0.0031973666, y: 0.0056242156, z: 0.123279095} 369 | m_Children: 370 | - {fileID: 4275710173028544777} 371 | m_Father: {fileID: 3658407098491778260} 372 | m_RootOrder: 0 373 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 374 | m_AnchorMin: {x: 0, y: 0} 375 | m_AnchorMax: {x: 0, y: 0} 376 | m_AnchoredPosition: {x: 0, y: 0} 377 | m_SizeDelta: {x: 300, y: 150} 378 | m_Pivot: {x: 0.5, y: 0.5} 379 | --- !u!223 &3523353780344268111 380 | Canvas: 381 | m_ObjectHideFlags: 0 382 | m_CorrespondingSourceObject: {fileID: 0} 383 | m_PrefabInstance: {fileID: 0} 384 | m_PrefabAsset: {fileID: 0} 385 | m_GameObject: {fileID: 6495216020917304646} 386 | m_Enabled: 1 387 | serializedVersion: 3 388 | m_RenderMode: 2 389 | m_Camera: {fileID: 0} 390 | m_PlaneDistance: 100 391 | m_PixelPerfect: 0 392 | m_ReceivesEvents: 1 393 | m_OverrideSorting: 0 394 | m_OverridePixelPerfect: 0 395 | m_SortingBucketNormalizedSize: 0 396 | m_AdditionalShaderChannelsFlag: 25 397 | m_SortingLayerID: 0 398 | m_SortingOrder: 0 399 | m_TargetDisplay: 0 400 | --- !u!114 &4432120425424414615 401 | MonoBehaviour: 402 | m_ObjectHideFlags: 0 403 | m_CorrespondingSourceObject: {fileID: 0} 404 | m_PrefabInstance: {fileID: 0} 405 | m_PrefabAsset: {fileID: 0} 406 | m_GameObject: {fileID: 6495216020917304646} 407 | m_Enabled: 1 408 | m_EditorHideFlags: 0 409 | m_Script: {fileID: 11500000, guid: 0cd44c1031e13a943bb63640046fad76, type: 3} 410 | m_Name: 411 | m_EditorClassIdentifier: 412 | m_UiScaleMode: 0 413 | m_ReferencePixelsPerUnit: 100 414 | m_ScaleFactor: 1 415 | m_ReferenceResolution: {x: 800, y: 600} 416 | m_ScreenMatchMode: 0 417 | m_MatchWidthOrHeight: 0 418 | m_PhysicalUnit: 3 419 | m_FallbackScreenDPI: 96 420 | m_DefaultSpriteDPI: 96 421 | m_DynamicPixelsPerUnit: 1 422 | --- !u!114 &8966109807728725698 423 | MonoBehaviour: 424 | m_ObjectHideFlags: 0 425 | m_CorrespondingSourceObject: {fileID: 0} 426 | m_PrefabInstance: {fileID: 0} 427 | m_PrefabAsset: {fileID: 0} 428 | m_GameObject: {fileID: 6495216020917304646} 429 | m_Enabled: 1 430 | m_EditorHideFlags: 0 431 | m_Script: {fileID: 11500000, guid: dc42784cf147c0c48a680349fa168899, type: 3} 432 | m_Name: 433 | m_EditorClassIdentifier: 434 | m_IgnoreReversedGraphics: 1 435 | m_BlockingObjects: 0 436 | m_BlockingMask: 437 | serializedVersion: 2 438 | m_Bits: 4294967295 439 | --- !u!114 &3806969658428941430 440 | MonoBehaviour: 441 | m_ObjectHideFlags: 0 442 | m_CorrespondingSourceObject: {fileID: 0} 443 | m_PrefabInstance: {fileID: 0} 444 | m_PrefabAsset: {fileID: 0} 445 | m_GameObject: {fileID: 6495216020917304646} 446 | m_Enabled: 1 447 | m_EditorHideFlags: 0 448 | m_Script: {fileID: -1533785930, guid: 661092b4961be7145bfbe56e1e62337b, type: 3} 449 | m_Name: 450 | m_EditorClassIdentifier: 451 | --- !u!65 &6817875292097603696 452 | BoxCollider: 453 | m_ObjectHideFlags: 0 454 | m_CorrespondingSourceObject: {fileID: 0} 455 | m_PrefabInstance: {fileID: 0} 456 | m_PrefabAsset: {fileID: 0} 457 | m_GameObject: {fileID: 6495216020917304646} 458 | m_Material: {fileID: 0} 459 | m_IsTrigger: 1 460 | m_Enabled: 1 461 | serializedVersion: 2 462 | m_Size: {x: 1, y: 1, z: 1} 463 | m_Center: {x: 0, y: 0, z: 0} 464 | -------------------------------------------------------------------------------- /PortablePanel.prefab.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: b7c6fcf83c505a54a9f2bb3ac2a4639b 3 | PrefabImporter: 4 | externalObjects: {} 5 | userData: 6 | assetBundleName: 7 | assetBundleVariant: 8 | -------------------------------------------------------------------------------- /Prefabs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: f2813ff6098db594cac9a86a1e986802 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Prefabs/Basic Example.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: eb4ce8dfc6cbfa841a276946a7d730b8 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Prefabs/Basic Example/GrabbablePanel.prefab: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!1 &53886571877916344 4 | GameObject: 5 | m_ObjectHideFlags: 0 6 | m_CorrespondingSourceObject: {fileID: 0} 7 | m_PrefabInstance: {fileID: 0} 8 | m_PrefabAsset: {fileID: 0} 9 | serializedVersion: 6 10 | m_Component: 11 | - component: {fileID: 537400906750518193} 12 | - component: {fileID: 9159839778344914810} 13 | - component: {fileID: 8447741667041101492} 14 | - component: {fileID: 5701201927919729780} 15 | m_Layer: 0 16 | m_Name: Button 17 | m_TagString: Untagged 18 | m_Icon: {fileID: 0} 19 | m_NavMeshLayer: 0 20 | m_StaticEditorFlags: 0 21 | m_IsActive: 1 22 | --- !u!224 &537400906750518193 23 | RectTransform: 24 | m_ObjectHideFlags: 0 25 | m_CorrespondingSourceObject: {fileID: 0} 26 | m_PrefabInstance: {fileID: 0} 27 | m_PrefabAsset: {fileID: 0} 28 | m_GameObject: {fileID: 53886571877916344} 29 | m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} 30 | m_LocalPosition: {x: 0, y: 0, z: 0} 31 | m_LocalScale: {x: 1, y: 1, z: 1} 32 | m_Children: 33 | - {fileID: 1653792799720219580} 34 | m_Father: {fileID: 1245948148898441782} 35 | m_RootOrder: 1 36 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 37 | m_AnchorMin: {x: 0.5, y: 0.5} 38 | m_AnchorMax: {x: 0.5, y: 0.5} 39 | m_AnchoredPosition: {x: 0, y: -46.6} 40 | m_SizeDelta: {x: 160, y: 30} 41 | m_Pivot: {x: 0.5, y: 0.5} 42 | --- !u!222 &9159839778344914810 43 | CanvasRenderer: 44 | m_ObjectHideFlags: 0 45 | m_CorrespondingSourceObject: {fileID: 0} 46 | m_PrefabInstance: {fileID: 0} 47 | m_PrefabAsset: {fileID: 0} 48 | m_GameObject: {fileID: 53886571877916344} 49 | m_CullTransparentMesh: 0 50 | --- !u!114 &8447741667041101492 51 | MonoBehaviour: 52 | m_ObjectHideFlags: 0 53 | m_CorrespondingSourceObject: {fileID: 0} 54 | m_PrefabInstance: {fileID: 0} 55 | m_PrefabAsset: {fileID: 0} 56 | m_GameObject: {fileID: 53886571877916344} 57 | m_Enabled: 1 58 | m_EditorHideFlags: 0 59 | m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} 60 | m_Name: 61 | m_EditorClassIdentifier: 62 | m_Material: {fileID: 0} 63 | m_Color: {r: 1, g: 1, b: 1, a: 1} 64 | m_RaycastTarget: 1 65 | m_Maskable: 1 66 | m_OnCullStateChanged: 67 | m_PersistentCalls: 68 | m_Calls: [] 69 | m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} 70 | m_Type: 1 71 | m_PreserveAspect: 0 72 | m_FillCenter: 1 73 | m_FillMethod: 4 74 | m_FillAmount: 1 75 | m_FillClockwise: 1 76 | m_FillOrigin: 0 77 | m_UseSpriteMesh: 0 78 | m_PixelsPerUnitMultiplier: 1 79 | --- !u!114 &5701201927919729780 80 | MonoBehaviour: 81 | m_ObjectHideFlags: 0 82 | m_CorrespondingSourceObject: {fileID: 0} 83 | m_PrefabInstance: {fileID: 0} 84 | m_PrefabAsset: {fileID: 0} 85 | m_GameObject: {fileID: 53886571877916344} 86 | m_Enabled: 1 87 | m_EditorHideFlags: 0 88 | m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} 89 | m_Name: 90 | m_EditorClassIdentifier: 91 | m_Navigation: 92 | m_Mode: 3 93 | m_SelectOnUp: {fileID: 0} 94 | m_SelectOnDown: {fileID: 0} 95 | m_SelectOnLeft: {fileID: 0} 96 | m_SelectOnRight: {fileID: 0} 97 | m_Transition: 1 98 | m_Colors: 99 | m_NormalColor: {r: 1, g: 1, b: 1, a: 1} 100 | m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} 101 | m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} 102 | m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} 103 | m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} 104 | m_ColorMultiplier: 1 105 | m_FadeDuration: 0.1 106 | m_SpriteState: 107 | m_HighlightedSprite: {fileID: 0} 108 | m_PressedSprite: {fileID: 0} 109 | m_SelectedSprite: {fileID: 0} 110 | m_DisabledSprite: {fileID: 0} 111 | m_AnimationTriggers: 112 | m_NormalTrigger: Normal 113 | m_HighlightedTrigger: Highlighted 114 | m_PressedTrigger: Pressed 115 | m_SelectedTrigger: Selected 116 | m_DisabledTrigger: Disabled 117 | m_Interactable: 1 118 | m_TargetGraphic: {fileID: 8447741667041101492} 119 | m_OnClick: 120 | m_PersistentCalls: 121 | m_Calls: 122 | - m_Target: {fileID: 8874036614593792104} 123 | m_MethodName: SendCustomEvent 124 | m_Mode: 5 125 | m_Arguments: 126 | m_ObjectArgument: {fileID: 0} 127 | m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine 128 | m_IntArgument: 0 129 | m_FloatArgument: 0 130 | m_StringArgument: ForceClosePanel 131 | m_BoolArgument: 0 132 | m_CallState: 2 133 | --- !u!1 &1216727722377721200 134 | GameObject: 135 | m_ObjectHideFlags: 0 136 | m_CorrespondingSourceObject: {fileID: 0} 137 | m_PrefabInstance: {fileID: 0} 138 | m_PrefabAsset: {fileID: 0} 139 | serializedVersion: 6 140 | m_Component: 141 | - component: {fileID: 7531146285904012144} 142 | m_Layer: 0 143 | m_Name: ExamplePanel 144 | m_TagString: Untagged 145 | m_Icon: {fileID: 0} 146 | m_NavMeshLayer: 0 147 | m_StaticEditorFlags: 0 148 | m_IsActive: 1 149 | --- !u!4 &7531146285904012144 150 | Transform: 151 | m_ObjectHideFlags: 0 152 | m_CorrespondingSourceObject: {fileID: 0} 153 | m_PrefabInstance: {fileID: 0} 154 | m_PrefabAsset: {fileID: 0} 155 | m_GameObject: {fileID: 1216727722377721200} 156 | m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} 157 | m_LocalPosition: {x: 0, y: 0, z: 0} 158 | m_LocalScale: {x: 1, y: 1, z: 1} 159 | m_Children: 160 | - {fileID: 3658407098491778260} 161 | - {fileID: 1245948148898441782} 162 | m_Father: {fileID: 8659203161166647251} 163 | m_RootOrder: 0 164 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 165 | --- !u!1 &3258420194863700279 166 | GameObject: 167 | m_ObjectHideFlags: 0 168 | m_CorrespondingSourceObject: {fileID: 0} 169 | m_PrefabInstance: {fileID: 0} 170 | m_PrefabAsset: {fileID: 0} 171 | serializedVersion: 6 172 | m_Component: 173 | - component: {fileID: 8659203161166647251} 174 | - component: {fileID: 7443599571650023776} 175 | - component: {fileID: 8874036614593792104} 176 | m_Layer: 0 177 | m_Name: GrabbablePanel 178 | m_TagString: Untagged 179 | m_Icon: {fileID: 0} 180 | m_NavMeshLayer: 0 181 | m_StaticEditorFlags: 0 182 | m_IsActive: 1 183 | --- !u!4 &8659203161166647251 184 | Transform: 185 | m_ObjectHideFlags: 0 186 | m_CorrespondingSourceObject: {fileID: 0} 187 | m_PrefabInstance: {fileID: 0} 188 | m_PrefabAsset: {fileID: 0} 189 | m_GameObject: {fileID: 3258420194863700279} 190 | m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} 191 | m_LocalPosition: {x: 0, y: 0, z: 0} 192 | m_LocalScale: {x: 1, y: 1, z: 1} 193 | m_Children: 194 | - {fileID: 7531146285904012144} 195 | m_Father: {fileID: 0} 196 | m_RootOrder: 0 197 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 198 | --- !u!114 &7443599571650023776 199 | MonoBehaviour: 200 | m_ObjectHideFlags: 0 201 | m_CorrespondingSourceObject: {fileID: 0} 202 | m_PrefabInstance: {fileID: 0} 203 | m_PrefabAsset: {fileID: 0} 204 | m_GameObject: {fileID: 3258420194863700279} 205 | m_Enabled: 1 206 | m_EditorHideFlags: 0 207 | m_Script: {fileID: 11500000, guid: 6c16e461e59a5a340a22f538d64095e8, type: 3} 208 | m_Name: 209 | m_EditorClassIdentifier: 210 | serializationData: 211 | SerializedFormat: 2 212 | SerializedBytes: 213 | ReferencedUnityObjects: [] 214 | SerializedBytesString: 215 | Prefab: {fileID: 0} 216 | PrefabModificationsReferencedUnityObjects: [] 217 | PrefabModifications: [] 218 | SerializationNodes: [] 219 | _udonSharpBackingUdonBehaviour: {fileID: 8874036614593792104} 220 | Panel: {fileID: 1216727722377721200} 221 | TabOnHold: 1 222 | GestureMode: 0 223 | GrabbablePanel: 1 224 | MaxScale: 3 225 | MinScale: 0.1 226 | MaxDistanceBeforeClosingThePanel: 2 227 | PanelScaleOnDesktop: 0.5 228 | ScaleAndDistanceRelativeToAvatarScale: 1 229 | --- !u!114 &8874036614593792104 230 | MonoBehaviour: 231 | m_ObjectHideFlags: 0 232 | m_CorrespondingSourceObject: {fileID: 0} 233 | m_PrefabInstance: {fileID: 0} 234 | m_PrefabAsset: {fileID: 0} 235 | m_GameObject: {fileID: 3258420194863700279} 236 | m_Enabled: 1 237 | m_EditorHideFlags: 0 238 | m_Script: {fileID: 11500000, guid: 45115577ef41a5b4ca741ed302693907, type: 3} 239 | m_Name: 240 | m_EditorClassIdentifier: 241 | interactTextPlacement: {fileID: 0} 242 | interactText: Use 243 | interactTextGO: {fileID: 0} 244 | proximity: 2 245 | SynchronizePosition: 0 246 | AllowCollisionOwnershipTransfer: 0 247 | Reliable: 0 248 | _syncMethod: 1 249 | serializedProgramAsset: {fileID: 11400000, guid: fc0a2d339cee7da4d9d94b4b65d2d2d1, 250 | type: 2} 251 | programSource: {fileID: 11400000, guid: 16f82f9ec93c4be49951c5183c885032, type: 2} 252 | serializedPublicVariablesBytesString: Ai8AAAAAATIAAABWAFIAQwAuAFUAZABvAG4ALgBDAG8AbQBtAG8AbgAuAFUAZABvAG4AVgBhAHIAaQBhAGIAbABlAFQAYQBiAGwAZQAsACAAVgBSAEMALgBVAGQAbwBuAC4AQwBvAG0AbQBvAG4AAAAAAAYBAAAAAAAAACcBBAAAAHQAeQBwAGUAAWgAAABTAHkAcwB0AGUAbQAuAEMAbwBsAGwAZQBjAHQAaQBvAG4AcwAuAEcAZQBuAGUAcgBpAGMALgBMAGkAcwB0AGAAMQBbAFsAVgBSAEMALgBVAGQAbwBuAC4AQwBvAG0AbQBvAG4ALgBJAG4AdABlAHIAZgBhAGMAZQBzAC4ASQBVAGQAbwBuAFYAYQByAGkAYQBiAGwAZQAsACAAVgBSAEMALgBVAGQAbwBuAC4AQwBvAG0AbQBvAG4AXQBdACwAIABtAHMAYwBvAHIAbABpAGIAAQEJAAAAVgBhAHIAaQBhAGIAbABlAHMALwEAAAABaAAAAFMAeQBzAHQAZQBtAC4AQwBvAGwAbABlAGMAdABpAG8AbgBzAC4ARwBlAG4AZQByAGkAYwAuAEwAaQBzAHQAYAAxAFsAWwBWAFIAQwAuAFUAZABvAG4ALgBDAG8AbQBtAG8AbgAuAEkAbgB0AGUAcgBmAGEAYwBlAHMALgBJAFUAZABvAG4AVgBhAHIAaQBhAGIAbABlACwAIABWAFIAQwAuAFUAZABvAG4ALgBDAG8AbQBtAG8AbgBdAF0ALAAgAG0AcwBjAG8AcgBsAGkAYgABAAAABgEAAAAAAAAAAi8CAAAAAUkAAABWAFIAQwAuAFUAZABvAG4ALgBDAG8AbQBtAG8AbgAuAFUAZABvAG4AVgBhAHIAaQBhAGIAbABlAGAAMQBbAFsAUwB5AHMAdABlAG0ALgBJAG4AdAAzADIALAAgAG0AcwBjAG8AcgBsAGkAYgBdAF0ALAAgAFYAUgBDAC4AVQBkAG8AbgAuAEMAbwBtAG0AbwBuAAIAAAAGAgAAAAAAAAAnAQQAAAB0AHkAcABlAAEXAAAAUwB5AHMAdABlAG0ALgBTAHQAcgBpAG4AZwAsACAAbQBzAGMAbwByAGwAaQBiACcBCgAAAFMAeQBtAGIAbwBsAE4AYQBtAGUAAR8AAABfAF8AXwBVAGQAbwBuAFMAaABhAHIAcABCAGUAaABhAHYAaQBvAHUAcgBWAGUAcgBzAGkAbwBuAF8AXwBfACcBBAAAAHQAeQBwAGUAARYAAABTAHkAcwB0AGUAbQAuAEkAbgB0ADMAMgAsACAAbQBzAGMAbwByAGwAaQBiABcBBQAAAFYAYQBsAHUAZQACAAAABwUHBQcF 253 | publicVariablesUnityEngineObjects: [] 254 | publicVariablesSerializationDataFormat: 0 255 | --- !u!1 &3967312580591935724 256 | GameObject: 257 | m_ObjectHideFlags: 0 258 | m_CorrespondingSourceObject: {fileID: 0} 259 | m_PrefabInstance: {fileID: 0} 260 | m_PrefabAsset: {fileID: 0} 261 | serializedVersion: 6 262 | m_Component: 263 | - component: {fileID: 4275710173028544777} 264 | - component: {fileID: 7773693860768129393} 265 | - component: {fileID: 2457320658494291693} 266 | m_Layer: 0 267 | m_Name: Text (TMP) 268 | m_TagString: Untagged 269 | m_Icon: {fileID: 0} 270 | m_NavMeshLayer: 0 271 | m_StaticEditorFlags: 0 272 | m_IsActive: 1 273 | --- !u!224 &4275710173028544777 274 | RectTransform: 275 | m_ObjectHideFlags: 0 276 | m_CorrespondingSourceObject: {fileID: 0} 277 | m_PrefabInstance: {fileID: 0} 278 | m_PrefabAsset: {fileID: 0} 279 | m_GameObject: {fileID: 3967312580591935724} 280 | m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} 281 | m_LocalPosition: {x: 0, y: 0, z: 0} 282 | m_LocalScale: {x: 1, y: 1, z: 1} 283 | m_Children: [] 284 | m_Father: {fileID: 1245948148898441782} 285 | m_RootOrder: 0 286 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 287 | m_AnchorMin: {x: 0, y: 0} 288 | m_AnchorMax: {x: 1, y: 1} 289 | m_AnchoredPosition: {x: 0, y: 0} 290 | m_SizeDelta: {x: 0, y: 0} 291 | m_Pivot: {x: 0.5, y: 0.5} 292 | --- !u!222 &7773693860768129393 293 | CanvasRenderer: 294 | m_ObjectHideFlags: 0 295 | m_CorrespondingSourceObject: {fileID: 0} 296 | m_PrefabInstance: {fileID: 0} 297 | m_PrefabAsset: {fileID: 0} 298 | m_GameObject: {fileID: 3967312580591935724} 299 | m_CullTransparentMesh: 0 300 | --- !u!114 &2457320658494291693 301 | MonoBehaviour: 302 | m_ObjectHideFlags: 0 303 | m_CorrespondingSourceObject: {fileID: 0} 304 | m_PrefabInstance: {fileID: 0} 305 | m_PrefabAsset: {fileID: 0} 306 | m_GameObject: {fileID: 3967312580591935724} 307 | m_Enabled: 1 308 | m_EditorHideFlags: 0 309 | m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} 310 | m_Name: 311 | m_EditorClassIdentifier: 312 | m_Material: {fileID: 0} 313 | m_Color: {r: 1, g: 1, b: 1, a: 1} 314 | m_RaycastTarget: 1 315 | m_Maskable: 1 316 | m_OnCullStateChanged: 317 | m_PersistentCalls: 318 | m_Calls: [] 319 | m_text: Here is some text, you can put anything you want on this panel. 320 | m_isRightToLeft: 0 321 | m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} 322 | m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} 323 | m_fontSharedMaterials: [] 324 | m_fontMaterial: {fileID: 0} 325 | m_fontMaterials: [] 326 | m_fontColor32: 327 | serializedVersion: 2 328 | rgba: 4278190080 329 | m_fontColor: {r: 0, g: 0, b: 0, a: 1} 330 | m_enableVertexGradient: 0 331 | m_colorMode: 3 332 | m_fontColorGradient: 333 | topLeft: {r: 1, g: 1, b: 1, a: 1} 334 | topRight: {r: 1, g: 1, b: 1, a: 1} 335 | bottomLeft: {r: 1, g: 1, b: 1, a: 1} 336 | bottomRight: {r: 1, g: 1, b: 1, a: 1} 337 | m_fontColorGradientPreset: {fileID: 0} 338 | m_spriteAsset: {fileID: 0} 339 | m_tintAllSprites: 0 340 | m_StyleSheet: {fileID: 0} 341 | m_TextStyleHashCode: -1183493901 342 | m_overrideHtmlColors: 0 343 | m_faceColor: 344 | serializedVersion: 2 345 | rgba: 4294967295 346 | m_fontSize: 13 347 | m_fontSizeBase: 13 348 | m_fontWeight: 400 349 | m_enableAutoSizing: 0 350 | m_fontSizeMin: 18 351 | m_fontSizeMax: 72 352 | m_fontStyle: 0 353 | m_HorizontalAlignment: 1 354 | m_VerticalAlignment: 256 355 | m_textAlignment: 65535 356 | m_characterSpacing: 0 357 | m_wordSpacing: 0 358 | m_lineSpacing: 0 359 | m_lineSpacingMax: 0 360 | m_paragraphSpacing: 0 361 | m_charWidthMaxAdj: 0 362 | m_enableWordWrapping: 1 363 | m_wordWrappingRatios: 0.4 364 | m_overflowMode: 0 365 | m_linkedTextComponent: {fileID: 0} 366 | parentLinkedComponent: {fileID: 0} 367 | m_enableKerning: 1 368 | m_enableExtraPadding: 0 369 | checkPaddingRequired: 0 370 | m_isRichText: 1 371 | m_parseCtrlCharacters: 1 372 | m_isOrthographic: 1 373 | m_isCullingEnabled: 0 374 | m_horizontalMapping: 0 375 | m_verticalMapping: 0 376 | m_uvLineOffset: 0 377 | m_geometrySortingOrder: 0 378 | m_IsTextObjectScaleStatic: 0 379 | m_VertexBufferAutoSizeReduction: 0 380 | m_useMaxVisibleDescender: 1 381 | m_pageToDisplay: 1 382 | m_margin: {x: 0, y: 0, z: 0, w: 46.387047} 383 | m_isUsingLegacyAnimationComponent: 0 384 | m_isVolumetricText: 0 385 | m_hasFontAssetChanged: 0 386 | m_baseMaterial: {fileID: 0} 387 | m_maskOffset: {x: 0, y: 0, z: 0, w: 0} 388 | --- !u!1 &3986745309421431315 389 | GameObject: 390 | m_ObjectHideFlags: 0 391 | m_CorrespondingSourceObject: {fileID: 0} 392 | m_PrefabInstance: {fileID: 0} 393 | m_PrefabAsset: {fileID: 0} 394 | serializedVersion: 6 395 | m_Component: 396 | - component: {fileID: 3658407098491778260} 397 | - component: {fileID: 6105147029748509206} 398 | - component: {fileID: 1244028421486629802} 399 | m_Layer: 0 400 | m_Name: DefaultUnityCube 401 | m_TagString: Untagged 402 | m_Icon: {fileID: 0} 403 | m_NavMeshLayer: 0 404 | m_StaticEditorFlags: 0 405 | m_IsActive: 1 406 | --- !u!4 &3658407098491778260 407 | Transform: 408 | m_ObjectHideFlags: 0 409 | m_CorrespondingSourceObject: {fileID: 0} 410 | m_PrefabInstance: {fileID: 0} 411 | m_PrefabAsset: {fileID: 0} 412 | m_GameObject: {fileID: 3986745309421431315} 413 | m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} 414 | m_LocalPosition: {x: 0, y: 0, z: 0} 415 | m_LocalScale: {x: 1, y: 0.5685, z: 0.025936} 416 | m_Children: [] 417 | m_Father: {fileID: 7531146285904012144} 418 | m_RootOrder: 0 419 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 420 | --- !u!33 &6105147029748509206 421 | MeshFilter: 422 | m_ObjectHideFlags: 0 423 | m_CorrespondingSourceObject: {fileID: 0} 424 | m_PrefabInstance: {fileID: 0} 425 | m_PrefabAsset: {fileID: 0} 426 | m_GameObject: {fileID: 3986745309421431315} 427 | m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} 428 | --- !u!23 &1244028421486629802 429 | MeshRenderer: 430 | m_ObjectHideFlags: 0 431 | m_CorrespondingSourceObject: {fileID: 0} 432 | m_PrefabInstance: {fileID: 0} 433 | m_PrefabAsset: {fileID: 0} 434 | m_GameObject: {fileID: 3986745309421431315} 435 | m_Enabled: 1 436 | m_CastShadows: 1 437 | m_ReceiveShadows: 1 438 | m_DynamicOccludee: 1 439 | m_MotionVectors: 1 440 | m_LightProbeUsage: 1 441 | m_ReflectionProbeUsage: 1 442 | m_RayTracingMode: 2 443 | m_RenderingLayerMask: 1 444 | m_RendererPriority: 0 445 | m_Materials: 446 | - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} 447 | m_StaticBatchInfo: 448 | firstSubMesh: 0 449 | subMeshCount: 0 450 | m_StaticBatchRoot: {fileID: 0} 451 | m_ProbeAnchor: {fileID: 0} 452 | m_LightProbeVolumeOverride: {fileID: 0} 453 | m_ScaleInLightmap: 1 454 | m_ReceiveGI: 1 455 | m_PreserveUVs: 0 456 | m_IgnoreNormalsForChartDetection: 0 457 | m_ImportantGI: 0 458 | m_StitchLightmapSeams: 1 459 | m_SelectedEditorRenderState: 3 460 | m_MinimumChartSize: 4 461 | m_AutoUVMaxDistance: 0.5 462 | m_AutoUVMaxAngle: 89 463 | m_LightmapParameters: {fileID: 0} 464 | m_SortingLayerID: 0 465 | m_SortingLayer: 0 466 | m_SortingOrder: 0 467 | --- !u!1 &6495216020917304646 468 | GameObject: 469 | m_ObjectHideFlags: 0 470 | m_CorrespondingSourceObject: {fileID: 0} 471 | m_PrefabInstance: {fileID: 0} 472 | m_PrefabAsset: {fileID: 0} 473 | serializedVersion: 6 474 | m_Component: 475 | - component: {fileID: 1245948148898441782} 476 | - component: {fileID: 3523353780344268111} 477 | - component: {fileID: 4432120425424414615} 478 | - component: {fileID: 8966109807728725698} 479 | - component: {fileID: 3806969658428941430} 480 | - component: {fileID: 6817875292097603696} 481 | m_Layer: 0 482 | m_Name: Canvas 483 | m_TagString: Untagged 484 | m_Icon: {fileID: 0} 485 | m_NavMeshLayer: 0 486 | m_StaticEditorFlags: 0 487 | m_IsActive: 1 488 | --- !u!224 &1245948148898441782 489 | RectTransform: 490 | m_ObjectHideFlags: 0 491 | m_CorrespondingSourceObject: {fileID: 0} 492 | m_PrefabInstance: {fileID: 0} 493 | m_PrefabAsset: {fileID: 0} 494 | m_GameObject: {fileID: 6495216020917304646} 495 | m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} 496 | m_LocalPosition: {x: 0, y: 0, z: -0.028} 497 | m_LocalScale: {x: 0.0031973666, y: 0.0031973666, z: 0.0031973666} 498 | m_Children: 499 | - {fileID: 4275710173028544777} 500 | - {fileID: 537400906750518193} 501 | m_Father: {fileID: 7531146285904012144} 502 | m_RootOrder: 1 503 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 504 | m_AnchorMin: {x: 0, y: 0} 505 | m_AnchorMax: {x: 0, y: 0} 506 | m_AnchoredPosition: {x: 0, y: 0} 507 | m_SizeDelta: {x: 300, y: 150} 508 | m_Pivot: {x: 0.5, y: 0.5} 509 | --- !u!223 &3523353780344268111 510 | Canvas: 511 | m_ObjectHideFlags: 0 512 | m_CorrespondingSourceObject: {fileID: 0} 513 | m_PrefabInstance: {fileID: 0} 514 | m_PrefabAsset: {fileID: 0} 515 | m_GameObject: {fileID: 6495216020917304646} 516 | m_Enabled: 1 517 | serializedVersion: 3 518 | m_RenderMode: 2 519 | m_Camera: {fileID: 0} 520 | m_PlaneDistance: 100 521 | m_PixelPerfect: 0 522 | m_ReceivesEvents: 1 523 | m_OverrideSorting: 0 524 | m_OverridePixelPerfect: 0 525 | m_SortingBucketNormalizedSize: 0 526 | m_AdditionalShaderChannelsFlag: 25 527 | m_SortingLayerID: 0 528 | m_SortingOrder: 0 529 | m_TargetDisplay: 0 530 | --- !u!114 &4432120425424414615 531 | MonoBehaviour: 532 | m_ObjectHideFlags: 0 533 | m_CorrespondingSourceObject: {fileID: 0} 534 | m_PrefabInstance: {fileID: 0} 535 | m_PrefabAsset: {fileID: 0} 536 | m_GameObject: {fileID: 6495216020917304646} 537 | m_Enabled: 1 538 | m_EditorHideFlags: 0 539 | m_Script: {fileID: 11500000, guid: 0cd44c1031e13a943bb63640046fad76, type: 3} 540 | m_Name: 541 | m_EditorClassIdentifier: 542 | m_UiScaleMode: 0 543 | m_ReferencePixelsPerUnit: 100 544 | m_ScaleFactor: 1 545 | m_ReferenceResolution: {x: 800, y: 600} 546 | m_ScreenMatchMode: 0 547 | m_MatchWidthOrHeight: 0 548 | m_PhysicalUnit: 3 549 | m_FallbackScreenDPI: 96 550 | m_DefaultSpriteDPI: 96 551 | m_DynamicPixelsPerUnit: 1 552 | --- !u!114 &8966109807728725698 553 | MonoBehaviour: 554 | m_ObjectHideFlags: 0 555 | m_CorrespondingSourceObject: {fileID: 0} 556 | m_PrefabInstance: {fileID: 0} 557 | m_PrefabAsset: {fileID: 0} 558 | m_GameObject: {fileID: 6495216020917304646} 559 | m_Enabled: 1 560 | m_EditorHideFlags: 0 561 | m_Script: {fileID: 11500000, guid: dc42784cf147c0c48a680349fa168899, type: 3} 562 | m_Name: 563 | m_EditorClassIdentifier: 564 | m_IgnoreReversedGraphics: 1 565 | m_BlockingObjects: 0 566 | m_BlockingMask: 567 | serializedVersion: 2 568 | m_Bits: 4294967295 569 | --- !u!114 &3806969658428941430 570 | MonoBehaviour: 571 | m_ObjectHideFlags: 0 572 | m_CorrespondingSourceObject: {fileID: 0} 573 | m_PrefabInstance: {fileID: 0} 574 | m_PrefabAsset: {fileID: 0} 575 | m_GameObject: {fileID: 6495216020917304646} 576 | m_Enabled: 1 577 | m_EditorHideFlags: 0 578 | m_Script: {fileID: -1533785930, guid: 661092b4961be7145bfbe56e1e62337b, type: 3} 579 | m_Name: 580 | m_EditorClassIdentifier: 581 | --- !u!65 &6817875292097603696 582 | BoxCollider: 583 | m_ObjectHideFlags: 0 584 | m_CorrespondingSourceObject: {fileID: 0} 585 | m_PrefabInstance: {fileID: 0} 586 | m_PrefabAsset: {fileID: 0} 587 | m_GameObject: {fileID: 6495216020917304646} 588 | m_Material: {fileID: 0} 589 | m_IsTrigger: 1 590 | m_Enabled: 1 591 | serializedVersion: 2 592 | m_Size: {x: 1, y: 1, z: 1} 593 | m_Center: {x: 0, y: 0, z: 0} 594 | --- !u!1 &7819706150360753042 595 | GameObject: 596 | m_ObjectHideFlags: 0 597 | m_CorrespondingSourceObject: {fileID: 0} 598 | m_PrefabInstance: {fileID: 0} 599 | m_PrefabAsset: {fileID: 0} 600 | serializedVersion: 6 601 | m_Component: 602 | - component: {fileID: 1653792799720219580} 603 | - component: {fileID: 4775611848043226693} 604 | - component: {fileID: 7359767810667744111} 605 | m_Layer: 0 606 | m_Name: Text (TMP) 607 | m_TagString: Untagged 608 | m_Icon: {fileID: 0} 609 | m_NavMeshLayer: 0 610 | m_StaticEditorFlags: 0 611 | m_IsActive: 1 612 | --- !u!224 &1653792799720219580 613 | RectTransform: 614 | m_ObjectHideFlags: 0 615 | m_CorrespondingSourceObject: {fileID: 0} 616 | m_PrefabInstance: {fileID: 0} 617 | m_PrefabAsset: {fileID: 0} 618 | m_GameObject: {fileID: 7819706150360753042} 619 | m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} 620 | m_LocalPosition: {x: 0, y: 0, z: 0} 621 | m_LocalScale: {x: 1, y: 1, z: 1} 622 | m_Children: [] 623 | m_Father: {fileID: 537400906750518193} 624 | m_RootOrder: 0 625 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 626 | m_AnchorMin: {x: 0, y: 0} 627 | m_AnchorMax: {x: 1, y: 1} 628 | m_AnchoredPosition: {x: 0, y: 0} 629 | m_SizeDelta: {x: 0, y: 0} 630 | m_Pivot: {x: 0.5, y: 0.5} 631 | --- !u!222 &4775611848043226693 632 | CanvasRenderer: 633 | m_ObjectHideFlags: 0 634 | m_CorrespondingSourceObject: {fileID: 0} 635 | m_PrefabInstance: {fileID: 0} 636 | m_PrefabAsset: {fileID: 0} 637 | m_GameObject: {fileID: 7819706150360753042} 638 | m_CullTransparentMesh: 0 639 | --- !u!114 &7359767810667744111 640 | MonoBehaviour: 641 | m_ObjectHideFlags: 0 642 | m_CorrespondingSourceObject: {fileID: 0} 643 | m_PrefabInstance: {fileID: 0} 644 | m_PrefabAsset: {fileID: 0} 645 | m_GameObject: {fileID: 7819706150360753042} 646 | m_Enabled: 1 647 | m_EditorHideFlags: 0 648 | m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} 649 | m_Name: 650 | m_EditorClassIdentifier: 651 | m_Material: {fileID: 0} 652 | m_Color: {r: 1, g: 1, b: 1, a: 1} 653 | m_RaycastTarget: 1 654 | m_Maskable: 1 655 | m_OnCullStateChanged: 656 | m_PersistentCalls: 657 | m_Calls: [] 658 | m_text: Manually Close panel 659 | m_isRightToLeft: 0 660 | m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} 661 | m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} 662 | m_fontSharedMaterials: [] 663 | m_fontMaterial: {fileID: 0} 664 | m_fontMaterials: [] 665 | m_fontColor32: 666 | serializedVersion: 2 667 | rgba: 4281479730 668 | m_fontColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} 669 | m_enableVertexGradient: 0 670 | m_colorMode: 3 671 | m_fontColorGradient: 672 | topLeft: {r: 1, g: 1, b: 1, a: 1} 673 | topRight: {r: 1, g: 1, b: 1, a: 1} 674 | bottomLeft: {r: 1, g: 1, b: 1, a: 1} 675 | bottomRight: {r: 1, g: 1, b: 1, a: 1} 676 | m_fontColorGradientPreset: {fileID: 0} 677 | m_spriteAsset: {fileID: 0} 678 | m_tintAllSprites: 0 679 | m_StyleSheet: {fileID: 0} 680 | m_TextStyleHashCode: -1183493901 681 | m_overrideHtmlColors: 0 682 | m_faceColor: 683 | serializedVersion: 2 684 | rgba: 4294967295 685 | m_fontSize: 14 686 | m_fontSizeBase: 14 687 | m_fontWeight: 400 688 | m_enableAutoSizing: 0 689 | m_fontSizeMin: 18 690 | m_fontSizeMax: 72 691 | m_fontStyle: 0 692 | m_HorizontalAlignment: 2 693 | m_VerticalAlignment: 512 694 | m_textAlignment: 65535 695 | m_characterSpacing: 0 696 | m_wordSpacing: 0 697 | m_lineSpacing: 0 698 | m_lineSpacingMax: 0 699 | m_paragraphSpacing: 0 700 | m_charWidthMaxAdj: 0 701 | m_enableWordWrapping: 1 702 | m_wordWrappingRatios: 0.4 703 | m_overflowMode: 0 704 | m_linkedTextComponent: {fileID: 0} 705 | parentLinkedComponent: {fileID: 0} 706 | m_enableKerning: 1 707 | m_enableExtraPadding: 0 708 | checkPaddingRequired: 0 709 | m_isRichText: 1 710 | m_parseCtrlCharacters: 1 711 | m_isOrthographic: 1 712 | m_isCullingEnabled: 0 713 | m_horizontalMapping: 0 714 | m_verticalMapping: 0 715 | m_uvLineOffset: 0 716 | m_geometrySortingOrder: 0 717 | m_IsTextObjectScaleStatic: 0 718 | m_VertexBufferAutoSizeReduction: 0 719 | m_useMaxVisibleDescender: 1 720 | m_pageToDisplay: 1 721 | m_margin: {x: 0, y: 0, z: 0, w: 0} 722 | m_isUsingLegacyAnimationComponent: 0 723 | m_isVolumetricText: 0 724 | m_hasFontAssetChanged: 0 725 | m_baseMaterial: {fileID: 0} 726 | m_maskOffset: {x: 0, y: 0, z: 0, w: 0} 727 | -------------------------------------------------------------------------------- /Prefabs/Basic Example/GrabbablePanel.prefab.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 32bdb4d8033651d4aa78033954acf402 3 | PrefabImporter: 4 | externalObjects: {} 5 | userData: 6 | assetBundleName: 7 | assetBundleVariant: 8 | -------------------------------------------------------------------------------- /Prefabs/RigidBody Example.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 08f7fb93097373541a085b4ae9801228 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Prefabs/RigidBody Example/GrabbablePanelWithRigidBody.prefab.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: b1aca452d1c9aa049b7054fb8b1eafdd 3 | PrefabImporter: 4 | externalObjects: {} 5 | userData: 6 | assetBundleName: 7 | assetBundleVariant: 8 | -------------------------------------------------------------------------------- /Prefabs/RigidBody Example/Panel Material.mat: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!21 &2100000 4 | Material: 5 | serializedVersion: 6 6 | m_ObjectHideFlags: 0 7 | m_CorrespondingSourceObject: {fileID: 0} 8 | m_PrefabInstance: {fileID: 0} 9 | m_PrefabAsset: {fileID: 0} 10 | m_Name: Panel Material 11 | m_Shader: {fileID: 10755, guid: 0000000000000000f000000000000000, type: 0} 12 | m_ShaderKeywords: 13 | m_LightmapFlags: 4 14 | m_EnableInstancingVariants: 0 15 | m_DoubleSidedGI: 0 16 | m_CustomRenderQueue: -1 17 | stringTagMap: {} 18 | disabledShaderPasses: [] 19 | m_SavedProperties: 20 | serializedVersion: 3 21 | m_TexEnvs: 22 | - _BumpMap: 23 | m_Texture: {fileID: 0} 24 | m_Scale: {x: 1, y: 1} 25 | m_Offset: {x: 0, y: 0} 26 | - _DetailAlbedoMap: 27 | m_Texture: {fileID: 0} 28 | m_Scale: {x: 1, y: 1} 29 | m_Offset: {x: 0, y: 0} 30 | - _DetailMask: 31 | m_Texture: {fileID: 0} 32 | m_Scale: {x: 1, y: 1} 33 | m_Offset: {x: 0, y: 0} 34 | - _DetailNormalMap: 35 | m_Texture: {fileID: 0} 36 | m_Scale: {x: 1, y: 1} 37 | m_Offset: {x: 0, y: 0} 38 | - _EmissionMap: 39 | m_Texture: {fileID: 0} 40 | m_Scale: {x: 1, y: 1} 41 | m_Offset: {x: 0, y: 0} 42 | - _MainTex: 43 | m_Texture: {fileID: 0} 44 | m_Scale: {x: 1, y: 1} 45 | m_Offset: {x: 0, y: 0} 46 | - _MetallicGlossMap: 47 | m_Texture: {fileID: 0} 48 | m_Scale: {x: 1, y: 1} 49 | m_Offset: {x: 0, y: 0} 50 | - _OcclusionMap: 51 | m_Texture: {fileID: 0} 52 | m_Scale: {x: 1, y: 1} 53 | m_Offset: {x: 0, y: 0} 54 | - _ParallaxMap: 55 | m_Texture: {fileID: 0} 56 | m_Scale: {x: 1, y: 1} 57 | m_Offset: {x: 0, y: 0} 58 | m_Floats: 59 | - _BumpScale: 1 60 | - _Cutoff: 0.5 61 | - _DetailNormalMapScale: 1 62 | - _DstBlend: 0 63 | - _GlossMapScale: 1 64 | - _Glossiness: 0.5 65 | - _GlossyReflections: 1 66 | - _Metallic: 0 67 | - _Mode: 0 68 | - _OcclusionStrength: 1 69 | - _Parallax: 0.02 70 | - _SmoothnessTextureChannel: 0 71 | - _SpecularHighlights: 1 72 | - _SrcBlend: 1 73 | - _UVSec: 0 74 | - _ZWrite: 1 75 | m_Colors: 76 | - _Color: {r: 1, g: 1, b: 1, a: 1} 77 | - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} 78 | -------------------------------------------------------------------------------- /Prefabs/RigidBody Example/Panel Material.mat.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 42df86af825c49a46978f0086ae11ae4 3 | NativeFormatImporter: 4 | externalObjects: {} 5 | mainObjectFileID: 2100000 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Prefabs/RigidBody Example/PanelParticleMaterial.mat: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!21 &2100000 4 | Material: 5 | serializedVersion: 8 6 | m_ObjectHideFlags: 0 7 | m_CorrespondingSourceObject: {fileID: 0} 8 | m_PrefabInstance: {fileID: 0} 9 | m_PrefabAsset: {fileID: 0} 10 | m_Name: PanelParticleMaterial 11 | m_Shader: {fileID: 211, guid: 0000000000000000f000000000000000, type: 0} 12 | m_Parent: {fileID: 0} 13 | m_ModifiedSerializedProperties: 0 14 | m_ValidKeywords: 15 | - _ALPHABLEND_ON 16 | - _COLORADDSUBDIFF_ON 17 | m_InvalidKeywords: [] 18 | m_LightmapFlags: 0 19 | m_EnableInstancingVariants: 0 20 | m_DoubleSidedGI: 0 21 | m_CustomRenderQueue: 3000 22 | stringTagMap: 23 | RenderType: Transparent 24 | disabledShaderPasses: 25 | - GRABPASS 26 | m_LockedProperties: 27 | m_SavedProperties: 28 | serializedVersion: 3 29 | m_TexEnvs: 30 | - _BumpMap: 31 | m_Texture: {fileID: 0} 32 | m_Scale: {x: 1, y: 1} 33 | m_Offset: {x: 0, y: 0} 34 | - _DetailAlbedoMap: 35 | m_Texture: {fileID: 0} 36 | m_Scale: {x: 1, y: 1} 37 | m_Offset: {x: 0, y: 0} 38 | - _DetailMask: 39 | m_Texture: {fileID: 0} 40 | m_Scale: {x: 1, y: 1} 41 | m_Offset: {x: 0, y: 0} 42 | - _DetailNormalMap: 43 | m_Texture: {fileID: 0} 44 | m_Scale: {x: 1, y: 1} 45 | m_Offset: {x: 0, y: 0} 46 | - _EmissionMap: 47 | m_Texture: {fileID: 0} 48 | m_Scale: {x: 1, y: 1} 49 | m_Offset: {x: 0, y: 0} 50 | - _MainTex: 51 | m_Texture: {fileID: 10300, guid: 0000000000000000f000000000000000, type: 0} 52 | m_Scale: {x: 1, y: 1} 53 | m_Offset: {x: 0, y: 0} 54 | - _MetallicGlossMap: 55 | m_Texture: {fileID: 0} 56 | m_Scale: {x: 1, y: 1} 57 | m_Offset: {x: 0, y: 0} 58 | - _OcclusionMap: 59 | m_Texture: {fileID: 0} 60 | m_Scale: {x: 1, y: 1} 61 | m_Offset: {x: 0, y: 0} 62 | - _ParallaxMap: 63 | m_Texture: {fileID: 0} 64 | m_Scale: {x: 1, y: 1} 65 | m_Offset: {x: 0, y: 0} 66 | m_Ints: [] 67 | m_Floats: 68 | - _BlendOp: 0 69 | - _BumpScale: 1 70 | - _CameraFadingEnabled: 0 71 | - _CameraFarFadeDistance: 2 72 | - _CameraNearFadeDistance: 1 73 | - _ColorMode: 1 74 | - _Cull: 2 75 | - _Cutoff: 0.5 76 | - _DetailNormalMapScale: 1 77 | - _DistortionBlend: 0.5 78 | - _DistortionEnabled: 0 79 | - _DistortionStrength: 1 80 | - _DistortionStrengthScaled: 0 81 | - _DstBlend: 10 82 | - _EmissionEnabled: 0 83 | - _FlipbookMode: 0 84 | - _GlossMapScale: 1 85 | - _Glossiness: 0 86 | - _GlossyReflections: 1 87 | - _LightingEnabled: 0 88 | - _Metallic: 0 89 | - _Mode: 2 90 | - _OcclusionStrength: 1 91 | - _Parallax: 0.02 92 | - _SmoothnessTextureChannel: 0 93 | - _SoftParticlesEnabled: 0 94 | - _SoftParticlesFarFadeDistance: 1 95 | - _SoftParticlesNearFadeDistance: 0 96 | - _SpecularHighlights: 1 97 | - _SrcBlend: 5 98 | - _UVSec: 0 99 | - _ZWrite: 0 100 | m_Colors: 101 | - _CameraFadeParams: {r: 0, g: Infinity, b: 0, a: 0} 102 | - _Color: {r: 1, g: 1, b: 1, a: 1} 103 | - _ColorAddSubDiff: {r: 1, g: 0, b: 0, a: 0} 104 | - _EmissionColor: {r: 1, g: 1, b: 1, a: 1} 105 | - _SoftParticleFadeParams: {r: 0, g: 0, b: 0, a: 0} 106 | m_BuildTextureStacks: [] 107 | -------------------------------------------------------------------------------- /Prefabs/RigidBody Example/PanelParticleMaterial.mat.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: d73f30518ca49f444852eb6d42d774a0 3 | NativeFormatImporter: 4 | externalObjects: {} 5 | mainObjectFileID: 2100000 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Prefabs/RigidBody Example/PortablePanelWithRigidBody.asset.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: dd9b4f860371a9646ac9b0218a83d442 3 | NativeFormatImporter: 4 | externalObjects: {} 5 | mainObjectFileID: 11400000 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Prefabs/RigidBody Example/PortablePanelWithRigidBody.cs: -------------------------------------------------------------------------------- 1 |  2 | using TMPro; 3 | using UdonSharp; 4 | using UnityEngine; 5 | using VRC.SDKBase; 6 | using VRC.Udon; 7 | 8 | namespace myro 9 | { 10 | /// 11 | /// Here's a script example of a panel connected to a rigid body 12 | /// The idea is to be able to throw the panel away, and once it's further away from the player, it will disintegrate 13 | /// 14 | public class PortablePanelWithRigidBody : PortablePanel 15 | { 16 | public Rigidbody PanelRigidBody; 17 | public ParticleSystem ClosingParticleAnimation; 18 | public BoxCollider PickupCollider; 19 | 20 | private Rigidbody _particleSystemRB; 21 | 22 | private void StopPanel() 23 | { 24 | PanelRigidBody.velocity = Vector3.zero; 25 | PanelRigidBody.angularVelocity = Vector3.zero; 26 | } 27 | 28 | public override void OnStart() 29 | { 30 | _particleSystemRB = ClosingParticleAnimation.GetComponent(); 31 | 32 | if (!Networking.LocalPlayer.IsUserInVR()) 33 | { 34 | ClosingParticleAnimation.gameObject.SetActive(false); 35 | PickupCollider.enabled = false; 36 | _particleSystemRB.isKinematic = true; 37 | PanelRigidBody.isKinematic = true; 38 | } 39 | } 40 | 41 | public override void OnPanelGrab() 42 | { 43 | //to make sure the panel doesn't uncontrolably fly away when the panel gets dropped, we will set the velocity to 0 once the panel is grabbed 44 | StopPanel(); 45 | } 46 | 47 | public override bool OnPanelClosing() 48 | { 49 | //once the panel closes, let's just play a basic disintegration animation 50 | //we first place the particle emitter at the exact location the panel was 51 | ClosingParticleAnimation.transform.position = Panel.transform.position; 52 | ClosingParticleAnimation.transform.rotation = Panel.transform.rotation; 53 | ClosingParticleAnimation.transform.localScale = Panel.transform.localScale; 54 | 55 | //momentum transfer 56 | if (_particleSystemRB != null) 57 | { 58 | _particleSystemRB.velocity = PanelRigidBody.velocity; 59 | _particleSystemRB.angularVelocity = PanelRigidBody.angularVelocity; 60 | } 61 | 62 | StopPanel(); 63 | 64 | //playing the animation 65 | ClosingParticleAnimation.Stop(); 66 | ClosingParticleAnimation.Play(); 67 | 68 | return true; //We want to close the panel 69 | } 70 | } 71 | } 72 | -------------------------------------------------------------------------------- /Prefabs/RigidBody Example/PortablePanelWithRigidBody.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: acaad520046b24646a93758ea14d988b 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Portable VRChat Panel 2 | A script for a customizable portable panel that can be used in any VRC world. You can use it to create menus, portable video players etc. 3 | - In VR, put your hands close together, then use the "Triggers" or the "Grab" gesture to open the menu. 4 | - On PC, just keep the "Tab" key pressed. 5 | 6 | Requires UdonSharp. 7 | 8 | It can be tested in my Prefab world called "Assets I released" : https://vrchat.com/home/world/wrld_22e9b1a3-1d2e-4800-b46d-ce3501b07001 9 | 10 | ## Prefabs 11 | 12 | This package includes two examples : 13 | 14 | A basic panel 15 | 16 | ![Showcase](https://github.com/MyroG/Portable-Panel/blob/main/Res/Presentation1.gif) 17 | 18 | A more complex example where the panel can be thrown away. Once the player is too far away from the panel, it dissintegrates, which is done with a basic particle animation. 19 | 20 | ![Showcase](https://github.com/MyroG/Portable-Panel/blob/main/Res/Presentation2.gif) 21 | 22 | 23 | 24 | ## Installation 25 | 26 | Version 1.2 requires VRCSDK 3.2.2 or above. 27 | Older versions work with older VRCSDKs, but they do not include features related to avatar scaling. 28 | Once the installation completed, make sure to read about all the possible Settings 29 | 30 | ### Easy installation 31 | 32 | In the folder `Assets/Myorp/PortablePanel`, you'll find two prefabs : 33 | - `PortablePanel` is a version that doesn't have a VRCPickup component, it can still be grabbed. 34 | - `ThrowablePanel` is a version that uses a VRCPickup component, it can be thrown and dissintegrates when the panel gets too far away. 35 | 36 | 1) Open the prefab of your choice, you can also duplicate the prefab if you do not want to override the one present in the folder 37 | 2) The hierarchie looks like this :
38 | ![Showcase](https://github.com/MyroG/Portable-Panel/blob/main/Res/PanelHierarchy.PNG) 39 | 3) Add your panel as a child of the GameObject `[ADD YOUR PANEL AS A CHILD OF THIS GAMEOBJECT]`, place it in a way so it matches the placeholder panel (which is named `[DELETE THIS]`) 40 | 4) You can now delete the `[DELETE THIS]` GameObject (You can also just hide the GameObject if you do not want to delete it). 41 | 5) If you're using the ThrowablePanel prefab, and your panel already has a VRCPickup component, remove that component, the `[ADD YOUR PANEL AS A CHILD OF THIS GAMEOBJECT]` GameObject already has the VRCPickup component. 42 | 43 | ### More difficult/Manual installation 44 | 45 | The panel doesn't need to have a VRCPickup component, it can be grabbed even without that component, but if you prefer using a VRCPickup, the installation steps are a bit different : 46 | 47 | If your panel is NOT a VRCPickup : 48 | 1) Attach the `PortablePanel` script on a GameObject, do not attach that script directly on the panel, attach it rather on a separate GameObject. 49 | 2) The `PortablePanel` script has a `Panel` field, make sure that field points towards your panel 50 | 51 | If your panel is a VRCPickup : 52 | 1) Attach the `PortablePanel` script on a GameObject, do not attach that script directly on the panel, attach it rather on a separate GameObject. 53 | 2) Attach the `PortablePanelPickupModule` script next to the VRCPickup component. the `Portable Panel Reference` field should point towards the `Portable Panel` component added in step 1. 54 | 3) The `PortablePanel` script has a `Panel` field, make sure that field points towards your panel. 55 | 56 | ### Android Smartphone 57 | 58 | ![Parameters](https://github.com/MyroG/Portable-Panel/blob/main/Res/Android.PNG) 59 | 60 | The prefab `AndroidPanelModule` adds an overlay so the Panel can easily be opened and closed on Android devices, it adds a screen space canvas with a button, the android panel can be customized if needed. 61 | I would recommend to add it into your scene so Android users can open the panel on their device, the field `Portable Panel Instance` needs to reference your panel. 62 | 63 | You'll notice that the "Canvas" GameObject attached as a child is turned off by default, it should be off by default, this is to ensure that the canvas doesn't get shown on the VRChat loading screen. 64 | 65 | ## Settings 66 | 67 | The `PortablePanel` component has a few settings, I'll explain them bellow: 68 | 69 | ![Parameters](https://github.com/MyroG/Portable-Panel/blob/main/Res/Parameters.png) 70 | 71 | Certain settings like `Max Scale`, `Min Scale`, `Max Distance Before Closing The Panel`, and `Panel Scale On Desktop` are all based on real-world measurements, like meters you'd use in your room, rather than Unity's internal units. These values automatically adjust based on the size of your avatar. So, for example, if you set `Max Distance Before Closing The Panel` to 5 meters, and your avatar is 1m80 tall, the panel will close when it's 5 meters away from your avatar. But if your avatar is smaller, say 90cm, the panel will close at 2m50, which is half the distance. From your point of view as a player, it will still feel like the panel is closing at 5 meters, even though it adapts to your avatar's size 72 | 73 | | Parameter | Explanation | 74 | |--------------------------------------|----------------------------------------------------------------------------------------------------------------------| 75 | | Panel | The Panel GameObject. As mentioned above, the script should not be attached to the panel directly. It is preferable to attach it on a separate GameObject or as a child GameObject. If you need to resize the panel, do not scale the GameObject that has the PortablePanel script, resize your actual panel instead. | 76 | | Tab On Hold | Desktop only setting, by default the player needs to keep the Tab button pressed, which also unlocks the mouse cursor at the same time aand allows the player to click around, this feature can cause issues if the panel has an input field (the player wouldn't be able to interact with the input field), in that case it is recommended to turn that setting off. | 77 | | Gesture Mode | Set this value to "Grab" if the panel should be opened with the grab gesture, "Triggers" if you prefer trigger buttons, or "Both" if the panel should be opened with a combination of both gestures. Be careful when setting it to "Triggers" as the panel might get accidentally grabbed or scaled when trying to interact with it, especially if it's a menu. | 78 | | Closing Behaviour | Set this value to "Closing" if you want to close/hide the panel, set it to "Respawning" if you want the panel to respawn at it's original location. | 79 | | Is Pickupable | If you want the panel to be grabbable | 80 | | Max Scale | The panel can be scaled up as much as you like, but if you want you can set a max scale, and the panel will not exceed that scale. | 81 | | Min Scale | The panel cannot be scaled below the "MinScale", can be useful if your panel contains stuff that cannot be scaled down so much, otherwise you can keep that value low or event set it to 0 | 82 | | Max Distance Before Closing The Panel | The panel will automatically close if the player walks away from it. The distance can be configured here. | 83 | | Panel Scale On Desktop | Desktop-only setting: Scale of the panel for Desktop users. | 84 | | Delay Initialisation | This is an ugly hack to prevent certain prefabs to break.
When you launch the instance, the panel gets automatically hidden from the player, and that during the loading screen. In most cases, that shouldn't cause any issues, but hiding the panel disables any script that is attached to that panel, which can break certain scripts that really need to get initialised during the loading screen.
For instance, certain video player controls attached to the panel could break because of that. If that happens, you can check that checkbox, this will initialise the panel shortly before the loading screen ends, and ensure that most prefabs attached to that panel will initialise properly, the drawback is that you cannot disable the `PortablePanel` script at the start of the world, as it will break the script...| 85 | 86 | ## Events 87 | If you want to implement custom behaviors to the panel, for instance when the panel closes, or when it gets dropped, you can create a class that inherits from `PortablePanel` ann override the events you need to override. 88 | 89 | | Event name | Parameters | Behavior | Return | 90 | |-----------------|---------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------|--------| 91 | | `OnPanelOpening` | | Gets called when the panel opens. | True - If the panel needs to be opened. If you want to open the panel manually, you can return `false`. | 92 | | `OnPanelClosing` | | Gets called when the panel is about to get closed, so it is called when the panel is not closed yet. | True - If the panel needs to be closed. If you want to close the panel manually, you can return `false` instead. | 93 | | `OnPanelGrab` | | Gets called when the panel is getting grabbed, either by one hand or with both hands. If `Grabbable Panel` is set to false, only scaling triggers that event. | | 94 | | `OnPanelDrop ` | | Gets called when the panel is dropped.| | 95 | | `OnPanelScaled` | float oldScale, float newScale | Gets called when the panel gets scaled.| | 96 | | `OnStart` | | Gets called on Start. Use it if you need to initialize certain values | | 97 | 98 | 99 | 100 | ## Public methods 101 | A few public methods can be called from an external script : 102 | 103 | | Function Name | Return | Explanation | Parameter | 104 | |------------------------|--------|----------------------------------------------------------------------------------------------------------------------| --------- | 105 | | `ForceClosePanel()` | | Closes the panel even if it is currently being held or scaled. | 106 | | `ForceOpenPanel(float unscaledDistance)` | | Opens the panel:
- On Desktop, the panel will be shown on the screen and can be closed again with the "Tab" key.
- In VR, the panel will be placed in front of the player's face. | The `unscaledDistance` parameter is optional, it allows you to set the distance you want to place the panel in front of the player, it is "unscaled" because that distance is scaled based on the size of the avatar, the panel will be placed closer if the avatar is smaller. | 107 | | `IsPanelHoldByOneHand()`| bool | Returns true if the panel is being held with one hand. | 108 | | `SetRespawnPoint(Vector3 position, Quaternion rotation, Vector3 scale)` | | Sets the respawn point of the panel, which can be useful if you want to move the panel to a different place. | | 109 | | `RespawnPanel` | | Respawns the panel, only works when `Closing Behaviour` is set to `Respawning`, it has a similar behaviour as `ForceClosePanel`, except that `ForceClosePanel` checks if the panel already got closed. | 110 | | `SetPickupable(bool newPickupableState)` | | Sets the "pickupable" state of your panel. This will also work for VRCPickups | The new pickupable state | 111 | 112 | ## Constants 113 | I use three contants I didn't exposed in the inspector, because I didn't wanted to fill up the inspector with parameters no one will change, but if needed you can change them directly in the code. 114 | - MAX_DISTANCE_HAND_GESTURE : Max distance between both hands to trigger a panel opening, it is set at 30cm, so to open the panel the distance between your hands should not exceed 30 centimeters. 115 | - TIME_INTERVAL_HAND_GESTURE : To open the panel and to scale it, the right and left hand gestures should occur with a time gap of less than the time given by that constant, it is set to 0.15 second. 116 | - PLACEMENT_DISTANCE_FROM_HEAD : The default distance the panel gets opened on Desktop, do not set it to 0. 117 | - CLOSING_HAND_DISTANCE : If the distance between both hands is smaller than the value of this const variable, then the panel will close. Note that this variable is scaled based on the size of the avatar. 118 | 119 | ## License 120 | MIT, see the include LICENSE file 121 | 122 | ## Credits 123 | No need to credit me, but if you want you can credit my VRChat username (MyroP) with or without a link to this GitHub page. 124 | 125 | ## Socials and contact 126 | For bug reports or suggestion, please use the "Issue" tab, but you can also contact me on X/Twitter (my DM's are open) 127 | - My Twitter/X account : https://x.com/MyroDev or https://twitter.com/MyroDev 128 | - My VRChat profile : https://vrchat.com/home/user/usr_0d0d4ccf-7352-46bd-b1d1-ec804f0c3490 129 | - My VRCList profile : https://vrclist.com/user/MyroP 130 | - Tip jar: https://www.patreon.com/myrop 131 | 132 | -------------------------------------------------------------------------------- /README.md.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 33b2f9478b6024a48aa079613101927b 3 | TextScriptImporter: 4 | externalObjects: {} 5 | userData: 6 | assetBundleName: 7 | assetBundleVariant: 8 | -------------------------------------------------------------------------------- /Res.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 033d75e0497b24348a973eb063a7be5f 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Res/Android.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MyroG/Portable-Panel/243eaaea0f293f5290f330f12afb9319eddb9302/Res/Android.PNG -------------------------------------------------------------------------------- /Res/Android.PNG.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: cc1992fa2d95bf841b727dca744159eb 3 | TextureImporter: 4 | internalIDToNameTable: [] 5 | externalObjects: {} 6 | serializedVersion: 11 7 | mipmaps: 8 | mipMapMode: 0 9 | enableMipMap: 1 10 | sRGBTexture: 1 11 | linearTexture: 0 12 | fadeOut: 0 13 | borderMipMap: 0 14 | mipMapsPreserveCoverage: 0 15 | alphaTestReferenceValue: 0.5 16 | mipMapFadeDistanceStart: 1 17 | mipMapFadeDistanceEnd: 3 18 | bumpmap: 19 | convertToNormalMap: 0 20 | externalNormalMap: 0 21 | heightScale: 0.25 22 | normalMapFilter: 0 23 | isReadable: 0 24 | streamingMipmaps: 0 25 | streamingMipmapsPriority: 0 26 | grayScaleToAlpha: 0 27 | generateCubemap: 6 28 | cubemapConvolution: 0 29 | seamlessCubemap: 0 30 | textureFormat: 1 31 | maxTextureSize: 2048 32 | textureSettings: 33 | serializedVersion: 2 34 | filterMode: 1 35 | aniso: 1 36 | mipBias: 0 37 | wrapU: 0 38 | wrapV: 0 39 | wrapW: 0 40 | nPOTScale: 1 41 | lightmap: 0 42 | compressionQuality: 50 43 | spriteMode: 0 44 | spriteExtrude: 1 45 | spriteMeshType: 1 46 | alignment: 0 47 | spritePivot: {x: 0.5, y: 0.5} 48 | spritePixelsToUnits: 100 49 | spriteBorder: {x: 0, y: 0, z: 0, w: 0} 50 | spriteGenerateFallbackPhysicsShape: 1 51 | alphaUsage: 1 52 | alphaIsTransparency: 0 53 | spriteTessellationDetail: -1 54 | textureType: 0 55 | textureShape: 1 56 | singleChannelComponent: 0 57 | maxTextureSizeSet: 0 58 | compressionQualitySet: 0 59 | textureFormatSet: 0 60 | applyGammaDecoding: 0 61 | platformSettings: 62 | - serializedVersion: 3 63 | buildTarget: DefaultTexturePlatform 64 | maxTextureSize: 2048 65 | resizeAlgorithm: 0 66 | textureFormat: -1 67 | textureCompression: 1 68 | compressionQuality: 50 69 | crunchedCompression: 0 70 | allowsAlphaSplitting: 0 71 | overridden: 0 72 | androidETC2FallbackOverride: 0 73 | forceMaximumCompressionQuality_BC6H_BC7: 0 74 | spriteSheet: 75 | serializedVersion: 2 76 | sprites: [] 77 | outline: [] 78 | physicsShape: [] 79 | bones: [] 80 | spriteID: 81 | internalID: 0 82 | vertices: [] 83 | indices: 84 | edges: [] 85 | weights: [] 86 | secondaryTextures: [] 87 | spritePackingTag: 88 | pSDRemoveMatte: 0 89 | pSDShowRemoveMatteOption: 0 90 | userData: 91 | assetBundleName: 92 | assetBundleVariant: 93 | -------------------------------------------------------------------------------- /Res/PanelHierarchy.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MyroG/Portable-Panel/243eaaea0f293f5290f330f12afb9319eddb9302/Res/PanelHierarchy.PNG -------------------------------------------------------------------------------- /Res/PanelHierarchy.PNG.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 119dc245157a7d545844d3f784cdf090 3 | TextureImporter: 4 | internalIDToNameTable: [] 5 | externalObjects: {} 6 | serializedVersion: 11 7 | mipmaps: 8 | mipMapMode: 0 9 | enableMipMap: 1 10 | sRGBTexture: 1 11 | linearTexture: 0 12 | fadeOut: 0 13 | borderMipMap: 0 14 | mipMapsPreserveCoverage: 0 15 | alphaTestReferenceValue: 0.5 16 | mipMapFadeDistanceStart: 1 17 | mipMapFadeDistanceEnd: 3 18 | bumpmap: 19 | convertToNormalMap: 0 20 | externalNormalMap: 0 21 | heightScale: 0.25 22 | normalMapFilter: 0 23 | isReadable: 0 24 | streamingMipmaps: 0 25 | streamingMipmapsPriority: 0 26 | grayScaleToAlpha: 0 27 | generateCubemap: 6 28 | cubemapConvolution: 0 29 | seamlessCubemap: 0 30 | textureFormat: 1 31 | maxTextureSize: 2048 32 | textureSettings: 33 | serializedVersion: 2 34 | filterMode: 1 35 | aniso: 1 36 | mipBias: 0 37 | wrapU: 0 38 | wrapV: 0 39 | wrapW: 0 40 | nPOTScale: 1 41 | lightmap: 0 42 | compressionQuality: 50 43 | spriteMode: 0 44 | spriteExtrude: 1 45 | spriteMeshType: 1 46 | alignment: 0 47 | spritePivot: {x: 0.5, y: 0.5} 48 | spritePixelsToUnits: 100 49 | spriteBorder: {x: 0, y: 0, z: 0, w: 0} 50 | spriteGenerateFallbackPhysicsShape: 1 51 | alphaUsage: 1 52 | alphaIsTransparency: 0 53 | spriteTessellationDetail: -1 54 | textureType: 0 55 | textureShape: 1 56 | singleChannelComponent: 0 57 | maxTextureSizeSet: 0 58 | compressionQualitySet: 0 59 | textureFormatSet: 0 60 | applyGammaDecoding: 0 61 | platformSettings: 62 | - serializedVersion: 3 63 | buildTarget: DefaultTexturePlatform 64 | maxTextureSize: 2048 65 | resizeAlgorithm: 0 66 | textureFormat: -1 67 | textureCompression: 1 68 | compressionQuality: 50 69 | crunchedCompression: 0 70 | allowsAlphaSplitting: 0 71 | overridden: 0 72 | androidETC2FallbackOverride: 0 73 | forceMaximumCompressionQuality_BC6H_BC7: 0 74 | spriteSheet: 75 | serializedVersion: 2 76 | sprites: [] 77 | outline: [] 78 | physicsShape: [] 79 | bones: [] 80 | spriteID: 81 | internalID: 0 82 | vertices: [] 83 | indices: 84 | edges: [] 85 | weights: [] 86 | secondaryTextures: [] 87 | spritePackingTag: 88 | pSDRemoveMatte: 0 89 | pSDShowRemoveMatteOption: 0 90 | userData: 91 | assetBundleName: 92 | assetBundleVariant: 93 | -------------------------------------------------------------------------------- /Res/Parameters.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MyroG/Portable-Panel/243eaaea0f293f5290f330f12afb9319eddb9302/Res/Parameters.png -------------------------------------------------------------------------------- /Res/Parameters.png.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 3eb0fec39ac59f744824a15a84fb32e3 3 | TextureImporter: 4 | internalIDToNameTable: [] 5 | externalObjects: {} 6 | serializedVersion: 11 7 | mipmaps: 8 | mipMapMode: 0 9 | enableMipMap: 1 10 | sRGBTexture: 1 11 | linearTexture: 0 12 | fadeOut: 0 13 | borderMipMap: 0 14 | mipMapsPreserveCoverage: 0 15 | alphaTestReferenceValue: 0.5 16 | mipMapFadeDistanceStart: 1 17 | mipMapFadeDistanceEnd: 3 18 | bumpmap: 19 | convertToNormalMap: 0 20 | externalNormalMap: 0 21 | heightScale: 0.25 22 | normalMapFilter: 0 23 | isReadable: 0 24 | streamingMipmaps: 0 25 | streamingMipmapsPriority: 0 26 | grayScaleToAlpha: 0 27 | generateCubemap: 6 28 | cubemapConvolution: 0 29 | seamlessCubemap: 0 30 | textureFormat: 1 31 | maxTextureSize: 2048 32 | textureSettings: 33 | serializedVersion: 2 34 | filterMode: 1 35 | aniso: 1 36 | mipBias: 0 37 | wrapU: 0 38 | wrapV: 0 39 | wrapW: 0 40 | nPOTScale: 1 41 | lightmap: 0 42 | compressionQuality: 50 43 | spriteMode: 0 44 | spriteExtrude: 1 45 | spriteMeshType: 1 46 | alignment: 0 47 | spritePivot: {x: 0.5, y: 0.5} 48 | spritePixelsToUnits: 100 49 | spriteBorder: {x: 0, y: 0, z: 0, w: 0} 50 | spriteGenerateFallbackPhysicsShape: 1 51 | alphaUsage: 1 52 | alphaIsTransparency: 0 53 | spriteTessellationDetail: -1 54 | textureType: 0 55 | textureShape: 1 56 | singleChannelComponent: 0 57 | maxTextureSizeSet: 0 58 | compressionQualitySet: 0 59 | textureFormatSet: 0 60 | applyGammaDecoding: 0 61 | platformSettings: 62 | - serializedVersion: 3 63 | buildTarget: DefaultTexturePlatform 64 | maxTextureSize: 2048 65 | resizeAlgorithm: 0 66 | textureFormat: -1 67 | textureCompression: 1 68 | compressionQuality: 50 69 | crunchedCompression: 0 70 | allowsAlphaSplitting: 0 71 | overridden: 0 72 | androidETC2FallbackOverride: 0 73 | forceMaximumCompressionQuality_BC6H_BC7: 0 74 | spriteSheet: 75 | serializedVersion: 2 76 | sprites: [] 77 | outline: [] 78 | physicsShape: [] 79 | bones: [] 80 | spriteID: 81 | internalID: 0 82 | vertices: [] 83 | indices: 84 | edges: [] 85 | weights: [] 86 | secondaryTextures: [] 87 | spritePackingTag: 88 | pSDRemoveMatte: 0 89 | pSDShowRemoveMatteOption: 0 90 | userData: 91 | assetBundleName: 92 | assetBundleVariant: 93 | -------------------------------------------------------------------------------- /Res/Presentation1.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MyroG/Portable-Panel/243eaaea0f293f5290f330f12afb9319eddb9302/Res/Presentation1.gif -------------------------------------------------------------------------------- /Res/Presentation1.gif.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: dea1eba27467a4a488e93706e243a838 3 | TextureImporter: 4 | internalIDToNameTable: [] 5 | externalObjects: {} 6 | serializedVersion: 11 7 | mipmaps: 8 | mipMapMode: 0 9 | enableMipMap: 1 10 | sRGBTexture: 1 11 | linearTexture: 0 12 | fadeOut: 0 13 | borderMipMap: 0 14 | mipMapsPreserveCoverage: 0 15 | alphaTestReferenceValue: 0.5 16 | mipMapFadeDistanceStart: 1 17 | mipMapFadeDistanceEnd: 3 18 | bumpmap: 19 | convertToNormalMap: 0 20 | externalNormalMap: 0 21 | heightScale: 0.25 22 | normalMapFilter: 0 23 | isReadable: 0 24 | streamingMipmaps: 0 25 | streamingMipmapsPriority: 0 26 | grayScaleToAlpha: 0 27 | generateCubemap: 6 28 | cubemapConvolution: 0 29 | seamlessCubemap: 0 30 | textureFormat: 1 31 | maxTextureSize: 2048 32 | textureSettings: 33 | serializedVersion: 2 34 | filterMode: 1 35 | aniso: 1 36 | mipBias: 0 37 | wrapU: 0 38 | wrapV: 0 39 | wrapW: 0 40 | nPOTScale: 1 41 | lightmap: 0 42 | compressionQuality: 50 43 | spriteMode: 0 44 | spriteExtrude: 1 45 | spriteMeshType: 1 46 | alignment: 0 47 | spritePivot: {x: 0.5, y: 0.5} 48 | spritePixelsToUnits: 100 49 | spriteBorder: {x: 0, y: 0, z: 0, w: 0} 50 | spriteGenerateFallbackPhysicsShape: 1 51 | alphaUsage: 1 52 | alphaIsTransparency: 0 53 | spriteTessellationDetail: -1 54 | textureType: 0 55 | textureShape: 1 56 | singleChannelComponent: 0 57 | maxTextureSizeSet: 0 58 | compressionQualitySet: 0 59 | textureFormatSet: 0 60 | applyGammaDecoding: 0 61 | platformSettings: 62 | - serializedVersion: 3 63 | buildTarget: DefaultTexturePlatform 64 | maxTextureSize: 2048 65 | resizeAlgorithm: 0 66 | textureFormat: -1 67 | textureCompression: 1 68 | compressionQuality: 50 69 | crunchedCompression: 0 70 | allowsAlphaSplitting: 0 71 | overridden: 0 72 | androidETC2FallbackOverride: 0 73 | forceMaximumCompressionQuality_BC6H_BC7: 0 74 | spriteSheet: 75 | serializedVersion: 2 76 | sprites: [] 77 | outline: [] 78 | physicsShape: [] 79 | bones: [] 80 | spriteID: 81 | internalID: 0 82 | vertices: [] 83 | indices: 84 | edges: [] 85 | weights: [] 86 | secondaryTextures: [] 87 | spritePackingTag: 88 | pSDRemoveMatte: 0 89 | pSDShowRemoveMatteOption: 0 90 | userData: 91 | assetBundleName: 92 | assetBundleVariant: 93 | -------------------------------------------------------------------------------- /Res/Presentation2.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MyroG/Portable-Panel/243eaaea0f293f5290f330f12afb9319eddb9302/Res/Presentation2.gif -------------------------------------------------------------------------------- /Res/Presentation2.gif.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 35e44f05a6c3fdf47a0f0e80fc673c90 3 | TextureImporter: 4 | internalIDToNameTable: [] 5 | externalObjects: {} 6 | serializedVersion: 11 7 | mipmaps: 8 | mipMapMode: 0 9 | enableMipMap: 1 10 | sRGBTexture: 1 11 | linearTexture: 0 12 | fadeOut: 0 13 | borderMipMap: 0 14 | mipMapsPreserveCoverage: 0 15 | alphaTestReferenceValue: 0.5 16 | mipMapFadeDistanceStart: 1 17 | mipMapFadeDistanceEnd: 3 18 | bumpmap: 19 | convertToNormalMap: 0 20 | externalNormalMap: 0 21 | heightScale: 0.25 22 | normalMapFilter: 0 23 | isReadable: 0 24 | streamingMipmaps: 0 25 | streamingMipmapsPriority: 0 26 | grayScaleToAlpha: 0 27 | generateCubemap: 6 28 | cubemapConvolution: 0 29 | seamlessCubemap: 0 30 | textureFormat: 1 31 | maxTextureSize: 2048 32 | textureSettings: 33 | serializedVersion: 2 34 | filterMode: 1 35 | aniso: 1 36 | mipBias: 0 37 | wrapU: 0 38 | wrapV: 0 39 | wrapW: 0 40 | nPOTScale: 1 41 | lightmap: 0 42 | compressionQuality: 50 43 | spriteMode: 0 44 | spriteExtrude: 1 45 | spriteMeshType: 1 46 | alignment: 0 47 | spritePivot: {x: 0.5, y: 0.5} 48 | spritePixelsToUnits: 100 49 | spriteBorder: {x: 0, y: 0, z: 0, w: 0} 50 | spriteGenerateFallbackPhysicsShape: 1 51 | alphaUsage: 1 52 | alphaIsTransparency: 0 53 | spriteTessellationDetail: -1 54 | textureType: 0 55 | textureShape: 1 56 | singleChannelComponent: 0 57 | maxTextureSizeSet: 0 58 | compressionQualitySet: 0 59 | textureFormatSet: 0 60 | applyGammaDecoding: 0 61 | platformSettings: 62 | - serializedVersion: 3 63 | buildTarget: DefaultTexturePlatform 64 | maxTextureSize: 2048 65 | resizeAlgorithm: 0 66 | textureFormat: -1 67 | textureCompression: 1 68 | compressionQuality: 50 69 | crunchedCompression: 0 70 | allowsAlphaSplitting: 0 71 | overridden: 0 72 | androidETC2FallbackOverride: 0 73 | forceMaximumCompressionQuality_BC6H_BC7: 0 74 | spriteSheet: 75 | serializedVersion: 2 76 | sprites: [] 77 | outline: [] 78 | physicsShape: [] 79 | bones: [] 80 | spriteID: 81 | internalID: 0 82 | vertices: [] 83 | indices: 84 | edges: [] 85 | weights: [] 86 | secondaryTextures: [] 87 | spritePackingTag: 88 | pSDRemoveMatte: 0 89 | pSDShowRemoveMatteOption: 0 90 | userData: 91 | assetBundleName: 92 | assetBundleVariant: 93 | -------------------------------------------------------------------------------- /Scripts.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: d27be4fb14e24744f89ec680c49d732b 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Scripts/AndroidPanelModule.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!114 &11400000 4 | MonoBehaviour: 5 | m_ObjectHideFlags: 0 6 | m_CorrespondingSourceObject: {fileID: 0} 7 | m_PrefabInstance: {fileID: 0} 8 | m_PrefabAsset: {fileID: 0} 9 | m_GameObject: {fileID: 0} 10 | m_Enabled: 1 11 | m_EditorHideFlags: 0 12 | m_Script: {fileID: 11500000, guid: c333ccfdd0cbdbc4ca30cef2dd6e6b9b, type: 3} 13 | m_Name: AndroidPanelModule 14 | m_EditorClassIdentifier: 15 | serializedUdonProgramAsset: {fileID: 11400000, guid: d934a01d057aa214c832458f807b8003, 16 | type: 2} 17 | udonAssembly: 18 | assemblyError: 19 | sourceCsScript: {fileID: 11500000, guid: f043114674f43f2448af5493f1cacf41, type: 3} 20 | scriptVersion: 2 21 | compiledVersion: 2 22 | behaviourSyncMode: 1 23 | hasInteractEvent: 0 24 | scriptID: 4003125356719091434 25 | serializationData: 26 | SerializedFormat: 2 27 | SerializedBytes: 28 | ReferencedUnityObjects: [] 29 | SerializedBytesString: 30 | Prefab: {fileID: 0} 31 | PrefabModificationsReferencedUnityObjects: [] 32 | PrefabModifications: [] 33 | SerializationNodes: 34 | - Name: fieldDefinitions 35 | Entry: 7 36 | Data: 0|System.Collections.Generic.Dictionary`2[[System.String, mscorlib],[UdonSharp.Compiler.FieldDefinition, 37 | UdonSharp.Editor]], mscorlib 38 | - Name: comparer 39 | Entry: 7 40 | Data: 1|System.Collections.Generic.GenericEqualityComparer`1[[System.String, 41 | mscorlib]], mscorlib 42 | - Name: 43 | Entry: 8 44 | Data: 45 | - Name: 46 | Entry: 12 47 | Data: 2 48 | - Name: 49 | Entry: 7 50 | Data: 51 | - Name: $k 52 | Entry: 1 53 | Data: PortablePanelInstance 54 | - Name: $v 55 | Entry: 7 56 | Data: 2|UdonSharp.Compiler.FieldDefinition, UdonSharp.Editor 57 | - Name: k__BackingField 58 | Entry: 1 59 | Data: PortablePanelInstance 60 | - Name: k__BackingField 61 | Entry: 7 62 | Data: 3|System.RuntimeType, mscorlib 63 | - Name: 64 | Entry: 1 65 | Data: myro.PortablePanel, Assembly-CSharp 66 | - Name: 67 | Entry: 8 68 | Data: 69 | - Name: k__BackingField 70 | Entry: 7 71 | Data: 4|System.RuntimeType, mscorlib 72 | - Name: 73 | Entry: 1 74 | Data: VRC.Udon.UdonBehaviour, VRC.Udon 75 | - Name: 76 | Entry: 8 77 | Data: 78 | - Name: k__BackingField 79 | Entry: 7 80 | Data: System.Nullable`1[[UdonSharp.UdonSyncMode, UdonSharp.Runtime]], mscorlib 81 | - Name: 82 | Entry: 6 83 | Data: 84 | - Name: 85 | Entry: 8 86 | Data: 87 | - Name: k__BackingField 88 | Entry: 5 89 | Data: true 90 | - Name: _fieldAttributes 91 | Entry: 7 92 | Data: 5|System.Collections.Generic.List`1[[System.Attribute, mscorlib]], mscorlib 93 | - Name: 94 | Entry: 12 95 | Data: 1 96 | - Name: 97 | Entry: 7 98 | Data: 6|UnityEngine.HeaderAttribute, UnityEngine.CoreModule 99 | - Name: header 100 | Entry: 1 101 | Data: Set your panel here 102 | - Name: 103 | Entry: 8 104 | Data: 105 | - Name: 106 | Entry: 13 107 | Data: 108 | - Name: 109 | Entry: 8 110 | Data: 111 | - Name: 112 | Entry: 8 113 | Data: 114 | - Name: 115 | Entry: 8 116 | Data: 117 | - Name: 118 | Entry: 7 119 | Data: 120 | - Name: $k 121 | Entry: 1 122 | Data: CanvasInstance 123 | - Name: $v 124 | Entry: 7 125 | Data: 7|UdonSharp.Compiler.FieldDefinition, UdonSharp.Editor 126 | - Name: k__BackingField 127 | Entry: 1 128 | Data: CanvasInstance 129 | - Name: k__BackingField 130 | Entry: 7 131 | Data: 8|System.RuntimeType, mscorlib 132 | - Name: 133 | Entry: 1 134 | Data: UnityEngine.Canvas, UnityEngine.UIModule 135 | - Name: 136 | Entry: 8 137 | Data: 138 | - Name: k__BackingField 139 | Entry: 9 140 | Data: 8 141 | - Name: k__BackingField 142 | Entry: 7 143 | Data: System.Nullable`1[[UdonSharp.UdonSyncMode, UdonSharp.Runtime]], mscorlib 144 | - Name: 145 | Entry: 6 146 | Data: 147 | - Name: 148 | Entry: 8 149 | Data: 150 | - Name: k__BackingField 151 | Entry: 5 152 | Data: true 153 | - Name: _fieldAttributes 154 | Entry: 7 155 | Data: 9|System.Collections.Generic.List`1[[System.Attribute, mscorlib]], mscorlib 156 | - Name: 157 | Entry: 12 158 | Data: 1 159 | - Name: 160 | Entry: 7 161 | Data: 10|UnityEngine.HeaderAttribute, UnityEngine.CoreModule 162 | - Name: header 163 | Entry: 1 164 | Data: Used internally, do not change, except if really needed 165 | - Name: 166 | Entry: 8 167 | Data: 168 | - Name: 169 | Entry: 13 170 | Data: 171 | - Name: 172 | Entry: 8 173 | Data: 174 | - Name: 175 | Entry: 8 176 | Data: 177 | - Name: 178 | Entry: 8 179 | Data: 180 | - Name: 181 | Entry: 13 182 | Data: 183 | - Name: 184 | Entry: 8 185 | Data: 186 | -------------------------------------------------------------------------------- /Scripts/AndroidPanelModule.asset.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 872edc65781d9904a950c69f6602c83c 3 | NativeFormatImporter: 4 | externalObjects: {} 5 | mainObjectFileID: 11400000 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Scripts/AndroidPanelModule.cs: -------------------------------------------------------------------------------- 1 |  2 | using UdonSharp; 3 | using UnityEngine; 4 | using VRC.SDKBase; 5 | using VRC.Udon; 6 | 7 | 8 | 9 | namespace myro 10 | { 11 | [UdonBehaviourSyncMode(BehaviourSyncMode.None)] 12 | public class AndroidPanelModule : UdonSharpBehaviour 13 | { 14 | [Header("Set your panel here")] 15 | public PortablePanel PortablePanelInstance; 16 | 17 | [Header("Used internally, do not change, except if really needed")] 18 | public Canvas CanvasInstance; 19 | 20 | void Start() 21 | { 22 | CanvasInstance.gameObject.SetActive(false); 23 | } 24 | 25 | public void ToggleMenu() 26 | { 27 | if (PortablePanelInstance.IsPanelOpen()) 28 | { 29 | PortablePanelInstance.ForceClosePanel(); 30 | } 31 | else 32 | { 33 | PortablePanelInstance.ForceOpenPanel(); 34 | } 35 | } 36 | 37 | public bool IsPlayerOnAndroid() 38 | { 39 | #if UNITY_ANDROID 40 | return !Networking.LocalPlayer.IsUserInVR(); 41 | #else 42 | return false; 43 | #endif 44 | } 45 | 46 | public override void OnPlayerJoined(VRCPlayerApi player) 47 | { 48 | if (player.isLocal) 49 | { 50 | CanvasInstance.gameObject.SetActive(IsPlayerOnAndroid()); 51 | } 52 | } 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /Scripts/AndroidPanelModule.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: f043114674f43f2448af5493f1cacf41 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Scripts/PortablePanel.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!114 &11400000 4 | MonoBehaviour: 5 | m_ObjectHideFlags: 0 6 | m_CorrespondingSourceObject: {fileID: 0} 7 | m_PrefabInstance: {fileID: 0} 8 | m_PrefabAsset: {fileID: 0} 9 | m_GameObject: {fileID: 0} 10 | m_Enabled: 1 11 | m_EditorHideFlags: 0 12 | m_Script: {fileID: 11500000, guid: c333ccfdd0cbdbc4ca30cef2dd6e6b9b, type: 3} 13 | m_Name: PortablePanel 14 | m_EditorClassIdentifier: 15 | serializedUdonProgramAsset: {fileID: 11400000, guid: fc0a2d339cee7da4d9d94b4b65d2d2d1, 16 | type: 2} 17 | udonAssembly: 18 | assemblyError: 19 | sourceCsScript: {fileID: 11500000, guid: 6c16e461e59a5a340a22f538d64095e8, type: 3} 20 | scriptVersion: 2 21 | compiledVersion: 2 22 | behaviourSyncMode: 1 23 | hasInteractEvent: 0 24 | scriptID: -4635888521502335671 25 | serializationData: 26 | SerializedFormat: 2 27 | SerializedBytes: 28 | ReferencedUnityObjects: [] 29 | SerializedBytesString: 30 | Prefab: {fileID: 0} 31 | PrefabModificationsReferencedUnityObjects: [] 32 | PrefabModifications: [] 33 | SerializationNodes: 34 | - Name: fieldDefinitions 35 | Entry: 7 36 | Data: 0|System.Collections.Generic.Dictionary`2[[System.String, mscorlib],[UdonSharp.Compiler.FieldDefinition, 37 | UdonSharp.Editor]], mscorlib 38 | - Name: comparer 39 | Entry: 7 40 | Data: 1|System.Collections.Generic.GenericEqualityComparer`1[[System.String, 41 | mscorlib]], mscorlib 42 | - Name: 43 | Entry: 8 44 | Data: 45 | - Name: 46 | Entry: 12 47 | Data: 34 48 | - Name: 49 | Entry: 7 50 | Data: 51 | - Name: $k 52 | Entry: 1 53 | Data: Panel 54 | - Name: $v 55 | Entry: 7 56 | Data: 2|UdonSharp.Compiler.FieldDefinition, UdonSharp.Editor 57 | - Name: k__BackingField 58 | Entry: 1 59 | Data: Panel 60 | - Name: k__BackingField 61 | Entry: 7 62 | Data: 3|System.RuntimeType, mscorlib 63 | - Name: 64 | Entry: 1 65 | Data: UnityEngine.GameObject, UnityEngine.CoreModule 66 | - Name: 67 | Entry: 8 68 | Data: 69 | - Name: k__BackingField 70 | Entry: 9 71 | Data: 3 72 | - Name: k__BackingField 73 | Entry: 7 74 | Data: System.Nullable`1[[UdonSharp.UdonSyncMode, UdonSharp.Runtime]], mscorlib 75 | - Name: 76 | Entry: 6 77 | Data: 78 | - Name: 79 | Entry: 8 80 | Data: 81 | - Name: k__BackingField 82 | Entry: 5 83 | Data: true 84 | - Name: _fieldAttributes 85 | Entry: 7 86 | Data: 4|System.Collections.Generic.List`1[[System.Attribute, mscorlib]], mscorlib 87 | - Name: 88 | Entry: 12 89 | Data: 1 90 | - Name: 91 | Entry: 7 92 | Data: 5|UnityEngine.HeaderAttribute, UnityEngine.CoreModule 93 | - Name: header 94 | Entry: 1 95 | Data: See README file for additional help and infos 96 | - Name: 97 | Entry: 8 98 | Data: 99 | - Name: 100 | Entry: 13 101 | Data: 102 | - Name: 103 | Entry: 8 104 | Data: 105 | - Name: 106 | Entry: 8 107 | Data: 108 | - Name: 109 | Entry: 8 110 | Data: 111 | - Name: 112 | Entry: 7 113 | Data: 114 | - Name: $k 115 | Entry: 1 116 | Data: _panelTransf 117 | - Name: $v 118 | Entry: 7 119 | Data: 6|UdonSharp.Compiler.FieldDefinition, UdonSharp.Editor 120 | - Name: k__BackingField 121 | Entry: 1 122 | Data: _panelTransf 123 | - Name: k__BackingField 124 | Entry: 7 125 | Data: 7|System.RuntimeType, mscorlib 126 | - Name: 127 | Entry: 1 128 | Data: UnityEngine.Transform, UnityEngine.CoreModule 129 | - Name: 130 | Entry: 8 131 | Data: 132 | - Name: k__BackingField 133 | Entry: 9 134 | Data: 7 135 | - Name: k__BackingField 136 | Entry: 7 137 | Data: System.Nullable`1[[UdonSharp.UdonSyncMode, UdonSharp.Runtime]], mscorlib 138 | - Name: 139 | Entry: 6 140 | Data: 141 | - Name: 142 | Entry: 8 143 | Data: 144 | - Name: k__BackingField 145 | Entry: 5 146 | Data: false 147 | - Name: _fieldAttributes 148 | Entry: 7 149 | Data: 8|System.Collections.Generic.List`1[[System.Attribute, mscorlib]], mscorlib 150 | - Name: 151 | Entry: 12 152 | Data: 0 153 | - Name: 154 | Entry: 13 155 | Data: 156 | - Name: 157 | Entry: 8 158 | Data: 159 | - Name: 160 | Entry: 8 161 | Data: 162 | - Name: 163 | Entry: 8 164 | Data: 165 | - Name: 166 | Entry: 7 167 | Data: 168 | - Name: $k 169 | Entry: 1 170 | Data: TabOnHold 171 | - Name: $v 172 | Entry: 7 173 | Data: 9|UdonSharp.Compiler.FieldDefinition, UdonSharp.Editor 174 | - Name: k__BackingField 175 | Entry: 1 176 | Data: TabOnHold 177 | - Name: k__BackingField 178 | Entry: 7 179 | Data: 10|System.RuntimeType, mscorlib 180 | - Name: 181 | Entry: 1 182 | Data: System.Boolean, mscorlib 183 | - Name: 184 | Entry: 8 185 | Data: 186 | - Name: k__BackingField 187 | Entry: 9 188 | Data: 10 189 | - Name: k__BackingField 190 | Entry: 7 191 | Data: System.Nullable`1[[UdonSharp.UdonSyncMode, UdonSharp.Runtime]], mscorlib 192 | - Name: 193 | Entry: 6 194 | Data: 195 | - Name: 196 | Entry: 8 197 | Data: 198 | - Name: k__BackingField 199 | Entry: 5 200 | Data: true 201 | - Name: _fieldAttributes 202 | Entry: 7 203 | Data: 11|System.Collections.Generic.List`1[[System.Attribute, mscorlib]], mscorlib 204 | - Name: 205 | Entry: 12 206 | Data: 0 207 | - Name: 208 | Entry: 13 209 | Data: 210 | - Name: 211 | Entry: 8 212 | Data: 213 | - Name: 214 | Entry: 8 215 | Data: 216 | - Name: 217 | Entry: 8 218 | Data: 219 | - Name: 220 | Entry: 7 221 | Data: 222 | - Name: $k 223 | Entry: 1 224 | Data: GestureMode 225 | - Name: $v 226 | Entry: 7 227 | Data: 12|UdonSharp.Compiler.FieldDefinition, UdonSharp.Editor 228 | - Name: k__BackingField 229 | Entry: 1 230 | Data: GestureMode 231 | - Name: k__BackingField 232 | Entry: 7 233 | Data: 13|System.RuntimeType, mscorlib 234 | - Name: 235 | Entry: 1 236 | Data: myro.EGestureMode, Assembly-CSharp 237 | - Name: 238 | Entry: 8 239 | Data: 240 | - Name: k__BackingField 241 | Entry: 7 242 | Data: 14|System.RuntimeType, mscorlib 243 | - Name: 244 | Entry: 1 245 | Data: System.Int32, mscorlib 246 | - Name: 247 | Entry: 8 248 | Data: 249 | - Name: k__BackingField 250 | Entry: 7 251 | Data: System.Nullable`1[[UdonSharp.UdonSyncMode, UdonSharp.Runtime]], mscorlib 252 | - Name: 253 | Entry: 6 254 | Data: 255 | - Name: 256 | Entry: 8 257 | Data: 258 | - Name: k__BackingField 259 | Entry: 5 260 | Data: true 261 | - Name: _fieldAttributes 262 | Entry: 7 263 | Data: 15|System.Collections.Generic.List`1[[System.Attribute, mscorlib]], mscorlib 264 | - Name: 265 | Entry: 12 266 | Data: 0 267 | - Name: 268 | Entry: 13 269 | Data: 270 | - Name: 271 | Entry: 8 272 | Data: 273 | - Name: 274 | Entry: 8 275 | Data: 276 | - Name: 277 | Entry: 8 278 | Data: 279 | - Name: 280 | Entry: 7 281 | Data: 282 | - Name: $k 283 | Entry: 1 284 | Data: CloseBehaviour 285 | - Name: $v 286 | Entry: 7 287 | Data: 16|UdonSharp.Compiler.FieldDefinition, UdonSharp.Editor 288 | - Name: k__BackingField 289 | Entry: 1 290 | Data: CloseBehaviour 291 | - Name: k__BackingField 292 | Entry: 7 293 | Data: 17|System.RuntimeType, mscorlib 294 | - Name: 295 | Entry: 1 296 | Data: myro.EClosingBehaviour, Assembly-CSharp 297 | - Name: 298 | Entry: 8 299 | Data: 300 | - Name: k__BackingField 301 | Entry: 9 302 | Data: 14 303 | - Name: k__BackingField 304 | Entry: 7 305 | Data: System.Nullable`1[[UdonSharp.UdonSyncMode, UdonSharp.Runtime]], mscorlib 306 | - Name: 307 | Entry: 6 308 | Data: 309 | - Name: 310 | Entry: 8 311 | Data: 312 | - Name: k__BackingField 313 | Entry: 5 314 | Data: true 315 | - Name: _fieldAttributes 316 | Entry: 7 317 | Data: 18|System.Collections.Generic.List`1[[System.Attribute, mscorlib]], mscorlib 318 | - Name: 319 | Entry: 12 320 | Data: 0 321 | - Name: 322 | Entry: 13 323 | Data: 324 | - Name: 325 | Entry: 8 326 | Data: 327 | - Name: 328 | Entry: 8 329 | Data: 330 | - Name: 331 | Entry: 8 332 | Data: 333 | - Name: 334 | Entry: 7 335 | Data: 336 | - Name: $k 337 | Entry: 1 338 | Data: _pickupModule 339 | - Name: $v 340 | Entry: 7 341 | Data: 19|UdonSharp.Compiler.FieldDefinition, UdonSharp.Editor 342 | - Name: k__BackingField 343 | Entry: 1 344 | Data: _pickupModule 345 | - Name: k__BackingField 346 | Entry: 7 347 | Data: 20|System.RuntimeType, mscorlib 348 | - Name: 349 | Entry: 1 350 | Data: myro.PortablePanelPickupModule, Assembly-CSharp 351 | - Name: 352 | Entry: 8 353 | Data: 354 | - Name: k__BackingField 355 | Entry: 7 356 | Data: 21|System.RuntimeType, mscorlib 357 | - Name: 358 | Entry: 1 359 | Data: VRC.Udon.UdonBehaviour, VRC.Udon 360 | - Name: 361 | Entry: 8 362 | Data: 363 | - Name: k__BackingField 364 | Entry: 7 365 | Data: System.Nullable`1[[UdonSharp.UdonSyncMode, UdonSharp.Runtime]], mscorlib 366 | - Name: 367 | Entry: 6 368 | Data: 369 | - Name: 370 | Entry: 8 371 | Data: 372 | - Name: k__BackingField 373 | Entry: 5 374 | Data: false 375 | - Name: _fieldAttributes 376 | Entry: 7 377 | Data: 22|System.Collections.Generic.List`1[[System.Attribute, mscorlib]], mscorlib 378 | - Name: 379 | Entry: 12 380 | Data: 0 381 | - Name: 382 | Entry: 13 383 | Data: 384 | - Name: 385 | Entry: 8 386 | Data: 387 | - Name: 388 | Entry: 8 389 | Data: 390 | - Name: 391 | Entry: 8 392 | Data: 393 | - Name: 394 | Entry: 7 395 | Data: 396 | - Name: $k 397 | Entry: 1 398 | Data: _isPickupable 399 | - Name: $v 400 | Entry: 7 401 | Data: 23|UdonSharp.Compiler.FieldDefinition, UdonSharp.Editor 402 | - Name: k__BackingField 403 | Entry: 1 404 | Data: _isPickupable 405 | - Name: k__BackingField 406 | Entry: 9 407 | Data: 10 408 | - Name: k__BackingField 409 | Entry: 9 410 | Data: 10 411 | - Name: k__BackingField 412 | Entry: 7 413 | Data: System.Nullable`1[[UdonSharp.UdonSyncMode, UdonSharp.Runtime]], mscorlib 414 | - Name: 415 | Entry: 6 416 | Data: 417 | - Name: 418 | Entry: 8 419 | Data: 420 | - Name: k__BackingField 421 | Entry: 5 422 | Data: true 423 | - Name: _fieldAttributes 424 | Entry: 7 425 | Data: 24|System.Collections.Generic.List`1[[System.Attribute, mscorlib]], mscorlib 426 | - Name: 427 | Entry: 12 428 | Data: 1 429 | - Name: 430 | Entry: 7 431 | Data: 25|UnityEngine.SerializeField, UnityEngine.CoreModule 432 | - Name: 433 | Entry: 8 434 | Data: 435 | - Name: 436 | Entry: 13 437 | Data: 438 | - Name: 439 | Entry: 8 440 | Data: 441 | - Name: 442 | Entry: 8 443 | Data: 444 | - Name: 445 | Entry: 8 446 | Data: 447 | - Name: 448 | Entry: 7 449 | Data: 450 | - Name: $k 451 | Entry: 1 452 | Data: MaxScale 453 | - Name: $v 454 | Entry: 7 455 | Data: 26|UdonSharp.Compiler.FieldDefinition, UdonSharp.Editor 456 | - Name: k__BackingField 457 | Entry: 1 458 | Data: MaxScale 459 | - Name: k__BackingField 460 | Entry: 7 461 | Data: 27|System.RuntimeType, mscorlib 462 | - Name: 463 | Entry: 1 464 | Data: System.Single, mscorlib 465 | - Name: 466 | Entry: 8 467 | Data: 468 | - Name: k__BackingField 469 | Entry: 9 470 | Data: 27 471 | - Name: k__BackingField 472 | Entry: 7 473 | Data: System.Nullable`1[[UdonSharp.UdonSyncMode, UdonSharp.Runtime]], mscorlib 474 | - Name: 475 | Entry: 6 476 | Data: 477 | - Name: 478 | Entry: 8 479 | Data: 480 | - Name: k__BackingField 481 | Entry: 5 482 | Data: true 483 | - Name: _fieldAttributes 484 | Entry: 7 485 | Data: 28|System.Collections.Generic.List`1[[System.Attribute, mscorlib]], mscorlib 486 | - Name: 487 | Entry: 12 488 | Data: 0 489 | - Name: 490 | Entry: 13 491 | Data: 492 | - Name: 493 | Entry: 8 494 | Data: 495 | - Name: 496 | Entry: 8 497 | Data: 498 | - Name: 499 | Entry: 8 500 | Data: 501 | - Name: 502 | Entry: 7 503 | Data: 504 | - Name: $k 505 | Entry: 1 506 | Data: MinScale 507 | - Name: $v 508 | Entry: 7 509 | Data: 29|UdonSharp.Compiler.FieldDefinition, UdonSharp.Editor 510 | - Name: k__BackingField 511 | Entry: 1 512 | Data: MinScale 513 | - Name: k__BackingField 514 | Entry: 9 515 | Data: 27 516 | - Name: k__BackingField 517 | Entry: 9 518 | Data: 27 519 | - Name: k__BackingField 520 | Entry: 7 521 | Data: System.Nullable`1[[UdonSharp.UdonSyncMode, UdonSharp.Runtime]], mscorlib 522 | - Name: 523 | Entry: 6 524 | Data: 525 | - Name: 526 | Entry: 8 527 | Data: 528 | - Name: k__BackingField 529 | Entry: 5 530 | Data: true 531 | - Name: _fieldAttributes 532 | Entry: 7 533 | Data: 30|System.Collections.Generic.List`1[[System.Attribute, mscorlib]], mscorlib 534 | - Name: 535 | Entry: 12 536 | Data: 0 537 | - Name: 538 | Entry: 13 539 | Data: 540 | - Name: 541 | Entry: 8 542 | Data: 543 | - Name: 544 | Entry: 8 545 | Data: 546 | - Name: 547 | Entry: 8 548 | Data: 549 | - Name: 550 | Entry: 7 551 | Data: 552 | - Name: $k 553 | Entry: 1 554 | Data: MaxDistanceBeforeClosingThePanel 555 | - Name: $v 556 | Entry: 7 557 | Data: 31|UdonSharp.Compiler.FieldDefinition, UdonSharp.Editor 558 | - Name: k__BackingField 559 | Entry: 1 560 | Data: MaxDistanceBeforeClosingThePanel 561 | - Name: k__BackingField 562 | Entry: 9 563 | Data: 27 564 | - Name: k__BackingField 565 | Entry: 9 566 | Data: 27 567 | - Name: k__BackingField 568 | Entry: 7 569 | Data: System.Nullable`1[[UdonSharp.UdonSyncMode, UdonSharp.Runtime]], mscorlib 570 | - Name: 571 | Entry: 6 572 | Data: 573 | - Name: 574 | Entry: 8 575 | Data: 576 | - Name: k__BackingField 577 | Entry: 5 578 | Data: true 579 | - Name: _fieldAttributes 580 | Entry: 7 581 | Data: 32|System.Collections.Generic.List`1[[System.Attribute, mscorlib]], mscorlib 582 | - Name: 583 | Entry: 12 584 | Data: 0 585 | - Name: 586 | Entry: 13 587 | Data: 588 | - Name: 589 | Entry: 8 590 | Data: 591 | - Name: 592 | Entry: 8 593 | Data: 594 | - Name: 595 | Entry: 8 596 | Data: 597 | - Name: 598 | Entry: 7 599 | Data: 600 | - Name: $k 601 | Entry: 1 602 | Data: PanelScaleOnDesktop 603 | - Name: $v 604 | Entry: 7 605 | Data: 33|UdonSharp.Compiler.FieldDefinition, UdonSharp.Editor 606 | - Name: k__BackingField 607 | Entry: 1 608 | Data: PanelScaleOnDesktop 609 | - Name: k__BackingField 610 | Entry: 9 611 | Data: 27 612 | - Name: k__BackingField 613 | Entry: 9 614 | Data: 27 615 | - Name: k__BackingField 616 | Entry: 7 617 | Data: System.Nullable`1[[UdonSharp.UdonSyncMode, UdonSharp.Runtime]], mscorlib 618 | - Name: 619 | Entry: 6 620 | Data: 621 | - Name: 622 | Entry: 8 623 | Data: 624 | - Name: k__BackingField 625 | Entry: 5 626 | Data: true 627 | - Name: _fieldAttributes 628 | Entry: 7 629 | Data: 34|System.Collections.Generic.List`1[[System.Attribute, mscorlib]], mscorlib 630 | - Name: 631 | Entry: 12 632 | Data: 0 633 | - Name: 634 | Entry: 13 635 | Data: 636 | - Name: 637 | Entry: 8 638 | Data: 639 | - Name: 640 | Entry: 8 641 | Data: 642 | - Name: 643 | Entry: 8 644 | Data: 645 | - Name: 646 | Entry: 7 647 | Data: 648 | - Name: $k 649 | Entry: 1 650 | Data: _delayInitialisation 651 | - Name: $v 652 | Entry: 7 653 | Data: 35|UdonSharp.Compiler.FieldDefinition, UdonSharp.Editor 654 | - Name: k__BackingField 655 | Entry: 1 656 | Data: _delayInitialisation 657 | - Name: k__BackingField 658 | Entry: 9 659 | Data: 10 660 | - Name: k__BackingField 661 | Entry: 9 662 | Data: 10 663 | - Name: k__BackingField 664 | Entry: 7 665 | Data: System.Nullable`1[[UdonSharp.UdonSyncMode, UdonSharp.Runtime]], mscorlib 666 | - Name: 667 | Entry: 6 668 | Data: 669 | - Name: 670 | Entry: 8 671 | Data: 672 | - Name: k__BackingField 673 | Entry: 5 674 | Data: true 675 | - Name: _fieldAttributes 676 | Entry: 7 677 | Data: 36|System.Collections.Generic.List`1[[System.Attribute, mscorlib]], mscorlib 678 | - Name: 679 | Entry: 12 680 | Data: 2 681 | - Name: 682 | Entry: 7 683 | Data: 37|UnityEngine.HeaderAttribute, UnityEngine.CoreModule 684 | - Name: header 685 | Entry: 1 686 | Data: Advanced settings, change them only if you really need to 687 | - Name: 688 | Entry: 8 689 | Data: 690 | - Name: 691 | Entry: 7 692 | Data: 38|UnityEngine.SerializeField, UnityEngine.CoreModule 693 | - Name: 694 | Entry: 8 695 | Data: 696 | - Name: 697 | Entry: 13 698 | Data: 699 | - Name: 700 | Entry: 8 701 | Data: 702 | - Name: 703 | Entry: 8 704 | Data: 705 | - Name: 706 | Entry: 8 707 | Data: 708 | - Name: 709 | Entry: 7 710 | Data: 711 | - Name: $k 712 | Entry: 1 713 | Data: _localPlayer 714 | - Name: $v 715 | Entry: 7 716 | Data: 39|UdonSharp.Compiler.FieldDefinition, UdonSharp.Editor 717 | - Name: k__BackingField 718 | Entry: 1 719 | Data: _localPlayer 720 | - Name: k__BackingField 721 | Entry: 7 722 | Data: 40|System.RuntimeType, mscorlib 723 | - Name: 724 | Entry: 1 725 | Data: VRC.SDKBase.VRCPlayerApi, VRCSDKBase 726 | - Name: 727 | Entry: 8 728 | Data: 729 | - Name: k__BackingField 730 | Entry: 9 731 | Data: 40 732 | - Name: k__BackingField 733 | Entry: 7 734 | Data: System.Nullable`1[[UdonSharp.UdonSyncMode, UdonSharp.Runtime]], mscorlib 735 | - Name: 736 | Entry: 6 737 | Data: 738 | - Name: 739 | Entry: 8 740 | Data: 741 | - Name: k__BackingField 742 | Entry: 5 743 | Data: false 744 | - Name: _fieldAttributes 745 | Entry: 7 746 | Data: 41|System.Collections.Generic.List`1[[System.Attribute, mscorlib]], mscorlib 747 | - Name: 748 | Entry: 12 749 | Data: 0 750 | - Name: 751 | Entry: 13 752 | Data: 753 | - Name: 754 | Entry: 8 755 | Data: 756 | - Name: 757 | Entry: 8 758 | Data: 759 | - Name: 760 | Entry: 8 761 | Data: 762 | - Name: 763 | Entry: 7 764 | Data: 765 | - Name: $k 766 | Entry: 1 767 | Data: _grabbed 768 | - Name: $v 769 | Entry: 7 770 | Data: 42|UdonSharp.Compiler.FieldDefinition, UdonSharp.Editor 771 | - Name: k__BackingField 772 | Entry: 1 773 | Data: _grabbed 774 | - Name: k__BackingField 775 | Entry: 7 776 | Data: 43|System.RuntimeType, mscorlib 777 | - Name: 778 | Entry: 1 779 | Data: myro.EGrabbed, Assembly-CSharp 780 | - Name: 781 | Entry: 8 782 | Data: 783 | - Name: k__BackingField 784 | Entry: 9 785 | Data: 14 786 | - Name: k__BackingField 787 | Entry: 7 788 | Data: System.Nullable`1[[UdonSharp.UdonSyncMode, UdonSharp.Runtime]], mscorlib 789 | - Name: 790 | Entry: 6 791 | Data: 792 | - Name: 793 | Entry: 8 794 | Data: 795 | - Name: k__BackingField 796 | Entry: 5 797 | Data: false 798 | - Name: _fieldAttributes 799 | Entry: 7 800 | Data: 44|System.Collections.Generic.List`1[[System.Attribute, mscorlib]], mscorlib 801 | - Name: 802 | Entry: 12 803 | Data: 0 804 | - Name: 805 | Entry: 13 806 | Data: 807 | - Name: 808 | Entry: 8 809 | Data: 810 | - Name: 811 | Entry: 8 812 | Data: 813 | - Name: 814 | Entry: 8 815 | Data: 816 | - Name: 817 | Entry: 7 818 | Data: 819 | - Name: $k 820 | Entry: 1 821 | Data: _isRightHandTriggeredGrab 822 | - Name: $v 823 | Entry: 7 824 | Data: 45|UdonSharp.Compiler.FieldDefinition, UdonSharp.Editor 825 | - Name: k__BackingField 826 | Entry: 1 827 | Data: _isRightHandTriggeredGrab 828 | - Name: k__BackingField 829 | Entry: 9 830 | Data: 10 831 | - Name: k__BackingField 832 | Entry: 9 833 | Data: 10 834 | - Name: k__BackingField 835 | Entry: 7 836 | Data: System.Nullable`1[[UdonSharp.UdonSyncMode, UdonSharp.Runtime]], mscorlib 837 | - Name: 838 | Entry: 6 839 | Data: 840 | - Name: 841 | Entry: 8 842 | Data: 843 | - Name: k__BackingField 844 | Entry: 5 845 | Data: false 846 | - Name: _fieldAttributes 847 | Entry: 7 848 | Data: 46|System.Collections.Generic.List`1[[System.Attribute, mscorlib]], mscorlib 849 | - Name: 850 | Entry: 12 851 | Data: 0 852 | - Name: 853 | Entry: 13 854 | Data: 855 | - Name: 856 | Entry: 8 857 | Data: 858 | - Name: 859 | Entry: 8 860 | Data: 861 | - Name: 862 | Entry: 8 863 | Data: 864 | - Name: 865 | Entry: 7 866 | Data: 867 | - Name: $k 868 | Entry: 1 869 | Data: _isLeftHandTriggeredGrab 870 | - Name: $v 871 | Entry: 7 872 | Data: 47|UdonSharp.Compiler.FieldDefinition, UdonSharp.Editor 873 | - Name: k__BackingField 874 | Entry: 1 875 | Data: _isLeftHandTriggeredGrab 876 | - Name: k__BackingField 877 | Entry: 9 878 | Data: 10 879 | - Name: k__BackingField 880 | Entry: 9 881 | Data: 10 882 | - Name: k__BackingField 883 | Entry: 7 884 | Data: System.Nullable`1[[UdonSharp.UdonSyncMode, UdonSharp.Runtime]], mscorlib 885 | - Name: 886 | Entry: 6 887 | Data: 888 | - Name: 889 | Entry: 8 890 | Data: 891 | - Name: k__BackingField 892 | Entry: 5 893 | Data: false 894 | - Name: _fieldAttributes 895 | Entry: 7 896 | Data: 48|System.Collections.Generic.List`1[[System.Attribute, mscorlib]], mscorlib 897 | - Name: 898 | Entry: 12 899 | Data: 0 900 | - Name: 901 | Entry: 13 902 | Data: 903 | - Name: 904 | Entry: 8 905 | Data: 906 | - Name: 907 | Entry: 8 908 | Data: 909 | - Name: 910 | Entry: 8 911 | Data: 912 | - Name: 913 | Entry: 7 914 | Data: 915 | - Name: $k 916 | Entry: 1 917 | Data: _isRightHandTriggeredTrigger 918 | - Name: $v 919 | Entry: 7 920 | Data: 49|UdonSharp.Compiler.FieldDefinition, UdonSharp.Editor 921 | - Name: k__BackingField 922 | Entry: 1 923 | Data: _isRightHandTriggeredTrigger 924 | - Name: k__BackingField 925 | Entry: 9 926 | Data: 10 927 | - Name: k__BackingField 928 | Entry: 9 929 | Data: 10 930 | - Name: k__BackingField 931 | Entry: 7 932 | Data: System.Nullable`1[[UdonSharp.UdonSyncMode, UdonSharp.Runtime]], mscorlib 933 | - Name: 934 | Entry: 6 935 | Data: 936 | - Name: 937 | Entry: 8 938 | Data: 939 | - Name: k__BackingField 940 | Entry: 5 941 | Data: false 942 | - Name: _fieldAttributes 943 | Entry: 7 944 | Data: 50|System.Collections.Generic.List`1[[System.Attribute, mscorlib]], mscorlib 945 | - Name: 946 | Entry: 12 947 | Data: 0 948 | - Name: 949 | Entry: 13 950 | Data: 951 | - Name: 952 | Entry: 8 953 | Data: 954 | - Name: 955 | Entry: 8 956 | Data: 957 | - Name: 958 | Entry: 8 959 | Data: 960 | - Name: 961 | Entry: 7 962 | Data: 963 | - Name: $k 964 | Entry: 1 965 | Data: _isLeftHandTriggeredTrigger 966 | - Name: $v 967 | Entry: 7 968 | Data: 51|UdonSharp.Compiler.FieldDefinition, UdonSharp.Editor 969 | - Name: k__BackingField 970 | Entry: 1 971 | Data: _isLeftHandTriggeredTrigger 972 | - Name: k__BackingField 973 | Entry: 9 974 | Data: 10 975 | - Name: k__BackingField 976 | Entry: 9 977 | Data: 10 978 | - Name: k__BackingField 979 | Entry: 7 980 | Data: System.Nullable`1[[UdonSharp.UdonSyncMode, UdonSharp.Runtime]], mscorlib 981 | - Name: 982 | Entry: 6 983 | Data: 984 | - Name: 985 | Entry: 8 986 | Data: 987 | - Name: k__BackingField 988 | Entry: 5 989 | Data: false 990 | - Name: _fieldAttributes 991 | Entry: 7 992 | Data: 52|System.Collections.Generic.List`1[[System.Attribute, mscorlib]], mscorlib 993 | - Name: 994 | Entry: 12 995 | Data: 0 996 | - Name: 997 | Entry: 13 998 | Data: 999 | - Name: 1000 | Entry: 8 1001 | Data: 1002 | - Name: 1003 | Entry: 8 1004 | Data: 1005 | - Name: 1006 | Entry: 8 1007 | Data: 1008 | - Name: 1009 | Entry: 7 1010 | Data: 1011 | - Name: $k 1012 | Entry: 1 1013 | Data: _timeRightHandGesture 1014 | - Name: $v 1015 | Entry: 7 1016 | Data: 53|UdonSharp.Compiler.FieldDefinition, UdonSharp.Editor 1017 | - Name: k__BackingField 1018 | Entry: 1 1019 | Data: _timeRightHandGesture 1020 | - Name: k__BackingField 1021 | Entry: 9 1022 | Data: 27 1023 | - Name: k__BackingField 1024 | Entry: 9 1025 | Data: 27 1026 | - Name: k__BackingField 1027 | Entry: 7 1028 | Data: System.Nullable`1[[UdonSharp.UdonSyncMode, UdonSharp.Runtime]], mscorlib 1029 | - Name: 1030 | Entry: 6 1031 | Data: 1032 | - Name: 1033 | Entry: 8 1034 | Data: 1035 | - Name: k__BackingField 1036 | Entry: 5 1037 | Data: false 1038 | - Name: _fieldAttributes 1039 | Entry: 7 1040 | Data: 54|System.Collections.Generic.List`1[[System.Attribute, mscorlib]], mscorlib 1041 | - Name: 1042 | Entry: 12 1043 | Data: 0 1044 | - Name: 1045 | Entry: 13 1046 | Data: 1047 | - Name: 1048 | Entry: 8 1049 | Data: 1050 | - Name: 1051 | Entry: 8 1052 | Data: 1053 | - Name: 1054 | Entry: 8 1055 | Data: 1056 | - Name: 1057 | Entry: 7 1058 | Data: 1059 | - Name: $k 1060 | Entry: 1 1061 | Data: _timeLeftHandGesture 1062 | - Name: $v 1063 | Entry: 7 1064 | Data: 55|UdonSharp.Compiler.FieldDefinition, UdonSharp.Editor 1065 | - Name: k__BackingField 1066 | Entry: 1 1067 | Data: _timeLeftHandGesture 1068 | - Name: k__BackingField 1069 | Entry: 9 1070 | Data: 27 1071 | - Name: k__BackingField 1072 | Entry: 9 1073 | Data: 27 1074 | - Name: k__BackingField 1075 | Entry: 7 1076 | Data: System.Nullable`1[[UdonSharp.UdonSyncMode, UdonSharp.Runtime]], mscorlib 1077 | - Name: 1078 | Entry: 6 1079 | Data: 1080 | - Name: 1081 | Entry: 8 1082 | Data: 1083 | - Name: k__BackingField 1084 | Entry: 5 1085 | Data: false 1086 | - Name: _fieldAttributes 1087 | Entry: 7 1088 | Data: 56|System.Collections.Generic.List`1[[System.Attribute, mscorlib]], mscorlib 1089 | - Name: 1090 | Entry: 12 1091 | Data: 0 1092 | - Name: 1093 | Entry: 13 1094 | Data: 1095 | - Name: 1096 | Entry: 8 1097 | Data: 1098 | - Name: 1099 | Entry: 8 1100 | Data: 1101 | - Name: 1102 | Entry: 8 1103 | Data: 1104 | - Name: 1105 | Entry: 7 1106 | Data: 1107 | - Name: $k 1108 | Entry: 1 1109 | Data: _startDistanceBetweenTwoHands 1110 | - Name: $v 1111 | Entry: 7 1112 | Data: 57|UdonSharp.Compiler.FieldDefinition, UdonSharp.Editor 1113 | - Name: k__BackingField 1114 | Entry: 1 1115 | Data: _startDistanceBetweenTwoHands 1116 | - Name: k__BackingField 1117 | Entry: 9 1118 | Data: 27 1119 | - Name: k__BackingField 1120 | Entry: 9 1121 | Data: 27 1122 | - Name: k__BackingField 1123 | Entry: 7 1124 | Data: System.Nullable`1[[UdonSharp.UdonSyncMode, UdonSharp.Runtime]], mscorlib 1125 | - Name: 1126 | Entry: 6 1127 | Data: 1128 | - Name: 1129 | Entry: 8 1130 | Data: 1131 | - Name: k__BackingField 1132 | Entry: 5 1133 | Data: false 1134 | - Name: _fieldAttributes 1135 | Entry: 7 1136 | Data: 58|System.Collections.Generic.List`1[[System.Attribute, mscorlib]], mscorlib 1137 | - Name: 1138 | Entry: 12 1139 | Data: 0 1140 | - Name: 1141 | Entry: 13 1142 | Data: 1143 | - Name: 1144 | Entry: 8 1145 | Data: 1146 | - Name: 1147 | Entry: 8 1148 | Data: 1149 | - Name: 1150 | Entry: 8 1151 | Data: 1152 | - Name: 1153 | Entry: 7 1154 | Data: 1155 | - Name: $k 1156 | Entry: 1 1157 | Data: _startScale 1158 | - Name: $v 1159 | Entry: 7 1160 | Data: 59|UdonSharp.Compiler.FieldDefinition, UdonSharp.Editor 1161 | - Name: k__BackingField 1162 | Entry: 1 1163 | Data: _startScale 1164 | - Name: k__BackingField 1165 | Entry: 9 1166 | Data: 27 1167 | - Name: k__BackingField 1168 | Entry: 9 1169 | Data: 27 1170 | - Name: k__BackingField 1171 | Entry: 7 1172 | Data: System.Nullable`1[[UdonSharp.UdonSyncMode, UdonSharp.Runtime]], mscorlib 1173 | - Name: 1174 | Entry: 6 1175 | Data: 1176 | - Name: 1177 | Entry: 8 1178 | Data: 1179 | - Name: k__BackingField 1180 | Entry: 5 1181 | Data: false 1182 | - Name: _fieldAttributes 1183 | Entry: 7 1184 | Data: 60|System.Collections.Generic.List`1[[System.Attribute, mscorlib]], mscorlib 1185 | - Name: 1186 | Entry: 12 1187 | Data: 0 1188 | - Name: 1189 | Entry: 13 1190 | Data: 1191 | - Name: 1192 | Entry: 8 1193 | Data: 1194 | - Name: 1195 | Entry: 8 1196 | Data: 1197 | - Name: 1198 | Entry: 8 1199 | Data: 1200 | - Name: 1201 | Entry: 7 1202 | Data: 1203 | - Name: $k 1204 | Entry: 1 1205 | Data: _currentScale 1206 | - Name: $v 1207 | Entry: 7 1208 | Data: 61|UdonSharp.Compiler.FieldDefinition, UdonSharp.Editor 1209 | - Name: k__BackingField 1210 | Entry: 1 1211 | Data: _currentScale 1212 | - Name: k__BackingField 1213 | Entry: 9 1214 | Data: 27 1215 | - Name: k__BackingField 1216 | Entry: 9 1217 | Data: 27 1218 | - Name: k__BackingField 1219 | Entry: 7 1220 | Data: System.Nullable`1[[UdonSharp.UdonSyncMode, UdonSharp.Runtime]], mscorlib 1221 | - Name: 1222 | Entry: 6 1223 | Data: 1224 | - Name: 1225 | Entry: 8 1226 | Data: 1227 | - Name: k__BackingField 1228 | Entry: 5 1229 | Data: false 1230 | - Name: _fieldAttributes 1231 | Entry: 7 1232 | Data: 62|System.Collections.Generic.List`1[[System.Attribute, mscorlib]], mscorlib 1233 | - Name: 1234 | Entry: 12 1235 | Data: 0 1236 | - Name: 1237 | Entry: 13 1238 | Data: 1239 | - Name: 1240 | Entry: 8 1241 | Data: 1242 | - Name: 1243 | Entry: 8 1244 | Data: 1245 | - Name: 1246 | Entry: 8 1247 | Data: 1248 | - Name: 1249 | Entry: 7 1250 | Data: 1251 | - Name: $k 1252 | Entry: 1 1253 | Data: _offsetRotation 1254 | - Name: $v 1255 | Entry: 7 1256 | Data: 63|UdonSharp.Compiler.FieldDefinition, UdonSharp.Editor 1257 | - Name: k__BackingField 1258 | Entry: 1 1259 | Data: _offsetRotation 1260 | - Name: k__BackingField 1261 | Entry: 7 1262 | Data: 64|System.RuntimeType, mscorlib 1263 | - Name: 1264 | Entry: 1 1265 | Data: UnityEngine.Quaternion, UnityEngine.CoreModule 1266 | - Name: 1267 | Entry: 8 1268 | Data: 1269 | - Name: k__BackingField 1270 | Entry: 9 1271 | Data: 64 1272 | - Name: k__BackingField 1273 | Entry: 7 1274 | Data: System.Nullable`1[[UdonSharp.UdonSyncMode, UdonSharp.Runtime]], mscorlib 1275 | - Name: 1276 | Entry: 6 1277 | Data: 1278 | - Name: 1279 | Entry: 8 1280 | Data: 1281 | - Name: k__BackingField 1282 | Entry: 5 1283 | Data: false 1284 | - Name: _fieldAttributes 1285 | Entry: 7 1286 | Data: 65|System.Collections.Generic.List`1[[System.Attribute, mscorlib]], mscorlib 1287 | - Name: 1288 | Entry: 12 1289 | Data: 0 1290 | - Name: 1291 | Entry: 13 1292 | Data: 1293 | - Name: 1294 | Entry: 8 1295 | Data: 1296 | - Name: 1297 | Entry: 8 1298 | Data: 1299 | - Name: 1300 | Entry: 8 1301 | Data: 1302 | - Name: 1303 | Entry: 7 1304 | Data: 1305 | - Name: $k 1306 | Entry: 1 1307 | Data: _offsetPosition 1308 | - Name: $v 1309 | Entry: 7 1310 | Data: 66|UdonSharp.Compiler.FieldDefinition, UdonSharp.Editor 1311 | - Name: k__BackingField 1312 | Entry: 1 1313 | Data: _offsetPosition 1314 | - Name: k__BackingField 1315 | Entry: 7 1316 | Data: 67|System.RuntimeType, mscorlib 1317 | - Name: 1318 | Entry: 1 1319 | Data: UnityEngine.Vector3, UnityEngine.CoreModule 1320 | - Name: 1321 | Entry: 8 1322 | Data: 1323 | - Name: k__BackingField 1324 | Entry: 9 1325 | Data: 67 1326 | - Name: k__BackingField 1327 | Entry: 7 1328 | Data: System.Nullable`1[[UdonSharp.UdonSyncMode, UdonSharp.Runtime]], mscorlib 1329 | - Name: 1330 | Entry: 6 1331 | Data: 1332 | - Name: 1333 | Entry: 8 1334 | Data: 1335 | - Name: k__BackingField 1336 | Entry: 5 1337 | Data: false 1338 | - Name: _fieldAttributes 1339 | Entry: 7 1340 | Data: 68|System.Collections.Generic.List`1[[System.Attribute, mscorlib]], mscorlib 1341 | - Name: 1342 | Entry: 12 1343 | Data: 0 1344 | - Name: 1345 | Entry: 13 1346 | Data: 1347 | - Name: 1348 | Entry: 8 1349 | Data: 1350 | - Name: 1351 | Entry: 8 1352 | Data: 1353 | - Name: 1354 | Entry: 8 1355 | Data: 1356 | - Name: 1357 | Entry: 7 1358 | Data: 1359 | - Name: $k 1360 | Entry: 1 1361 | Data: _panelAttachedToHand 1362 | - Name: $v 1363 | Entry: 7 1364 | Data: 69|UdonSharp.Compiler.FieldDefinition, UdonSharp.Editor 1365 | - Name: k__BackingField 1366 | Entry: 1 1367 | Data: _panelAttachedToHand 1368 | - Name: k__BackingField 1369 | Entry: 7 1370 | Data: 70|System.RuntimeType, mscorlib 1371 | - Name: 1372 | Entry: 1 1373 | Data: VRC.SDKBase.VRCPlayerApi+TrackingDataType, VRCSDKBase 1374 | - Name: 1375 | Entry: 8 1376 | Data: 1377 | - Name: k__BackingField 1378 | Entry: 9 1379 | Data: 70 1380 | - Name: k__BackingField 1381 | Entry: 7 1382 | Data: System.Nullable`1[[UdonSharp.UdonSyncMode, UdonSharp.Runtime]], mscorlib 1383 | - Name: 1384 | Entry: 6 1385 | Data: 1386 | - Name: 1387 | Entry: 8 1388 | Data: 1389 | - Name: k__BackingField 1390 | Entry: 5 1391 | Data: false 1392 | - Name: _fieldAttributes 1393 | Entry: 7 1394 | Data: 71|System.Collections.Generic.List`1[[System.Attribute, mscorlib]], mscorlib 1395 | - Name: 1396 | Entry: 12 1397 | Data: 0 1398 | - Name: 1399 | Entry: 13 1400 | Data: 1401 | - Name: 1402 | Entry: 8 1403 | Data: 1404 | - Name: 1405 | Entry: 8 1406 | Data: 1407 | - Name: 1408 | Entry: 8 1409 | Data: 1410 | - Name: 1411 | Entry: 7 1412 | Data: 1413 | - Name: $k 1414 | Entry: 1 1415 | Data: _eventAlreadySend 1416 | - Name: $v 1417 | Entry: 7 1418 | Data: 72|UdonSharp.Compiler.FieldDefinition, UdonSharp.Editor 1419 | - Name: k__BackingField 1420 | Entry: 1 1421 | Data: _eventAlreadySend 1422 | - Name: k__BackingField 1423 | Entry: 9 1424 | Data: 10 1425 | - Name: k__BackingField 1426 | Entry: 9 1427 | Data: 10 1428 | - Name: k__BackingField 1429 | Entry: 7 1430 | Data: System.Nullable`1[[UdonSharp.UdonSyncMode, UdonSharp.Runtime]], mscorlib 1431 | - Name: 1432 | Entry: 6 1433 | Data: 1434 | - Name: 1435 | Entry: 8 1436 | Data: 1437 | - Name: k__BackingField 1438 | Entry: 5 1439 | Data: false 1440 | - Name: _fieldAttributes 1441 | Entry: 7 1442 | Data: 73|System.Collections.Generic.List`1[[System.Attribute, mscorlib]], mscorlib 1443 | - Name: 1444 | Entry: 12 1445 | Data: 0 1446 | - Name: 1447 | Entry: 13 1448 | Data: 1449 | - Name: 1450 | Entry: 8 1451 | Data: 1452 | - Name: 1453 | Entry: 8 1454 | Data: 1455 | - Name: 1456 | Entry: 8 1457 | Data: 1458 | - Name: 1459 | Entry: 7 1460 | Data: 1461 | - Name: $k 1462 | Entry: 1 1463 | Data: _forceStateOfPanel 1464 | - Name: $v 1465 | Entry: 7 1466 | Data: 74|UdonSharp.Compiler.FieldDefinition, UdonSharp.Editor 1467 | - Name: k__BackingField 1468 | Entry: 1 1469 | Data: _forceStateOfPanel 1470 | - Name: k__BackingField 1471 | Entry: 7 1472 | Data: 75|System.RuntimeType, mscorlib 1473 | - Name: 1474 | Entry: 1 1475 | Data: myro.EForceState, Assembly-CSharp 1476 | - Name: 1477 | Entry: 8 1478 | Data: 1479 | - Name: k__BackingField 1480 | Entry: 9 1481 | Data: 14 1482 | - Name: k__BackingField 1483 | Entry: 7 1484 | Data: System.Nullable`1[[UdonSharp.UdonSyncMode, UdonSharp.Runtime]], mscorlib 1485 | - Name: 1486 | Entry: 6 1487 | Data: 1488 | - Name: 1489 | Entry: 8 1490 | Data: 1491 | - Name: k__BackingField 1492 | Entry: 5 1493 | Data: false 1494 | - Name: _fieldAttributes 1495 | Entry: 7 1496 | Data: 76|System.Collections.Generic.List`1[[System.Attribute, mscorlib]], mscorlib 1497 | - Name: 1498 | Entry: 12 1499 | Data: 0 1500 | - Name: 1501 | Entry: 13 1502 | Data: 1503 | - Name: 1504 | Entry: 8 1505 | Data: 1506 | - Name: 1507 | Entry: 8 1508 | Data: 1509 | - Name: 1510 | Entry: 8 1511 | Data: 1512 | - Name: 1513 | Entry: 7 1514 | Data: 1515 | - Name: $k 1516 | Entry: 1 1517 | Data: _position 1518 | - Name: $v 1519 | Entry: 7 1520 | Data: 77|UdonSharp.Compiler.FieldDefinition, UdonSharp.Editor 1521 | - Name: k__BackingField 1522 | Entry: 1 1523 | Data: _position 1524 | - Name: k__BackingField 1525 | Entry: 9 1526 | Data: 67 1527 | - Name: k__BackingField 1528 | Entry: 9 1529 | Data: 67 1530 | - Name: k__BackingField 1531 | Entry: 7 1532 | Data: System.Nullable`1[[UdonSharp.UdonSyncMode, UdonSharp.Runtime]], mscorlib 1533 | - Name: 1534 | Entry: 6 1535 | Data: 1536 | - Name: 1537 | Entry: 8 1538 | Data: 1539 | - Name: k__BackingField 1540 | Entry: 5 1541 | Data: false 1542 | - Name: _fieldAttributes 1543 | Entry: 7 1544 | Data: 78|System.Collections.Generic.List`1[[System.Attribute, mscorlib]], mscorlib 1545 | - Name: 1546 | Entry: 12 1547 | Data: 0 1548 | - Name: 1549 | Entry: 13 1550 | Data: 1551 | - Name: 1552 | Entry: 8 1553 | Data: 1554 | - Name: 1555 | Entry: 8 1556 | Data: 1557 | - Name: 1558 | Entry: 8 1559 | Data: 1560 | - Name: 1561 | Entry: 7 1562 | Data: 1563 | - Name: $k 1564 | Entry: 1 1565 | Data: _rotation 1566 | - Name: $v 1567 | Entry: 7 1568 | Data: 79|UdonSharp.Compiler.FieldDefinition, UdonSharp.Editor 1569 | - Name: k__BackingField 1570 | Entry: 1 1571 | Data: _rotation 1572 | - Name: k__BackingField 1573 | Entry: 9 1574 | Data: 64 1575 | - Name: k__BackingField 1576 | Entry: 9 1577 | Data: 64 1578 | - Name: k__BackingField 1579 | Entry: 7 1580 | Data: System.Nullable`1[[UdonSharp.UdonSyncMode, UdonSharp.Runtime]], mscorlib 1581 | - Name: 1582 | Entry: 6 1583 | Data: 1584 | - Name: 1585 | Entry: 8 1586 | Data: 1587 | - Name: k__BackingField 1588 | Entry: 5 1589 | Data: false 1590 | - Name: _fieldAttributes 1591 | Entry: 7 1592 | Data: 80|System.Collections.Generic.List`1[[System.Attribute, mscorlib]], mscorlib 1593 | - Name: 1594 | Entry: 12 1595 | Data: 0 1596 | - Name: 1597 | Entry: 13 1598 | Data: 1599 | - Name: 1600 | Entry: 8 1601 | Data: 1602 | - Name: 1603 | Entry: 8 1604 | Data: 1605 | - Name: 1606 | Entry: 8 1607 | Data: 1608 | - Name: 1609 | Entry: 7 1610 | Data: 1611 | - Name: $k 1612 | Entry: 1 1613 | Data: _scale 1614 | - Name: $v 1615 | Entry: 7 1616 | Data: 81|UdonSharp.Compiler.FieldDefinition, UdonSharp.Editor 1617 | - Name: k__BackingField 1618 | Entry: 1 1619 | Data: _scale 1620 | - Name: k__BackingField 1621 | Entry: 9 1622 | Data: 67 1623 | - Name: k__BackingField 1624 | Entry: 9 1625 | Data: 67 1626 | - Name: k__BackingField 1627 | Entry: 7 1628 | Data: System.Nullable`1[[UdonSharp.UdonSyncMode, UdonSharp.Runtime]], mscorlib 1629 | - Name: 1630 | Entry: 6 1631 | Data: 1632 | - Name: 1633 | Entry: 8 1634 | Data: 1635 | - Name: k__BackingField 1636 | Entry: 5 1637 | Data: false 1638 | - Name: _fieldAttributes 1639 | Entry: 7 1640 | Data: 82|System.Collections.Generic.List`1[[System.Attribute, mscorlib]], mscorlib 1641 | - Name: 1642 | Entry: 12 1643 | Data: 0 1644 | - Name: 1645 | Entry: 13 1646 | Data: 1647 | - Name: 1648 | Entry: 8 1649 | Data: 1650 | - Name: 1651 | Entry: 8 1652 | Data: 1653 | - Name: 1654 | Entry: 8 1655 | Data: 1656 | - Name: 1657 | Entry: 7 1658 | Data: 1659 | - Name: $k 1660 | Entry: 1 1661 | Data: _isPanelOpen 1662 | - Name: $v 1663 | Entry: 7 1664 | Data: 83|UdonSharp.Compiler.FieldDefinition, UdonSharp.Editor 1665 | - Name: k__BackingField 1666 | Entry: 1 1667 | Data: _isPanelOpen 1668 | - Name: k__BackingField 1669 | Entry: 9 1670 | Data: 10 1671 | - Name: k__BackingField 1672 | Entry: 9 1673 | Data: 10 1674 | - Name: k__BackingField 1675 | Entry: 7 1676 | Data: System.Nullable`1[[UdonSharp.UdonSyncMode, UdonSharp.Runtime]], mscorlib 1677 | - Name: 1678 | Entry: 6 1679 | Data: 1680 | - Name: 1681 | Entry: 8 1682 | Data: 1683 | - Name: k__BackingField 1684 | Entry: 5 1685 | Data: false 1686 | - Name: _fieldAttributes 1687 | Entry: 7 1688 | Data: 84|System.Collections.Generic.List`1[[System.Attribute, mscorlib]], mscorlib 1689 | - Name: 1690 | Entry: 12 1691 | Data: 0 1692 | - Name: 1693 | Entry: 13 1694 | Data: 1695 | - Name: 1696 | Entry: 8 1697 | Data: 1698 | - Name: 1699 | Entry: 8 1700 | Data: 1701 | - Name: 1702 | Entry: 8 1703 | Data: 1704 | - Name: 1705 | Entry: 7 1706 | Data: 1707 | - Name: $k 1708 | Entry: 1 1709 | Data: _init 1710 | - Name: $v 1711 | Entry: 7 1712 | Data: 85|UdonSharp.Compiler.FieldDefinition, UdonSharp.Editor 1713 | - Name: k__BackingField 1714 | Entry: 1 1715 | Data: _init 1716 | - Name: k__BackingField 1717 | Entry: 9 1718 | Data: 10 1719 | - Name: k__BackingField 1720 | Entry: 9 1721 | Data: 10 1722 | - Name: k__BackingField 1723 | Entry: 7 1724 | Data: System.Nullable`1[[UdonSharp.UdonSyncMode, UdonSharp.Runtime]], mscorlib 1725 | - Name: 1726 | Entry: 6 1727 | Data: 1728 | - Name: 1729 | Entry: 8 1730 | Data: 1731 | - Name: k__BackingField 1732 | Entry: 5 1733 | Data: false 1734 | - Name: _fieldAttributes 1735 | Entry: 7 1736 | Data: 86|System.Collections.Generic.List`1[[System.Attribute, mscorlib]], mscorlib 1737 | - Name: 1738 | Entry: 12 1739 | Data: 0 1740 | - Name: 1741 | Entry: 13 1742 | Data: 1743 | - Name: 1744 | Entry: 8 1745 | Data: 1746 | - Name: 1747 | Entry: 8 1748 | Data: 1749 | - Name: 1750 | Entry: 8 1751 | Data: 1752 | - Name: 1753 | Entry: 7 1754 | Data: 1755 | - Name: $k 1756 | Entry: 1 1757 | Data: _isUsingViveControllers 1758 | - Name: $v 1759 | Entry: 7 1760 | Data: 87|UdonSharp.Compiler.FieldDefinition, UdonSharp.Editor 1761 | - Name: k__BackingField 1762 | Entry: 1 1763 | Data: _isUsingViveControllers 1764 | - Name: k__BackingField 1765 | Entry: 9 1766 | Data: 10 1767 | - Name: k__BackingField 1768 | Entry: 9 1769 | Data: 10 1770 | - Name: k__BackingField 1771 | Entry: 7 1772 | Data: System.Nullable`1[[UdonSharp.UdonSyncMode, UdonSharp.Runtime]], mscorlib 1773 | - Name: 1774 | Entry: 6 1775 | Data: 1776 | - Name: 1777 | Entry: 8 1778 | Data: 1779 | - Name: k__BackingField 1780 | Entry: 5 1781 | Data: false 1782 | - Name: _fieldAttributes 1783 | Entry: 7 1784 | Data: 88|System.Collections.Generic.List`1[[System.Attribute, mscorlib]], mscorlib 1785 | - Name: 1786 | Entry: 12 1787 | Data: 0 1788 | - Name: 1789 | Entry: 13 1790 | Data: 1791 | - Name: 1792 | Entry: 8 1793 | Data: 1794 | - Name: 1795 | Entry: 8 1796 | Data: 1797 | - Name: 1798 | Entry: 8 1799 | Data: 1800 | - Name: 1801 | Entry: 13 1802 | Data: 1803 | - Name: 1804 | Entry: 8 1805 | Data: 1806 | -------------------------------------------------------------------------------- /Scripts/PortablePanel.asset.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 16f82f9ec93c4be49951c5183c885032 3 | NativeFormatImporter: 4 | externalObjects: {} 5 | mainObjectFileID: 11400000 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Scripts/PortablePanel.cs: -------------------------------------------------------------------------------- 1 | using UdonSharp; 2 | using UnityEngine; 3 | using VRC.SDKBase; 4 | using VRC.Udon; 5 | using VRC.Udon.Common; 6 | 7 | namespace myro 8 | { 9 | public enum EGrabbed 10 | { 11 | NONE, 12 | BOTH_HANDS, 13 | ONE_HANDED 14 | } 15 | 16 | public enum EGestureMode 17 | { 18 | Grab, 19 | Trigger, 20 | Both 21 | } 22 | 23 | public enum EClosingBehaviour 24 | { 25 | Closing, 26 | Respawning 27 | } 28 | 29 | public enum EForceState 30 | { 31 | NONE, 32 | FORCE_CLOSE, 33 | FORCE_OPEN 34 | } 35 | 36 | 37 | 38 | [UdonBehaviourSyncMode(BehaviourSyncMode.None)] 39 | [DefaultExecutionOrder(500)] 40 | public class PortablePanel : UdonSharpBehaviour 41 | { 42 | [Header("See README file for additional help and infos")] 43 | public GameObject Panel; 44 | private Transform _panelTransf; 45 | 46 | //public bool ClosedByDefault = true; 47 | public bool TabOnHold = true; 48 | public EGestureMode GestureMode; 49 | public EClosingBehaviour CloseBehaviour; 50 | private PortablePanelPickupModule _pickupModule; 51 | [SerializeField] private bool _isPickupable = true; 52 | 53 | public float MaxScale = 9999.0f; 54 | public float MinScale = 0.1f; 55 | public float MaxDistanceBeforeClosingThePanel = 2f; 56 | public float PanelScaleOnDesktop = 0.5f; 57 | 58 | 59 | [Header("Advanced settings, change them only if you really need to")] 60 | [SerializeField] 61 | private bool _delayInitialisation = false; 62 | 63 | private VRCPlayerApi _localPlayer; 64 | private EGrabbed _grabbed; 65 | private bool _isRightHandTriggeredGrab , _isLeftHandTriggeredGrab; 66 | private bool _isRightHandTriggeredTrigger , _isLeftHandTriggeredTrigger; 67 | private float _timeRightHandGesture , _timeLeftHandGesture; 68 | 69 | 70 | //The variables bellow are used to calculate the position and the scale of the panel once it's hold with both hand 71 | private float _startDistanceBetweenTwoHands; 72 | private float _startScale; 73 | private float _currentScale; 74 | 75 | //The variables bellow are used to calculate the position of the panel once it's hold with one hand 76 | private Quaternion _offsetRotation; 77 | private Vector3 _offsetPosition; 78 | private VRCPlayerApi.TrackingDataType _panelAttachedToHand; 79 | 80 | //This bool is only used to avoid event spams 81 | private bool _eventAlreadySend = false; 82 | 83 | //Boleans used to open or close the panel without player inputs 84 | private EForceState _forceStateOfPanel; 85 | 86 | //Her we are saving the transforms of the panel, so we can respawn it with the original scale. 87 | private Vector3 _position; 88 | private Quaternion _rotation; 89 | private Vector3 _scale; 90 | 91 | private bool _isPanelOpen; 92 | private bool _init; 93 | private bool _isUsingViveControllers; 94 | 95 | private const float TIME_INTERVAL_HAND_GESTURE = 0.15f; 96 | private const float MAX_DISTANCE_HAND_GESTURE = 0.3f; 97 | private const float PLACEMENT_DISTANCE_FROM_HEAD = 0.3f; 98 | private const float CLOSING_HAND_DISTANCE = 0.15f; 99 | 100 | void OnEnable() 101 | { 102 | _localPlayer = Networking.LocalPlayer; 103 | _isRightHandTriggeredGrab = false; 104 | _isLeftHandTriggeredGrab = false; 105 | _isRightHandTriggeredTrigger = false; 106 | _isLeftHandTriggeredTrigger = false; 107 | _panelTransf = Panel.transform; 108 | } 109 | 110 | private void Start() 111 | { 112 | _isUsingViveControllers = IsViveController(); 113 | 114 | SetRespawnPoint(_panelTransf.position, 115 | _panelTransf.rotation, 116 | _panelTransf.localScale); 117 | 118 | if (!_delayInitialisation) 119 | Initialisation(); 120 | } 121 | 122 | public override void OnPlayerJoined(VRCPlayerApi player) 123 | { 124 | if (_delayInitialisation && player.isLocal) 125 | Initialisation(); 126 | } 127 | 128 | public void Initialisation() 129 | { 130 | CloseOrRespawnPanel(); 131 | OnStart(); 132 | _init = true; 133 | } 134 | 135 | private void SetPanelScale(float newScale) 136 | { 137 | float oldScale = _panelTransf.localScale.x; 138 | if (oldScale != newScale) 139 | { 140 | _panelTransf.localScale = new Vector3(newScale, newScale, newScale); 141 | OnPanelScaled(oldScale, newScale); 142 | } 143 | } 144 | 145 | public void SetPickupModule(PortablePanelPickupModule pickupModule) 146 | { 147 | _pickupModule = pickupModule; 148 | } 149 | 150 | #region Public methods 151 | 152 | /// 153 | /// Sets the "pickupable" state of your panel. This will also work for VRCPickups 154 | /// 155 | /// The new pickupable state 156 | public void SetPickupable(bool newPickupableState) 157 | { 158 | _isPickupable = newPickupableState; 159 | if (_pickupModule != null) 160 | { 161 | if (newPickupableState) 162 | { 163 | _pickupModule.EnablePickup(); 164 | } 165 | else 166 | { 167 | _pickupModule.DisablePickup(); 168 | } 169 | } 170 | } 171 | 172 | public bool IsPanelOpen() 173 | { 174 | return _isPanelOpen; 175 | } 176 | 177 | 178 | 179 | public void ForceClosePanel() 180 | { 181 | if (IsPanelOpen()) 182 | { 183 | CloseOrRespawnPanel(); 184 | 185 | if (!_localPlayer.IsUserInVR()) 186 | { 187 | //Desktop : this is mostly to make sure that the panel doesn't get reopened if the Desktop player keeps the Tab key pressed 188 | //VR : I guess no need to do anything? 189 | _forceStateOfPanel = EForceState.FORCE_CLOSE; 190 | } 191 | } 192 | } 193 | 194 | public void ForceOpenPanel(float unscaledDistance) 195 | { 196 | if (!IsPanelOpen()) 197 | { 198 | OpenPanel(); 199 | 200 | PlacePanelInFrontOfPlayer(unscaledDistance); 201 | 202 | if (!_localPlayer.IsUserInVR()) 203 | { 204 | _forceStateOfPanel = EForceState.FORCE_OPEN; 205 | } 206 | } 207 | } 208 | 209 | public void ForceOpenPanel() 210 | { 211 | ForceOpenPanel(PLACEMENT_DISTANCE_FROM_HEAD); 212 | } 213 | 214 | public bool IsPanelHoldByOneHand() 215 | { 216 | return _grabbed == EGrabbed.ONE_HANDED; 217 | } 218 | 219 | public void SetRespawnPoint(Vector3 position, Quaternion rotation, Vector3 scale) 220 | { 221 | _position = position; 222 | _rotation = rotation; 223 | _scale = scale; 224 | } 225 | 226 | public void RespawnPanel() 227 | { 228 | //we currently just need to close it 229 | CloseOrRespawnPanel(); 230 | } 231 | 232 | #endregion 233 | 234 | #region Overridable events 235 | 236 | /// 237 | /// Gets called when the panel opens 238 | /// 239 | /// True if the panel needs to be opened. 240 | /// If you want to open the panel manually, for instance with an animator, then you can `return false;` 241 | /// 242 | public virtual bool OnPanelOpening() 243 | { 244 | return true; 245 | } 246 | 247 | /// 248 | /// Gets called when "Start" is called 249 | /// 250 | public virtual void OnStart() 251 | { 252 | 253 | } 254 | 255 | /// 256 | /// Gets called when the panel is about to get closed, so it is called when the panel is not closed yet 257 | /// 258 | /// True if the panel needs to be closed. 259 | /// If you want to close the panel manually, for instance with an animator, then you can `return false;` instead 260 | /// 261 | public virtual bool OnPanelClosing() 262 | { 263 | return true; 264 | } 265 | 266 | /// 267 | /// Gets called when the panel is getting grabbed, either by one hand or with both hands. 268 | /// If the parameter "GrabbablePanel" is set to false, the the event will ony be called while scaling the panel 8so when it's grabbed with both hands. 269 | /// 270 | public virtual void OnPanelGrab() 271 | { 272 | } 273 | 274 | /// 275 | /// Gets called when the panel is dropped 276 | /// 277 | public virtual void OnPanelDrop() 278 | { 279 | } 280 | 281 | /// 282 | /// Gets called when the panel gets scaled 283 | /// 284 | /// The scale of the panel before it got scaled 285 | /// The new scale of the panel 286 | /// You could for instance use that method to change what's written on the panel based on the size, or 287 | /// change the color based on the speed it gets scaled. 288 | public virtual void OnPanelScaled(float oldScale, float newScale) 289 | { 290 | } 291 | 292 | #endregion 293 | 294 | #region Main code 295 | 296 | private void CloseOrRespawnPanel() 297 | { 298 | _grabbed = EGrabbed.NONE; 299 | _isRightHandTriggeredGrab = false; 300 | _isLeftHandTriggeredGrab = false; 301 | _isRightHandTriggeredTrigger = false; 302 | _isLeftHandTriggeredTrigger = false; 303 | 304 | if (OnPanelClosing()) 305 | { 306 | if (CloseBehaviour == EClosingBehaviour.Closing) 307 | { 308 | Panel.SetActive(false); 309 | } 310 | else 311 | { 312 | RespawnToOriginalLocation(); 313 | } 314 | } 315 | _isPanelOpen = false; 316 | } 317 | 318 | private void OpenPanel() 319 | { 320 | if (OnPanelOpening()) 321 | { 322 | Panel.SetActive(true); 323 | } 324 | _isPanelOpen = true; 325 | } 326 | 327 | public void RespawnToOriginalLocation() 328 | { 329 | _panelTransf.position = _position; 330 | _panelTransf.rotation = _rotation; 331 | _panelTransf.localScale = _scale; 332 | } 333 | 334 | /// 335 | /// Scales the value based on the size of the avatar. 336 | /// If The avatar is 1m80 tall, 1 meter = 1 meter 337 | /// If the avatar is 1m60 tall, 1 meter will be turned into 1.60*1/1.80 = 0.88 meter 338 | /// 339 | /// The value the needs to be scaled based on the avatar size 340 | /// 341 | protected float ScaleValueToAvatar(float value) 342 | { 343 | #if UNITY_EDITOR 344 | return value; // A Client Sim bug makes the script crash if "GetAvatarEyeHeightAsMeters" gets called, temporary fix until GetAvatarEyeHeightAsMeters is fully exposed in ClientSim... 345 | #else 346 | return _localPlayer.GetAvatarEyeHeightAsMeters() * value / 1.80f; 347 | #endif 348 | } 349 | 350 | private bool IsRightHandTriggered() 351 | { 352 | if (GestureMode != EGestureMode.Both) 353 | return _isRightHandTriggeredGrab || _isRightHandTriggeredTrigger; 354 | return _isRightHandTriggeredGrab && _isRightHandTriggeredTrigger; 355 | } 356 | 357 | private bool IsLeftHandTriggered() 358 | { 359 | if (GestureMode != EGestureMode.Both) 360 | return _isLeftHandTriggeredGrab || _isLeftHandTriggeredTrigger; 361 | return _isLeftHandTriggeredGrab && _isLeftHandTriggeredTrigger; 362 | } 363 | 364 | private void HandleInput(bool value, UdonInputEventArgs args) 365 | { 366 | float distanceBetweenBothHands = Vector3.Distance( 367 | _localPlayer.GetTrackingData(VRCPlayerApi.TrackingDataType.LeftHand).position, 368 | _localPlayer.GetTrackingData(VRCPlayerApi.TrackingDataType.RightHand).position 369 | ); 370 | 371 | if (IsRightHandTriggered() && IsLeftHandTriggered() 372 | && Mathf.Abs(_timeRightHandGesture - _timeLeftHandGesture) < TIME_INTERVAL_HAND_GESTURE 373 | && (distanceBetweenBothHands < ScaleValueToAvatar(MAX_DISTANCE_HAND_GESTURE) || IsPanelOpen())) 374 | { 375 | //If the grab gesture is used on both hands, we open the panel 376 | _startDistanceBetweenTwoHands = distanceBetweenBothHands; 377 | 378 | OnPanelGrab(); 379 | 380 | if (!IsPanelOpen() && _forceStateOfPanel != EForceState.FORCE_CLOSE) 381 | { 382 | OpenPanel(); 383 | 384 | _startScale = _startDistanceBetweenTwoHands; 385 | } 386 | else 387 | { 388 | _startScale = _panelTransf.localScale.x; 389 | } 390 | _grabbed = EGrabbed.BOTH_HANDS; 391 | } 392 | else if (!IsRightHandTriggered() && !IsLeftHandTriggered()) 393 | { 394 | _forceStateOfPanel = EForceState.NONE; 395 | 396 | OnPanelDrop(); 397 | 398 | if (IsPanelOpen() && distanceBetweenBothHands < ScaleValueToAvatar(CLOSING_HAND_DISTANCE)) 399 | { 400 | CloseOrRespawnPanel(); 401 | } 402 | _grabbed = EGrabbed.NONE; 403 | } 404 | else if (IsRightHandTriggered() || IsLeftHandTriggered()) 405 | { 406 | //Grab gesture with one hand : 407 | //- If the player previously grabbed the panel with both hands, we can add a little delay before "ungrabbing" the panel to avoid accidental 408 | // displacements of the panel 409 | //- If not, then the player didn't used the grab gesture, in that case we will attach the panel on one hand 410 | if (_grabbed == EGrabbed.BOTH_HANDS && !_eventAlreadySend) 411 | { 412 | _eventAlreadySend = true; 413 | SendCustomEventDelayedSeconds(nameof(EventEnableOneHandMovement), 0.1f); 414 | return; 415 | } 416 | else if (_pickupModule == null && IsPanelOpen()) 417 | { 418 | AttachToHand(); 419 | } 420 | } 421 | } 422 | 423 | private void HandleInputGrab(bool value, UdonInputEventArgs args) 424 | { 425 | if (!_localPlayer.IsUserInVR() || GestureMode == EGestureMode.Trigger) 426 | { 427 | return; 428 | } 429 | 430 | if (args.handType == HandType.RIGHT) 431 | { 432 | _isRightHandTriggeredGrab = value; 433 | _timeRightHandGesture = Time.time; 434 | } 435 | else if (args.handType == HandType.LEFT) 436 | { 437 | _isLeftHandTriggeredGrab = value; 438 | _timeLeftHandGesture = Time.time; 439 | } 440 | 441 | HandleInput(value, args); 442 | } 443 | 444 | private bool IsViveController() 445 | { 446 | string[] joystickNames = Input.GetJoystickNames(); 447 | foreach(var joystickName in joystickNames) 448 | { 449 | if (joystickName.ToLower().Contains("vive")) 450 | return true; 451 | } 452 | return false; 453 | } 454 | 455 | public override void InputDrop(bool value, UdonInputEventArgs args) 456 | { 457 | if (!_init || !_isUsingViveControllers) return; 458 | 459 | HandleInputGrab(value, args); 460 | } 461 | 462 | public override void InputGrab(bool value, UdonInputEventArgs args) 463 | { 464 | if (!_init || _isUsingViveControllers) return; 465 | 466 | HandleInputGrab(value, args); 467 | } 468 | 469 | public override void InputUse(bool value, UdonInputEventArgs args) 470 | { 471 | if (!_init) return; 472 | 473 | if (!_localPlayer.IsUserInVR() || GestureMode == EGestureMode.Grab) 474 | { 475 | return; 476 | } 477 | 478 | if (args.handType == HandType.RIGHT) 479 | { 480 | _isRightHandTriggeredTrigger = value; 481 | _timeRightHandGesture = Time.time; 482 | } 483 | else if (args.handType == HandType.LEFT) 484 | { 485 | _isLeftHandTriggeredTrigger = value; 486 | _timeLeftHandGesture = Time.time; 487 | } 488 | 489 | HandleInput(value, args); 490 | } 491 | 492 | public void EventEnableOneHandMovement() 493 | { 494 | if (_grabbed == EGrabbed.BOTH_HANDS) 495 | { 496 | AttachToHand(); 497 | } 498 | _eventAlreadySend = false; 499 | } 500 | 501 | private bool PanelTooFarAway() 502 | { 503 | return Vector3.Distance(_localPlayer.GetTrackingData(VRCPlayerApi.TrackingDataType.Head).position, _panelTransf.position) 504 | > ScaleValueToAvatar(MaxDistanceBeforeClosingThePanel); 505 | } 506 | 507 | private void AttachToHand() 508 | { 509 | if (_pickupModule != null) 510 | { 511 | return; 512 | } 513 | else 514 | { 515 | _isPanelOpen = true; 516 | _grabbed = EGrabbed.ONE_HANDED; 517 | 518 | if (_isLeftHandTriggeredGrab) 519 | _panelAttachedToHand = VRCPlayerApi.TrackingDataType.LeftHand; 520 | else 521 | _panelAttachedToHand = VRCPlayerApi.TrackingDataType.RightHand; 522 | 523 | VRCPlayerApi.TrackingData hand = _localPlayer.GetTrackingData(_panelAttachedToHand); 524 | _offsetRotation = Quaternion.Inverse(hand.rotation) * _panelTransf.rotation; 525 | _offsetPosition = Quaternion.Inverse(hand.rotation) * (_panelTransf.position - hand.position); 526 | 527 | OnPanelGrab(); 528 | } 529 | } 530 | 531 | public void PanelPickedUp() 532 | { 533 | _isPanelOpen = true; 534 | _grabbed = EGrabbed.ONE_HANDED; 535 | _startScale = _panelTransf.localScale.x; 536 | _currentScale = _startScale; 537 | OnPanelGrab(); 538 | } 539 | 540 | public void PanelDropped() 541 | { 542 | _grabbed = EGrabbed.NONE; 543 | OnPanelDrop(); 544 | } 545 | 546 | public override void PostLateUpdate() 547 | { 548 | if (!_init) return; 549 | 550 | if (!_localPlayer.IsUserInVR()) 551 | { 552 | if (TabOnHold) 553 | { 554 | bool tabPressed = Input.GetKey(KeyCode.Tab); 555 | 556 | if ((tabPressed && _forceStateOfPanel != EForceState.FORCE_CLOSE) 557 | || _forceStateOfPanel == EForceState.FORCE_OPEN) 558 | { 559 | if (!IsPanelOpen()) 560 | { 561 | OpenPanel(); 562 | } 563 | PlacePanelInFrontOfPlayer(); 564 | 565 | if (tabPressed) 566 | { 567 | _forceStateOfPanel = EForceState.NONE; 568 | } 569 | } 570 | else if (!tabPressed || _forceStateOfPanel == EForceState.FORCE_CLOSE) 571 | { 572 | if (IsPanelOpen()) 573 | { 574 | CloseOrRespawnPanel(); 575 | } 576 | if (!tabPressed) 577 | { 578 | _forceStateOfPanel = EForceState.NONE; 579 | } 580 | } 581 | } 582 | else 583 | { 584 | bool tabPressedDown = Input.GetKeyDown(KeyCode.Tab); 585 | 586 | if (!IsPanelOpen() && (tabPressedDown || _forceStateOfPanel == EForceState.FORCE_OPEN)) 587 | { 588 | OpenPanel(); 589 | PlacePanelInFrontOfPlayer(); 590 | 591 | _forceStateOfPanel = EForceState.NONE; 592 | } 593 | else if (IsPanelOpen() && (tabPressedDown || _forceStateOfPanel == EForceState.FORCE_CLOSE || PanelTooFarAway())) 594 | { 595 | CloseOrRespawnPanel(); 596 | _forceStateOfPanel = EForceState.NONE; 597 | } 598 | } 599 | } 600 | else 601 | { 602 | if (_grabbed == EGrabbed.NONE) 603 | { 604 | if (IsPanelOpen() && PanelTooFarAway()) 605 | { 606 | CloseOrRespawnPanel(); 607 | } 608 | return; 609 | } 610 | else if (_grabbed == EGrabbed.ONE_HANDED) 611 | { 612 | if (_isPickupable && !_pickupModule) 613 | { 614 | VRCPlayerApi.TrackingData hand = _localPlayer.GetTrackingData(_panelAttachedToHand); 615 | 616 | _panelTransf.position = (hand.position + (hand.rotation * _offsetPosition)); 617 | _panelTransf.rotation = (hand.rotation * _offsetRotation); 618 | } 619 | } 620 | else 621 | { 622 | Vector3 left = _localPlayer.GetTrackingData(VRCPlayerApi.TrackingDataType.LeftHand).position; 623 | Vector3 right = _localPlayer.GetTrackingData(VRCPlayerApi.TrackingDataType.RightHand).position; 624 | Vector3 headPos = _localPlayer.GetTrackingData(VRCPlayerApi.TrackingDataType.Head).position; 625 | 626 | _currentScale = Mathf.Clamp(_startScale * Vector3.Distance(left, right) / _startDistanceBetweenTwoHands, ScaleValueToAvatar(MinScale), ScaleValueToAvatar(MaxScale)); 627 | 628 | _panelTransf.position = ((left + right) / 2.0f); 629 | SetPanelScale(_currentScale); 630 | _panelTransf.LookAt(headPos); 631 | _panelTransf.forward = -_panelTransf.forward; 632 | } 633 | } 634 | } 635 | 636 | private void PlacePanelInFrontOfPlayer(float unscaledDistance = PLACEMENT_DISTANCE_FROM_HEAD) 637 | { 638 | Quaternion headRot = _localPlayer.GetTrackingData(VRCPlayerApi.TrackingDataType.Head).rotation; 639 | Vector3 headPos = _localPlayer.GetTrackingData(VRCPlayerApi.TrackingDataType.Head).position; 640 | 641 | float distance = ScaleValueToAvatar(unscaledDistance); 642 | float scale = ScaleValueToAvatar(PanelScaleOnDesktop) * unscaledDistance / PLACEMENT_DISTANCE_FROM_HEAD; 643 | if (distance < 0.08f) 644 | { 645 | //If the avatar is really small, we need to place the menu a bit further away so it doesn't get clipped by the camera 646 | distance = 0.08f; 647 | scale = distance * PanelScaleOnDesktop / 0.3f; 648 | } 649 | if (scale < MinScale) 650 | { 651 | //Now, if the scale is smaller than MinScale, we need to readjust the scale and the distance. 652 | distance = MinScale * distance / scale; 653 | scale = MinScale; 654 | } 655 | 656 | _panelTransf.position = (headPos + headRot * Vector3.forward * distance); 657 | SetPanelScale(scale); 658 | _panelTransf.LookAt(headPos); 659 | _panelTransf.forward = -_panelTransf.forward; 660 | } 661 | 662 | #endregion 663 | } 664 | } 665 | -------------------------------------------------------------------------------- /Scripts/PortablePanel.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 6c16e461e59a5a340a22f538d64095e8 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Scripts/PortablePanelPickupModule.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!114 &11400000 4 | MonoBehaviour: 5 | m_ObjectHideFlags: 0 6 | m_CorrespondingSourceObject: {fileID: 0} 7 | m_PrefabInstance: {fileID: 0} 8 | m_PrefabAsset: {fileID: 0} 9 | m_GameObject: {fileID: 0} 10 | m_Enabled: 1 11 | m_EditorHideFlags: 0 12 | m_Script: {fileID: 11500000, guid: c333ccfdd0cbdbc4ca30cef2dd6e6b9b, type: 3} 13 | m_Name: PortablePanelPickupModule 14 | m_EditorClassIdentifier: 15 | serializedUdonProgramAsset: {fileID: 11400000, guid: 2dd4796dc9c6ffd4d9b9e70b94968c63, 16 | type: 2} 17 | udonAssembly: 18 | assemblyError: 19 | sourceCsScript: {fileID: 11500000, guid: dfe5de7ae2147f2438fa668f28956550, type: 3} 20 | scriptVersion: 2 21 | compiledVersion: 2 22 | behaviourSyncMode: 0 23 | hasInteractEvent: 0 24 | scriptID: 118033673553187740 25 | serializationData: 26 | SerializedFormat: 2 27 | SerializedBytes: 28 | ReferencedUnityObjects: [] 29 | SerializedBytesString: 30 | Prefab: {fileID: 0} 31 | PrefabModificationsReferencedUnityObjects: [] 32 | PrefabModifications: [] 33 | SerializationNodes: 34 | - Name: fieldDefinitions 35 | Entry: 7 36 | Data: 0|System.Collections.Generic.Dictionary`2[[System.String, mscorlib],[UdonSharp.Compiler.FieldDefinition, 37 | UdonSharp.Editor]], mscorlib 38 | - Name: comparer 39 | Entry: 7 40 | Data: 1|System.Collections.Generic.GenericEqualityComparer`1[[System.String, 41 | mscorlib]], mscorlib 42 | - Name: 43 | Entry: 8 44 | Data: 45 | - Name: 46 | Entry: 12 47 | Data: 2 48 | - Name: 49 | Entry: 7 50 | Data: 51 | - Name: $k 52 | Entry: 1 53 | Data: PortablePanelReference 54 | - Name: $v 55 | Entry: 7 56 | Data: 2|UdonSharp.Compiler.FieldDefinition, UdonSharp.Editor 57 | - Name: k__BackingField 58 | Entry: 1 59 | Data: PortablePanelReference 60 | - Name: k__BackingField 61 | Entry: 7 62 | Data: 3|System.RuntimeType, mscorlib 63 | - Name: 64 | Entry: 1 65 | Data: myro.PortablePanel, Assembly-CSharp 66 | - Name: 67 | Entry: 8 68 | Data: 69 | - Name: k__BackingField 70 | Entry: 7 71 | Data: 4|System.RuntimeType, mscorlib 72 | - Name: 73 | Entry: 1 74 | Data: VRC.Udon.UdonBehaviour, VRC.Udon 75 | - Name: 76 | Entry: 8 77 | Data: 78 | - Name: k__BackingField 79 | Entry: 7 80 | Data: System.Nullable`1[[UdonSharp.UdonSyncMode, UdonSharp.Runtime]], mscorlib 81 | - Name: 82 | Entry: 6 83 | Data: 84 | - Name: 85 | Entry: 8 86 | Data: 87 | - Name: k__BackingField 88 | Entry: 5 89 | Data: true 90 | - Name: _fieldAttributes 91 | Entry: 7 92 | Data: 5|System.Collections.Generic.List`1[[System.Attribute, mscorlib]], mscorlib 93 | - Name: 94 | Entry: 12 95 | Data: 2 96 | - Name: 97 | Entry: 7 98 | Data: 6|UnityEngine.HeaderAttribute, UnityEngine.CoreModule 99 | - Name: header 100 | Entry: 1 101 | Data: See README file for additional help and infos 102 | - Name: 103 | Entry: 8 104 | Data: 105 | - Name: 106 | Entry: 7 107 | Data: 7|UnityEngine.HeaderAttribute, UnityEngine.CoreModule 108 | - Name: header 109 | Entry: 1 110 | Data: This script should be attached next to the VRCPickup component 111 | - Name: 112 | Entry: 8 113 | Data: 114 | - Name: 115 | Entry: 13 116 | Data: 117 | - Name: 118 | Entry: 8 119 | Data: 120 | - Name: 121 | Entry: 8 122 | Data: 123 | - Name: 124 | Entry: 8 125 | Data: 126 | - Name: 127 | Entry: 7 128 | Data: 129 | - Name: $k 130 | Entry: 1 131 | Data: _pickupReference 132 | - Name: $v 133 | Entry: 7 134 | Data: 8|UdonSharp.Compiler.FieldDefinition, UdonSharp.Editor 135 | - Name: k__BackingField 136 | Entry: 1 137 | Data: _pickupReference 138 | - Name: k__BackingField 139 | Entry: 7 140 | Data: 9|System.RuntimeType, mscorlib 141 | - Name: 142 | Entry: 1 143 | Data: VRC.SDK3.Components.VRCPickup, VRCSDK3 144 | - Name: 145 | Entry: 8 146 | Data: 147 | - Name: k__BackingField 148 | Entry: 9 149 | Data: 9 150 | - Name: k__BackingField 151 | Entry: 7 152 | Data: System.Nullable`1[[UdonSharp.UdonSyncMode, UdonSharp.Runtime]], mscorlib 153 | - Name: 154 | Entry: 6 155 | Data: 156 | - Name: 157 | Entry: 8 158 | Data: 159 | - Name: k__BackingField 160 | Entry: 5 161 | Data: false 162 | - Name: _fieldAttributes 163 | Entry: 7 164 | Data: 10|System.Collections.Generic.List`1[[System.Attribute, mscorlib]], mscorlib 165 | - Name: 166 | Entry: 12 167 | Data: 0 168 | - Name: 169 | Entry: 13 170 | Data: 171 | - Name: 172 | Entry: 8 173 | Data: 174 | - Name: 175 | Entry: 8 176 | Data: 177 | - Name: 178 | Entry: 8 179 | Data: 180 | - Name: 181 | Entry: 13 182 | Data: 183 | - Name: 184 | Entry: 8 185 | Data: 186 | -------------------------------------------------------------------------------- /Scripts/PortablePanelPickupModule.asset.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: eb7672cab5b1ff741938807b63df3a23 3 | NativeFormatImporter: 4 | externalObjects: {} 5 | mainObjectFileID: 11400000 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Scripts/PortablePanelPickupModule.cs: -------------------------------------------------------------------------------- 1 |  2 | using System; 3 | using UdonSharp; 4 | using UnityEngine; 5 | using VRC.SDK3.Components; 6 | using VRC.SDKBase; 7 | using VRC.Udon; 8 | 9 | namespace myro 10 | { 11 | public class PortablePanelPickupModule : UdonSharpBehaviour 12 | { 13 | [Header("See README file for additional help and infos")] 14 | [Header("This script should be attached next to the VRCPickup component")] 15 | public PortablePanel PortablePanelReference; 16 | private VRCPickup _pickupReference; 17 | 18 | void OnEnable() 19 | { 20 | if (PortablePanelReference) 21 | PortablePanelReference.SetPickupModule(this); 22 | 23 | _pickupReference = GetComponent(); 24 | } 25 | 26 | public override void OnPickup() 27 | { 28 | if (PortablePanelReference) 29 | PortablePanelReference.PanelPickedUp(); 30 | } 31 | 32 | public override void OnDrop() 33 | { 34 | if (PortablePanelReference) 35 | PortablePanelReference.PanelDropped(); 36 | } 37 | 38 | public void DisablePickup() 39 | { 40 | if (_pickupReference) 41 | { 42 | _pickupReference.pickupable = false; 43 | } 44 | } 45 | 46 | public void EnablePickup() 47 | { 48 | if (_pickupReference) 49 | { 50 | _pickupReference.pickupable = true; 51 | } 52 | } 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /Scripts/PortablePanelPickupModule.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: dfe5de7ae2147f2438fa668f28956550 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /ThrowablePanel.prefab.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 5d6d0819c573c1046b26676a28573fc3 3 | PrefabImporter: 4 | externalObjects: {} 5 | userData: 6 | assetBundleName: 7 | assetBundleVariant: 8 | --------------------------------------------------------------------------------