浏览代码

merging in the working plastic branch.

/main
UnityJacob 3 年前
当前提交
4dc33191
共有 98 个文件被更改,包括 6017 次插入2663 次删除
  1. 6
      Assets/Prefabs/GameStateManager.prefab
  2. 151
      Assets/Prefabs/UI/BackButtonBG.prefab
  3. 7
      Assets/Prefabs/UI/CreateContent.prefab
  4. 331
      Assets/Prefabs/UI/GameCanvas.prefab
  5. 241
      Assets/Prefabs/UI/JoinContent.prefab
  6. 67
      Assets/Prefabs/UI/JoinCreateRoomCanvas.prefab
  7. 196
      Assets/Prefabs/UI/LobbyGameCanvas.prefab
  8. 331
      Assets/Prefabs/UI/MainMenuCanvas.prefab
  9. 839
      Assets/Prefabs/UI/PlayerInteractionPanel.prefab
  10. 47
      Assets/Prefabs/UI/RelayCodeCanvas.prefab
  11. 7
      Assets/Prefabs/UI/UserCardPanel.prefab
  12. 435
      Assets/Scenes/mainMenu.unity
  13. 12
      Assets/Scripts/Auth/Identity.cs
  14. 17
      Assets/Scripts/Auth/SubIdentity_Authentication.cs
  15. 318
      Assets/Scripts/Entities/GameStateManager.cs
  16. 111
      Assets/Scripts/Entities/LobbyData.cs
  17. 78
      Assets/Scripts/Entities/LobbyReadyCheck.cs
  18. 21
      Assets/Scripts/Entities/LobbyServiceData.cs
  19. 28
      Assets/Scripts/Entities/LobbyUser.cs
  20. 3
      Assets/Scripts/Entities/LocalGameState.cs
  21. 6
      Assets/Scripts/Infrastructure/ObserverBehaviour.cs
  22. 3
      Assets/Scripts/Relay/RelayInterface.cs
  23. 95
      Assets/Scripts/Rooms/RoomsContentHeartbeat.cs
  24. 15
      Assets/Scripts/Rooms/RoomsInterface.cs
  25. 135
      Assets/Scripts/Rooms/RoomsQuery.cs
  26. 10
      Assets/Scripts/Rooms/ToLobbyData.cs
  27. 149
      Assets/Scripts/Tests/PlayMode/ReadyCheckTests.cs
  28. 44
      Assets/Scripts/Tests/PlayMode/RoomsRoundtripTests.cs
  29. 51
      Assets/Scripts/Tests/PlayMode/UpdateSlowTests.cs
  30. 5
      Assets/Scripts/UI/BackButtonUI.cs
  31. 3
      Assets/Scripts/UI/GameStateVisibilityUI.cs
  32. 20
      Assets/Scripts/UI/JoinCreateRoomUI.cs
  33. 29
      Assets/Scripts/UI/JoinMenuUI.cs
  34. 5
      Assets/Scripts/UI/LobbyButtonUI.cs
  35. 4
      Assets/Scripts/UI/UIPanelBase.cs
  36. 2
      Assets/Scripts/UI/CountdownUI.cs.meta
  37. 2
      Assets/Scripts/UI/EndGameButtonUI.cs.meta
  38. 4
      Assets/Scripts/Utilities/Messenger.cs
  39. 84
      Assets/Scripts/Utilities/UpdateSlow.cs
  40. 24
      Packages/manifest.json
  41. 79
      Packages/packages-lock.json
  42. 11
      ProjectSettings/ProjectSettings.asset
  43. 4
      ProjectSettings/ProjectVersion.txt
  44. 4
      ProjectSettings/UnityConnectSettings.asset
  45. 67
      .gitignore
  46. 8
      Assets/Art.meta
  47. 273
      Assets/Prefabs/UI/CountDownUI.prefab
  48. 7
      Assets/Prefabs/UI/CountDownUI.prefab.meta
  49. 1001
      Assets/Prefabs/UI/LobbyUserList.prefab
  50. 568
      Assets/Prefabs/UI/SpinnerUI.prefab
  51. 7
      Assets/Prefabs/UI/SpinnerUI.prefab.meta
  52. 19
      Assets/Scripts/UI/CountdownUI.cs
  53. 15
      Assets/Scripts/UI/EndGameButtonUI.cs
  54. 14
      Assets/Scripts/UI/ExitButtonUI.cs
  55. 11
      Assets/Scripts/UI/ExitButtonUI.cs.meta
  56. 19
      Assets/Scripts/UI/LobbyStateVisibilityUI.cs
  57. 11
      Assets/Scripts/UI/LobbyStateVisibilityUI.cs.meta
  58. 70
      Assets/Scripts/UI/LobbyUserCardUI.cs
  59. 65
      Assets/Scripts/UI/LobbyUsersUI.cs
  60. 23
      Assets/Scripts/UI/ReadyCheckUI.cs
  61. 52
      Assets/Scripts/UI/SpinnerUI.cs
  62. 11
      Assets/Scripts/UI/SpinnerUI.cs.meta
  63. 15
      Assets/Scripts/UI/StartLobbyButton.cs
  64. 11
      Assets/Scripts/UI/StartLobbyButton.cs.meta
  65. 73
      Assets/Scripts/Utilities/NameGenerator.cs
  66. 11
      Assets/Scripts/Utilities/NameGenerator.cs.meta
  67. 8
      Assets/StreamingAssets.meta
  68. 16
      ProjectSettings/BurstAotSettings_StandaloneWindows.json
  69. 6
      ProjectSettings/CommonBurstAotSettings.json
  70. 35
      ProjectSettings/MemorySettings.asset
  71. 0
      ProjectSettings/boot.config
  72. 8
      Assets/Art/Spinner.meta
  73. 40
      Assets/Art/Spinner/Spinner.png
  74. 97
      Assets/Art/Spinner/Spinner.png.meta
  75. 306
      Assets/Art/Spinner/SpinnerController.controller
  76. 8
      Assets/Art/Spinner/SpinnerController.controller.meta
  77. 215
      Assets/Art/Spinner/SpinnerError.anim
  78. 8
      Assets/Art/Spinner/SpinnerError.anim.meta
  79. 143
      Assets/Art/Spinner/SpinnerStatic.anim
  80. 8
      Assets/Art/Spinner/SpinnerStatic.anim.meta
  81. 199
      Assets/Art/Spinner/SpinnerUISpin.anim
  82. 8
      Assets/Art/Spinner/SpinnerUISpin.anim.meta
  83. 1001
      Assets/Prefabs/UI/PlayerList.prefab
  84. 15
      Assets/Scripts/UI/HostReadyCheckUI.cs
  85. 18
      Assets/Scripts/UI/LobbyUserInteractionUI.cs
  86. 72
      Assets/Scripts/UI/PlayerCardUI.cs
  87. 69
      Assets/Scripts/UI/RoomPlayersUI.cs
  88. 15
      Assets/Scripts/UI/UserReadyCheckUI.cs
  89. 0
      /Assets/Prefabs/UI/UserCardPanel.prefab.meta
  90. 0
      /Assets/Prefabs/UI/LobbyUserList.prefab.meta
  91. 0
      /Assets/Prefabs/UI/UserCardPanel.prefab
  92. 0
      /Assets/Scripts/UI/ReadyCheckUI.cs.meta
  93. 0
      /Assets/Scripts/UI/LobbyUserCardUI.cs.meta
  94. 0
      /Assets/Scripts/UI/LobbyUsersUI.cs.meta
  95. 0
      /Assets/Scripts/UI/CountdownUI.cs.meta
  96. 0
      /Assets/Scripts/UI/EndGameButtonUI.cs.meta

6
Assets/Prefabs/GameStateManager.prefab


m_Script: {fileID: 11500000, guid: b4f7225f73bfe6a4d9133ee45ac9cd73, type: 3}
m_Name:
m_EditorClassIdentifier:
m_LocalGameStateObservers:
- {fileID: 0}
- {fileID: 0}
m_logMode: 0
m_GameStateObservers: []
m_LobbyDataObservers:
- {fileID: 0}
- {fileID: 0}

m_EditorClassIdentifier:
m_updatePeriod: 2
m_durationToleranceMs: 50
m_doNotRemoveIfTooLong: 1
--- !u!114 &13498602845527961
MonoBehaviour:
m_ObjectHideFlags: 0

151
Assets/Prefabs/UI/BackButtonBG.prefab


m_Component:
- component: {fileID: 21306902101918852}
- component: {fileID: 8554403787917887813}
- component: {fileID: 75154529763011663}
- component: {fileID: 3548897939371032169}
- component: {fileID: 7262104930290195570}
- component: {fileID: 8907220659739637781}

m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children:
- {fileID: 8687266200334079465}
- {fileID: 2344342489728598789}
m_Father: {fileID: 0}
m_RootOrder: 0
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}

m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5416637149047939654}
m_CullTransparentMesh: 1
--- !u!114 &75154529763011663
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5416637149047939654}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 0}
m_Color: {r: 1, g: 1, b: 1, a: 0.392}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_Sprite: {fileID: 10907, guid: 0000000000000000f000000000000000, type: 0}
m_Type: 1
m_PreserveAspect: 0
m_FillCenter: 1
m_FillMethod: 4
m_FillAmount: 1
m_FillClockwise: 1
m_FillOrigin: 0
m_UseSpriteMesh: 0
m_PixelsPerUnitMultiplier: 1
--- !u!225 &3548897939371032169
CanvasGroup:
m_ObjectHideFlags: 0

m_StringArgument:
m_BoolArgument: 0
m_CallState: 2
observeOnStart: 1
--- !u!114 &7728157518251256520
MonoBehaviour:
m_ObjectHideFlags: 0

m_Script: {fileID: 11500000, guid: 166d8ab6b922da04f851733dcb0e37e1, type: 3}
m_Name:
m_EditorClassIdentifier:
m_onVisibilityChange:
m_PersistentCalls:
m_Calls: []
ShowThisWhen: 14
ShowThisWhen: 2
--- !u!1 &6668424015570691350
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 2344342489728598789}
- component: {fileID: 5813347457509296480}
- component: {fileID: 731239719284957053}
- component: {fileID: 8114326487105409297}
- component: {fileID: 5670435380500466409}
m_Layer: 5
m_Name: LobbyDataLayer
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &2344342489728598789
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6668424015570691350}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children:
- {fileID: 8687266200334079465}
m_Father: {fileID: 21306902101918852}
m_RootOrder: 0
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 1, y: 1}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 0, y: 0}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &5813347457509296480
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6668424015570691350}
m_CullTransparentMesh: 1
--- !u!225 &731239719284957053
CanvasGroup:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6668424015570691350}
m_Enabled: 1
m_Alpha: 1
m_Interactable: 1
m_BlocksRaycasts: 1
m_IgnoreParentGroups: 0
--- !u!114 &8114326487105409297
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6668424015570691350}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: f38cf340acfcd4c64a6968b7386ad570, type: 3}
m_Name:
m_EditorClassIdentifier:
m_onVisibilityChange:
m_PersistentCalls:
m_Calls: []
showing: 0
m_ShowThisWhen: 5
--- !u!114 &5670435380500466409
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6668424015570691350}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 70dfc2fde0a9ef04eaff29a138f0bf45, type: 3}
m_Name:
m_EditorClassIdentifier:
OnObservedUpdated:
m_PersistentCalls:
m_Calls:
- m_Target: {fileID: 8114326487105409297}
m_TargetAssemblyTypeName: LobbyRooms.UI.LobbyStateVisibilityUI, LobbyRooms
m_MethodName: ObservedUpdated
m_Mode: 0
m_Arguments:
m_ObjectArgument: {fileID: 0}
m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine
m_IntArgument: 0
m_FloatArgument: 0
m_StringArgument:
m_BoolArgument: 0
m_CallState: 2
observeOnStart: 1
--- !u!1 &9098499516663060533
GameObject:
m_ObjectHideFlags: 0

m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 9098499516663060533}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
m_Father: {fileID: 21306902101918852}
m_Father: {fileID: 2344342489728598789}
m_RootOrder: 0
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}

m_Calls:
- m_Target: {fileID: 7262104930290195570}
m_TargetAssemblyTypeName: LobbyRooms.UI.BackButtonUI, LobbyRooms
m_MethodName: ToMenu
m_MethodName: ToJoinMenu
m_Mode: 1
m_Arguments:
m_ObjectArgument: {fileID: 0}

7
Assets/Prefabs/UI/CreateContent.prefab


m_Script: {fileID: 11500000, guid: 8bea15db614f57749bb2bac5ae7811fa, type: 3}
m_Name:
m_EditorClassIdentifier:
m_onVisibilityChange:
m_PersistentCalls:
m_Calls: []
showing: 0
--- !u!1 &4576592091429739648
GameObject:

m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 0}
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_Color: {r: 0.8784314, g: 0.8784314, b: 0.8784314, a: 1}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1

m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 1, y: 1}
m_AnchoredPosition: {x: 0, y: -0.5000038}
m_AnchoredPosition: {x: 0, y: -0.5}
m_SizeDelta: {x: -20, y: -13}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &3669131696088233680

331
Assets/Prefabs/UI/GameCanvas.prefab


m_Children:
- {fileID: 7198558056059429223}
m_Father: {fileID: 2637199315522059511}
m_RootOrder: 2
m_RootOrder: 1
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 0, y: 0}

m_ConstrainProportionsScale: 0
m_Children:
- {fileID: 5835473579278904550}
- {fileID: 2637199315827525438}
- {fileID: 2637199315361559713}
m_Father: {fileID: 2637199315671523625}
m_RootOrder: 1

m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 1, y: 1}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 0, y: 0}
m_AnchoredPosition: {x: 0, y: -22.5}
m_SizeDelta: {x: 0, y: -55}
--- !u!1 &2637199315827525439
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 2637199315827525438}
- component: {fileID: 2637199315827525433}
m_Layer: 5
m_Name: LobbyCodeSpace
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &2637199315827525438
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2637199315827525439}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 2637199315522059511}
m_RootOrder: 1
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 0, y: 0}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 0, y: 0}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &2637199315827525433
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2637199315827525439}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3}
m_Name:
m_EditorClassIdentifier:
m_IgnoreLayout: 0
m_MinWidth: -1
m_MinHeight: -1
m_PreferredWidth: 300
m_PreferredHeight: -1
m_FlexibleWidth: -1
m_FlexibleHeight: -1
m_LayoutPriority: 1
--- !u!1 &2637199316291327116
GameObject:
m_ObjectHideFlags: 0

m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 1, y: 1}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 0, y: 0}
m_AnchoredPosition: {x: 0, y: -12.5}
m_SizeDelta: {x: 0, y: -75}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!1 &2637199316888954224
GameObject:

m_CorrespondingSourceObject: {fileID: 8624457953394683849, guid: 1ba83780824e3074a9e835b4d5811b49, type: 3}
m_PrefabInstance: {fileID: 2637199315632506633}
m_PrefabAsset: {fileID: 0}
--- !u!114 &8727371508936804372 stripped
MonoBehaviour:
m_CorrespondingSourceObject: {fileID: 6738771439990001437, guid: 1ba83780824e3074a9e835b4d5811b49, type: 3}
m_PrefabInstance: {fileID: 2637199315632506633}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 160dfc78f3641c94fbebe419be087996, type: 3}
m_Name:
m_EditorClassIdentifier:
--- !u!1001 &2637199316860760290
PrefabInstance:
m_ObjectHideFlags: 0

propertyPath: m_AnchoredPosition.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 5151938374126251259, guid: 0828349f6319d084bbba8edd08991e62, type: 3}
propertyPath: m_OnClick.m_PersistentCalls.m_Calls.Array.data[0].m_Target
value:
objectReference: {fileID: 8727371508936804372}
- target: {fileID: 5151938374672746532, guid: 0828349f6319d084bbba8edd08991e62, type: 3}
propertyPath: m_AnchorMax.y
value: 0

objectReference: {fileID: 0}
- target: {fileID: 5151938374718135902, guid: 0828349f6319d084bbba8edd08991e62, type: 3}
propertyPath: m_fontSize
value: 9.45
value: 10
objectReference: {fileID: 0}
- target: {fileID: 5151938375108891013, guid: 0828349f6319d084bbba8edd08991e62, type: 3}
propertyPath: m_Pivot.x

propertyPath: m_LocalEulerAnglesHint.z
value: 0
objectReference: {fileID: 0}
- target: {fileID: 1547097154637997990, guid: 65b3782fa4600fa4385f4eea3edd9865, type: 3}
propertyPath: m_OnClick.m_PersistentCalls.m_Calls.Array.data[0].m_Target
value:
objectReference: {fileID: 5470753818362462587}
m_RemovedComponents: []
m_SourcePrefab: {fileID: 100100000, guid: 65b3782fa4600fa4385f4eea3edd9865, type: 3}
--- !u!224 &2637199315599437355 stripped

propertyPath: m_AnchoredPosition.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 1282082741472604524, guid: 247f79ab5aefc6d40bcbdade4d9467b7, type: 3}
propertyPath: m_ChildAlignment
value: 3
objectReference: {fileID: 0}
- target: {fileID: 1282082741472604524, guid: 247f79ab5aefc6d40bcbdade4d9467b7, type: 3}
propertyPath: m_ChildForceExpandHeight
value: 1
objectReference: {fileID: 0}
- target: {fileID: 1324030099856200488, guid: 247f79ab5aefc6d40bcbdade4d9467b7, type: 3}
propertyPath: m_AnchorMax.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 1324030099856200488, guid: 247f79ab5aefc6d40bcbdade4d9467b7, type: 3}
propertyPath: m_AnchorMin.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 1324030099856200488, guid: 247f79ab5aefc6d40bcbdade4d9467b7, type: 3}
propertyPath: m_SizeDelta.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 1324030099856200488, guid: 247f79ab5aefc6d40bcbdade4d9467b7, type: 3}
propertyPath: m_SizeDelta.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 1324030099856200488, guid: 247f79ab5aefc6d40bcbdade4d9467b7, type: 3}
propertyPath: m_AnchoredPosition.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 1324030099856200488, guid: 247f79ab5aefc6d40bcbdade4d9467b7, type: 3}
propertyPath: m_AnchoredPosition.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 1523560632827509910, guid: 247f79ab5aefc6d40bcbdade4d9467b7, type: 3}
propertyPath: m_AnchorMax.y
value: 0

propertyPath: m_AnchoredPosition.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 1856752453915868733, guid: 247f79ab5aefc6d40bcbdade4d9467b7, type: 3}
propertyPath: m_ChildAlignment
value: 3
objectReference: {fileID: 0}
- target: {fileID: 1856752453915868733, guid: 247f79ab5aefc6d40bcbdade4d9467b7, type: 3}
propertyPath: m_ChildScaleWidth
value: 0
objectReference: {fileID: 0}
- target: {fileID: 1856752453915868733, guid: 247f79ab5aefc6d40bcbdade4d9467b7, type: 3}
propertyPath: m_ChildScaleHeight
value: 0
objectReference: {fileID: 0}
- target: {fileID: 1856752453915868733, guid: 247f79ab5aefc6d40bcbdade4d9467b7, type: 3}
propertyPath: m_ChildControlWidth
value: 1
objectReference: {fileID: 0}
- target: {fileID: 1856752453915868733, guid: 247f79ab5aefc6d40bcbdade4d9467b7, type: 3}
propertyPath: m_ChildControlHeight
value: 1
objectReference: {fileID: 0}
- target: {fileID: 1856752453915868733, guid: 247f79ab5aefc6d40bcbdade4d9467b7, type: 3}
propertyPath: m_ChildForceExpandWidth
value: 1
objectReference: {fileID: 0}
- target: {fileID: 1856752453915868733, guid: 247f79ab5aefc6d40bcbdade4d9467b7, type: 3}
propertyPath: m_ChildForceExpandHeight
value: 1
- target: {fileID: 1931419862822583626, guid: 247f79ab5aefc6d40bcbdade4d9467b7, type: 3}
propertyPath: m_fontSize
value: 21
objectReference: {fileID: 0}
- target: {fileID: 2050480525715301007, guid: 247f79ab5aefc6d40bcbdade4d9467b7, type: 3}
propertyPath: m_AnchorMax.y

propertyPath: m_AnchoredPosition.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 2384096191828402035, guid: 247f79ab5aefc6d40bcbdade4d9467b7, type: 3}
propertyPath: m_PreferredHeight
value: 40
objectReference: {fileID: 0}
- target: {fileID: 2422772915209687073, guid: 247f79ab5aefc6d40bcbdade4d9467b7, type: 3}
propertyPath: m_AnchorMax.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 2422772915209687073, guid: 247f79ab5aefc6d40bcbdade4d9467b7, type: 3}
propertyPath: m_AnchorMin.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 2422772915209687073, guid: 247f79ab5aefc6d40bcbdade4d9467b7, type: 3}
propertyPath: m_SizeDelta.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 2422772915209687073, guid: 247f79ab5aefc6d40bcbdade4d9467b7, type: 3}
propertyPath: m_AnchoredPosition.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 2422772915209687073, guid: 247f79ab5aefc6d40bcbdade4d9467b7, type: 3}
propertyPath: m_AnchoredPosition.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 2814659547823933198, guid: 247f79ab5aefc6d40bcbdade4d9467b7, type: 3}
propertyPath: m_AnchorMax.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 2814659547823933198, guid: 247f79ab5aefc6d40bcbdade4d9467b7, type: 3}
propertyPath: m_AnchorMin.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 2814659547823933198, guid: 247f79ab5aefc6d40bcbdade4d9467b7, type: 3}
propertyPath: m_SizeDelta.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 2814659547823933198, guid: 247f79ab5aefc6d40bcbdade4d9467b7, type: 3}
propertyPath: m_AnchoredPosition.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 2814659547823933198, guid: 247f79ab5aefc6d40bcbdade4d9467b7, type: 3}
propertyPath: m_AnchoredPosition.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 3182891541118836682, guid: 247f79ab5aefc6d40bcbdade4d9467b7, type: 3}
propertyPath: m_AnchorMax.y
value: 0

propertyPath: m_AnchoredPosition.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 3293280853072893777, guid: 247f79ab5aefc6d40bcbdade4d9467b7, type: 3}
- target: {fileID: 3335058099760921612, guid: 247f79ab5aefc6d40bcbdade4d9467b7, type: 3}
value: 19.6
objectReference: {fileID: 0}
- target: {fileID: 3403950992349691351, guid: 247f79ab5aefc6d40bcbdade4d9467b7, type: 3}
propertyPath: ShowThisWhen
value: 14
value: 15.4
objectReference: {fileID: 0}
- target: {fileID: 3711939936493401148, guid: 247f79ab5aefc6d40bcbdade4d9467b7, type: 3}
propertyPath: m_AnchorMax.y

propertyPath: m_AnchoredPosition.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 4722560659626684269, guid: 247f79ab5aefc6d40bcbdade4d9467b7, type: 3}
propertyPath: m_fontSize
value: 24.6
objectReference: {fileID: 0}
- target: {fileID: 4927412524127554603, guid: 247f79ab5aefc6d40bcbdade4d9467b7, type: 3}
propertyPath: m_PreferredHeight
value: 40
objectReference: {fileID: 0}
- target: {fileID: 5004882552582117716, guid: 247f79ab5aefc6d40bcbdade4d9467b7, type: 3}
propertyPath: m_AnchorMax.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 5004882552582117716, guid: 247f79ab5aefc6d40bcbdade4d9467b7, type: 3}
propertyPath: m_AnchorMin.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 5004882552582117716, guid: 247f79ab5aefc6d40bcbdade4d9467b7, type: 3}
propertyPath: m_SizeDelta.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 5004882552582117716, guid: 247f79ab5aefc6d40bcbdade4d9467b7, type: 3}
propertyPath: m_SizeDelta.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 5004882552582117716, guid: 247f79ab5aefc6d40bcbdade4d9467b7, type: 3}
propertyPath: m_AnchoredPosition.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 5004882552582117716, guid: 247f79ab5aefc6d40bcbdade4d9467b7, type: 3}
propertyPath: m_AnchoredPosition.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 5217713644687709610, guid: 247f79ab5aefc6d40bcbdade4d9467b7, type: 3}
propertyPath: m_fontSize
value: 24.6
objectReference: {fileID: 0}
- target: {fileID: 5410867900981798311, guid: 247f79ab5aefc6d40bcbdade4d9467b7, type: 3}
propertyPath: m_AnchorMax.y
value: 0

propertyPath: m_AnchoredPosition.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 5713552561910003945, guid: 247f79ab5aefc6d40bcbdade4d9467b7, type: 3}
propertyPath: m_fontSize
value: 37.3
objectReference: {fileID: 0}
- target: {fileID: 5749901921003950368, guid: 247f79ab5aefc6d40bcbdade4d9467b7, type: 3}
propertyPath: m_AnchorMax.y
value: 0

objectReference: {fileID: 0}
- target: {fileID: 6281383251298602143, guid: 247f79ab5aefc6d40bcbdade4d9467b7, type: 3}
propertyPath: m_fontSize
value: 20.85
value: 53.7
objectReference: {fileID: 0}
- target: {fileID: 6701676754128905643, guid: 247f79ab5aefc6d40bcbdade4d9467b7, type: 3}
propertyPath: m_AnchorMax.y

propertyPath: m_AnchoredPosition.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 7372764269032994886, guid: 247f79ab5aefc6d40bcbdade4d9467b7, type: 3}
propertyPath: m_MinHeight
value: 100
objectReference: {fileID: 0}
- target: {fileID: 7503594125325115352, guid: 247f79ab5aefc6d40bcbdade4d9467b7, type: 3}
propertyPath: m_SizeDelta.x
value: -0.000004053116
objectReference: {fileID: 0}
- target: {fileID: 7503594125325115352, guid: 247f79ab5aefc6d40bcbdade4d9467b7, type: 3}
propertyPath: m_AnchoredPosition.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 7680167432719608125, guid: 247f79ab5aefc6d40bcbdade4d9467b7, type: 3}
propertyPath: m_fontSize
value: 20.85
objectReference: {fileID: 0}
- target: {fileID: 7904081599461911821, guid: 247f79ab5aefc6d40bcbdade4d9467b7, type: 3}
propertyPath: m_AnchorMax.y
value: 0

propertyPath: m_AnchoredPosition.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 8209819504937975015, guid: 247f79ab5aefc6d40bcbdade4d9467b7, type: 3}
propertyPath: m_fontSize
value: 22.75
objectReference: {fileID: 0}
- target: {fileID: 8694871130870774657, guid: 247f79ab5aefc6d40bcbdade4d9467b7, type: 3}
- target: {fileID: 8010456722975913285, guid: 247f79ab5aefc6d40bcbdade4d9467b7, type: 3}
- target: {fileID: 8694871130870774657, guid: 247f79ab5aefc6d40bcbdade4d9467b7, type: 3}
- target: {fileID: 8010456722975913285, guid: 247f79ab5aefc6d40bcbdade4d9467b7, type: 3}
- target: {fileID: 8694871130870774657, guid: 247f79ab5aefc6d40bcbdade4d9467b7, type: 3}
- target: {fileID: 8010456722975913285, guid: 247f79ab5aefc6d40bcbdade4d9467b7, type: 3}
- target: {fileID: 8694871130870774657, guid: 247f79ab5aefc6d40bcbdade4d9467b7, type: 3}
- target: {fileID: 8010456722975913285, guid: 247f79ab5aefc6d40bcbdade4d9467b7, type: 3}
- target: {fileID: 8694871130870774657, guid: 247f79ab5aefc6d40bcbdade4d9467b7, type: 3}
- target: {fileID: 8010456722975913285, guid: 247f79ab5aefc6d40bcbdade4d9467b7, type: 3}
- target: {fileID: 8694871130870774657, guid: 247f79ab5aefc6d40bcbdade4d9467b7, type: 3}
- target: {fileID: 8010456722975913285, guid: 247f79ab5aefc6d40bcbdade4d9467b7, type: 3}
- target: {fileID: 8886574141879526165, guid: 247f79ab5aefc6d40bcbdade4d9467b7, type: 3}
- target: {fileID: 8694871130870774657, guid: 247f79ab5aefc6d40bcbdade4d9467b7, type: 3}
- target: {fileID: 8886574141879526165, guid: 247f79ab5aefc6d40bcbdade4d9467b7, type: 3}
- target: {fileID: 8694871130870774657, guid: 247f79ab5aefc6d40bcbdade4d9467b7, type: 3}
- target: {fileID: 8886574141879526165, guid: 247f79ab5aefc6d40bcbdade4d9467b7, type: 3}
- target: {fileID: 8694871130870774657, guid: 247f79ab5aefc6d40bcbdade4d9467b7, type: 3}
- target: {fileID: 8886574141879526165, guid: 247f79ab5aefc6d40bcbdade4d9467b7, type: 3}
- target: {fileID: 8694871130870774657, guid: 247f79ab5aefc6d40bcbdade4d9467b7, type: 3}
- target: {fileID: 8886574141879526165, guid: 247f79ab5aefc6d40bcbdade4d9467b7, type: 3}
- target: {fileID: 8694871130870774657, guid: 247f79ab5aefc6d40bcbdade4d9467b7, type: 3}
- target: {fileID: 8886574141879526165, guid: 247f79ab5aefc6d40bcbdade4d9467b7, type: 3}
- target: {fileID: 8694871130870774657, guid: 247f79ab5aefc6d40bcbdade4d9467b7, type: 3}
propertyPath: m_AnchoredPosition.y
value: 0
objectReference: {fileID: 0}

propertyPath: m_AnchoredPosition.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 9058189068712536705, guid: 247f79ab5aefc6d40bcbdade4d9467b7, type: 3}
propertyPath: m_PreferredHeight
value: 40
objectReference: {fileID: 0}
- target: {fileID: 9144369111795119887, guid: 247f79ab5aefc6d40bcbdade4d9467b7, type: 3}
propertyPath: m_AnchorMax.y
value: 0

propertyPath: m_AnchoredPosition.y
value: 0
objectReference: {fileID: 0}
m_RemovedComponents: []
m_RemovedComponents:
- {fileID: 418819164531713121, guid: 247f79ab5aefc6d40bcbdade4d9467b7, type: 3}
m_SourcePrefab: {fileID: 100100000, guid: 247f79ab5aefc6d40bcbdade4d9467b7, type: 3}
--- !u!224 &2637199317172016811 stripped
RectTransform:

m_Modifications:
- target: {fileID: 66823810940833564, guid: 404728f5cffe43940b290121bd31f601, type: 3}
propertyPath: m_fontSize
value: 60.4
value: 35.8
objectReference: {fileID: 0}
- target: {fileID: 374782365913103796, guid: 404728f5cffe43940b290121bd31f601, type: 3}
propertyPath: m_AnchorMax.y

objectReference: {fileID: 0}
- target: {fileID: 397013347580426150, guid: 404728f5cffe43940b290121bd31f601, type: 3}
propertyPath: m_fontSize
value: 20.35
value: 18
objectReference: {fileID: 0}
- target: {fileID: 1119140321553661053, guid: 404728f5cffe43940b290121bd31f601, type: 3}
propertyPath: m_AnchorMax.y

objectReference: {fileID: 0}
- target: {fileID: 3638764283281205412, guid: 404728f5cffe43940b290121bd31f601, type: 3}
propertyPath: m_Size
value: 0.06396256
value: 1
objectReference: {fileID: 0}
- target: {fileID: 3638764283281205412, guid: 404728f5cffe43940b290121bd31f601, type: 3}
propertyPath: m_Value

value: 0
objectReference: {fileID: 0}
- target: {fileID: 3782051382377840548, guid: 404728f5cffe43940b290121bd31f601, type: 3}
propertyPath: m_SizeDelta.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 3930986831690407628, guid: 404728f5cffe43940b290121bd31f601, type: 3}
propertyPath: m_SizeDelta.y
value: 0
objectReference: {fileID: 0}

objectReference: {fileID: 0}
- target: {fileID: 3930986831690407628, guid: 404728f5cffe43940b290121bd31f601, type: 3}
propertyPath: m_AnchoredPosition.y
value: 4.6397424
value: 0.000011920929
objectReference: {fileID: 0}
- target: {fileID: 4583769822633113396, guid: 404728f5cffe43940b290121bd31f601, type: 3}
propertyPath: m_AnchorMax.x

propertyPath: m_Name
value: JoinCreateRoomCanvas
objectReference: {fileID: 0}
- target: {fileID: 5836614391142406755, guid: 404728f5cffe43940b290121bd31f601, type: 3}
propertyPath: m_IsActive
value: 1
objectReference: {fileID: 0}
- target: {fileID: 5836614391142406767, guid: 404728f5cffe43940b290121bd31f601, type: 3}
propertyPath: m_Pivot.x
value: 0.5

objectReference: {fileID: 0}
- target: {fileID: 5919863887503833647, guid: 404728f5cffe43940b290121bd31f601, type: 3}
propertyPath: m_AnchoredPosition.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 6102798993520257211, guid: 404728f5cffe43940b290121bd31f601, type: 3}
propertyPath: m_Alpha
value: 0
objectReference: {fileID: 0}
- target: {fileID: 6742761257817967520, guid: 404728f5cffe43940b290121bd31f601, type: 3}

objectReference: {fileID: 0}
- target: {fileID: 8314627591180998490, guid: 404728f5cffe43940b290121bd31f601, type: 3}
propertyPath: m_fontSize
value: 58.15
value: 31.25
objectReference: {fileID: 0}
- target: {fileID: 8437021287377131492, guid: 404728f5cffe43940b290121bd31f601, type: 3}
propertyPath: m_AnchorMax.y

objectReference: {fileID: 0}
- target: {fileID: 8502326957445156609, guid: 404728f5cffe43940b290121bd31f601, type: 3}
propertyPath: m_fontSize
value: 58.15
value: 31.25
objectReference: {fileID: 0}
- target: {fileID: 8636295960037856115, guid: 404728f5cffe43940b290121bd31f601, type: 3}
propertyPath: m_AnchorMax.y

m_CorrespondingSourceObject: {fileID: 5836614391142406767, guid: 404728f5cffe43940b290121bd31f601, type: 3}
m_PrefabInstance: {fileID: 8387645425390731067}
m_PrefabAsset: {fileID: 0}
--- !u!114 &5470753818362462587 stripped
MonoBehaviour:
m_CorrespondingSourceObject: {fileID: 4578721078997909056, guid: 404728f5cffe43940b290121bd31f601, type: 3}
m_PrefabInstance: {fileID: 8387645425390731067}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 529b8834cbd491e4db04601e76a21e26, type: 3}
m_Name:
m_EditorClassIdentifier:
--- !u!1001 &8690587081894129692
PrefabInstance:
m_ObjectHideFlags: 0

241
Assets/Prefabs/UI/JoinContent.prefab


m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 1}
m_AnchorMax: {x: 1, y: 1}
m_AnchoredPosition: {x: 0, y: 12.965621}
m_SizeDelta: {x: 0, y: 300}
m_AnchoredPosition: {x: 0, y: 0.000030517578}
m_SizeDelta: {x: 0, y: 0}
m_Pivot: {x: 0, y: 1}
--- !u!114 &3612080823527636284
MonoBehaviour:

m_Name:
m_EditorClassIdentifier:
m_HorizontalFit: 0
m_VerticalFit: 0
m_VerticalFit: 2
--- !u!1 &785260762106121644
GameObject:
m_ObjectHideFlags: 0

m_StringArgument:
m_BoolArgument: 0
m_CallState: 2
observeOnStart: 1
--- !u!114 &7645291363343340383
MonoBehaviour:
m_ObjectHideFlags: 0

m_OnValueChanged:
m_PersistentCalls:
m_Calls: []
--- !u!1 &3614279600558145895
--- !u!1 &3356385148564036691
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}

m_Component:
- component: {fileID: 5114133786653555552}
- component: {fileID: 3571761343734080488}
- component: {fileID: 3253507337897622672}
- component: {fileID: 7022454495411658382}
- component: {fileID: 4537286538468524376}
- component: {fileID: 8506982792449048742}
m_Name: Text (TMP)
m_Name: Panel
--- !u!224 &5114133786653555552
--- !u!224 &7022454495411658382
m_GameObject: {fileID: 3614279600558145895}
m_GameObject: {fileID: 3356385148564036691}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}

m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 1, y: 1}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 0, y: 0}
m_SizeDelta: {x: -10, y: -10}
--- !u!222 &3571761343734080488
--- !u!222 &4537286538468524376
m_GameObject: {fileID: 3614279600558145895}
m_GameObject: {fileID: 3356385148564036691}
--- !u!114 &3253507337897622672
--- !u!114 &8506982792449048742
m_GameObject: {fileID: 3614279600558145895}
m_GameObject: {fileID: 3356385148564036691}
m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3}
m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_Color: {r: 1, g: 1, b: 1, a: 0.7529412}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1

m_text: Refresh
m_isRightToLeft: 0
m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
m_fontSharedMaterials: []
m_fontMaterial: {fileID: 0}
m_fontMaterials: []
m_fontColor32:
serializedVersion: 2
rgba: 4281479730
m_fontColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1}
m_enableVertexGradient: 0
m_colorMode: 3
m_fontColorGradient:
topLeft: {r: 1, g: 1, b: 1, a: 1}
topRight: {r: 1, g: 1, b: 1, a: 1}
bottomLeft: {r: 1, g: 1, b: 1, a: 1}
bottomRight: {r: 1, g: 1, b: 1, a: 1}
m_fontColorGradientPreset: {fileID: 0}
m_spriteAsset: {fileID: 0}
m_tintAllSprites: 0
m_StyleSheet: {fileID: 0}
m_TextStyleHashCode: -1183493901
m_overrideHtmlColors: 0
m_faceColor:
serializedVersion: 2
rgba: 4294967295
m_fontSize: 9.65
m_fontSizeBase: 24
m_fontWeight: 400
m_enableAutoSizing: 1
m_fontSizeMin: 5
m_fontSizeMax: 72
m_fontStyle: 0
m_HorizontalAlignment: 2
m_VerticalAlignment: 512
m_textAlignment: 65535
m_characterSpacing: 0
m_wordSpacing: 0
m_lineSpacing: 0
m_lineSpacingMax: 0
m_paragraphSpacing: 0
m_charWidthMaxAdj: 0
m_enableWordWrapping: 1
m_wordWrappingRatios: 0.4
m_overflowMode: 0
m_linkedTextComponent: {fileID: 0}
parentLinkedComponent: {fileID: 0}
m_enableKerning: 1
m_enableExtraPadding: 0
checkPaddingRequired: 0
m_isRichText: 1
m_parseCtrlCharacters: 1
m_isOrthographic: 1
m_isCullingEnabled: 0
m_horizontalMapping: 0
m_verticalMapping: 0
m_uvLineOffset: 0
m_geometrySortingOrder: 0
m_IsTextObjectScaleStatic: 0
m_VertexBufferAutoSizeReduction: 0
m_useMaxVisibleDescender: 1
m_pageToDisplay: 1
m_margin: {x: 3, y: 3, z: 3, w: 3}
m_isUsingLegacyAnimationComponent: 0
m_isVolumetricText: 0
m_hasFontAssetChanged: 0
m_baseMaterial: {fileID: 0}
m_maskOffset: {x: 0, y: 0, z: 0, w: 0}
m_Sprite: {fileID: 21300000, guid: 7eb43e8205c10c846b4243bb963f4aa4, type: 3}
m_Type: 0
m_PreserveAspect: 0
m_FillCenter: 1
m_FillMethod: 4
m_FillAmount: 1
m_FillClockwise: 1
m_FillOrigin: 0
m_UseSpriteMesh: 0
m_PixelsPerUnitMultiplier: 1
--- !u!1 &3801280251887582696
GameObject:
m_ObjectHideFlags: 0

m_faceColor:
serializedVersion: 2
rgba: 4294967295
m_fontSize: 30.45
m_fontSize: 35.8
m_fontSizeBase: 24
m_fontWeight: 400
m_enableAutoSizing: 1

m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children:
- {fileID: 5114133786653555552}
- {fileID: 7022454495411658382}
m_Father: {fileID: 4051350118216901408}
m_RootOrder: 0
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}

m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 0}
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_Color: {r: 1, g: 1, b: 1, a: 0.7529412}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1

m_ConstrainProportionsScale: 0
m_Children:
- {fileID: 7824921818678239159}
- {fileID: 8814352389997950082}
m_Father: {fileID: 4100995143772770972}
m_RootOrder: 0
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}

m_TargetGraphic: {fileID: 6537579147320774990}
m_HandleRect: {fileID: 7315760059761538639}
m_Direction: 2
m_Value: -0.000007061249
m_Size: 0.95673674
m_Value: 0
m_Size: 1
m_NumberOfSteps: 0
m_OnValueChanged:
m_PersistentCalls:

m_ChildAlignment: 3
m_Spacing: 5
m_ChildForceExpandWidth: 0
m_ChildForceExpandHeight: 1
m_ChildForceExpandHeight: 0
m_ChildControlWidth: 1
m_ChildControlHeight: 1
m_ChildScaleWidth: 0

m_EditorClassIdentifier:
m_IgnoreLayout: 0
m_MinWidth: -1
m_MinHeight: 30
m_MinHeight: 50
m_PreferredHeight: 40
m_PreferredHeight: -1
m_FlexibleHeight: 1
m_FlexibleHeight: -1
m_LayoutPriority: 1
--- !u!1 &8940655666626669338
GameObject:

m_MinWidth: -1
m_MinHeight: -1
m_PreferredWidth: 200
m_PreferredHeight: 50
m_PreferredHeight: 40
m_FlexibleWidth: -1
m_FlexibleHeight: -1
m_LayoutPriority: 1

m_FlexibleWidth: -1
m_FlexibleHeight: -1
m_LayoutPriority: 1
--- !u!1001 &769605433028665681
PrefabInstance:
m_ObjectHideFlags: 0
serializedVersion: 2
m_Modification:
m_TransformParent: {fileID: 7955209533444849375}
m_Modifications:
- target: {fileID: 3328931846061827219, guid: c9b04951bd45e154b8096955d9bc8a0b, type: 3}
propertyPath: m_Color.a
value: 0.6666667
objectReference: {fileID: 0}
- target: {fileID: 7144088886657378797, guid: c9b04951bd45e154b8096955d9bc8a0b, type: 3}
propertyPath: m_Name
value: Spinner
objectReference: {fileID: 0}
- target: {fileID: 8141644855275361747, guid: c9b04951bd45e154b8096955d9bc8a0b, type: 3}
propertyPath: m_Pivot.x
value: 0.5
objectReference: {fileID: 0}
- target: {fileID: 8141644855275361747, guid: c9b04951bd45e154b8096955d9bc8a0b, type: 3}
propertyPath: m_Pivot.y
value: 0.5
objectReference: {fileID: 0}
- target: {fileID: 8141644855275361747, guid: c9b04951bd45e154b8096955d9bc8a0b, type: 3}
propertyPath: m_RootOrder
value: 1
objectReference: {fileID: 0}
- target: {fileID: 8141644855275361747, guid: c9b04951bd45e154b8096955d9bc8a0b, type: 3}
propertyPath: m_AnchorMax.x
value: 0.5
objectReference: {fileID: 0}
- target: {fileID: 8141644855275361747, guid: c9b04951bd45e154b8096955d9bc8a0b, type: 3}
propertyPath: m_AnchorMax.y
value: 0.5
objectReference: {fileID: 0}
- target: {fileID: 8141644855275361747, guid: c9b04951bd45e154b8096955d9bc8a0b, type: 3}
propertyPath: m_AnchorMin.x
value: 0.5
objectReference: {fileID: 0}
- target: {fileID: 8141644855275361747, guid: c9b04951bd45e154b8096955d9bc8a0b, type: 3}
propertyPath: m_AnchorMin.y
value: 0.5
objectReference: {fileID: 0}
- target: {fileID: 8141644855275361747, guid: c9b04951bd45e154b8096955d9bc8a0b, type: 3}
propertyPath: m_SizeDelta.x
value: 100
objectReference: {fileID: 0}
- target: {fileID: 8141644855275361747, guid: c9b04951bd45e154b8096955d9bc8a0b, type: 3}
propertyPath: m_SizeDelta.y
value: 100
objectReference: {fileID: 0}
- target: {fileID: 8141644855275361747, guid: c9b04951bd45e154b8096955d9bc8a0b, type: 3}
propertyPath: m_LocalPosition.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 8141644855275361747, guid: c9b04951bd45e154b8096955d9bc8a0b, type: 3}
propertyPath: m_LocalPosition.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 8141644855275361747, guid: c9b04951bd45e154b8096955d9bc8a0b, type: 3}
propertyPath: m_LocalPosition.z
value: 0
objectReference: {fileID: 0}
- target: {fileID: 8141644855275361747, guid: c9b04951bd45e154b8096955d9bc8a0b, type: 3}
propertyPath: m_LocalRotation.w
value: 1
objectReference: {fileID: 0}
- target: {fileID: 8141644855275361747, guid: c9b04951bd45e154b8096955d9bc8a0b, type: 3}
propertyPath: m_LocalRotation.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 8141644855275361747, guid: c9b04951bd45e154b8096955d9bc8a0b, type: 3}
propertyPath: m_LocalRotation.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 8141644855275361747, guid: c9b04951bd45e154b8096955d9bc8a0b, type: 3}
propertyPath: m_LocalRotation.z
value: 0
objectReference: {fileID: 0}
- target: {fileID: 8141644855275361747, guid: c9b04951bd45e154b8096955d9bc8a0b, type: 3}
propertyPath: m_AnchoredPosition.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 8141644855275361747, guid: c9b04951bd45e154b8096955d9bc8a0b, type: 3}
propertyPath: m_AnchoredPosition.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 8141644855275361747, guid: c9b04951bd45e154b8096955d9bc8a0b, type: 3}
propertyPath: m_LocalEulerAnglesHint.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 8141644855275361747, guid: c9b04951bd45e154b8096955d9bc8a0b, type: 3}
propertyPath: m_LocalEulerAnglesHint.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 8141644855275361747, guid: c9b04951bd45e154b8096955d9bc8a0b, type: 3}
propertyPath: m_LocalEulerAnglesHint.z
value: 0
objectReference: {fileID: 0}
m_RemovedComponents: []
m_SourcePrefab: {fileID: 100100000, guid: c9b04951bd45e154b8096955d9bc8a0b, type: 3}
--- !u!224 &8814352389997950082 stripped
RectTransform:
m_CorrespondingSourceObject: {fileID: 8141644855275361747, guid: c9b04951bd45e154b8096955d9bc8a0b, type: 3}
m_PrefabInstance: {fileID: 769605433028665681}
m_PrefabAsset: {fileID: 0}

67
Assets/Prefabs/UI/JoinCreateRoomCanvas.prefab


m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 0}
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_Color: {r: 0.8773585, g: 0.8773585, b: 0.8773585, a: 1}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1

- component: {fileID: 5639261253646672088}
- component: {fileID: 8158052573755836851}
- component: {fileID: 6665477889391988598}
- component: {fileID: 5354665607884969002}
m_Layer: 5
m_Name: BackButton
m_TagString: Untagged

m_OnClick:
m_PersistentCalls:
m_Calls:
- m_Target: {fileID: 4578721078997909056}
m_TargetAssemblyTypeName: LobbyRooms.UI.UIPanelBase, LobbyRooms
m_MethodName: Hide
- m_Target: {fileID: 5354665607884969002}
m_TargetAssemblyTypeName: LobbyRooms.UI.BackButtonUI, LobbyRooms
m_MethodName: ToMenu
m_Mode: 1
m_Arguments:
m_ObjectArgument: {fileID: 0}

m_FlexibleWidth: -1
m_FlexibleHeight: -1
m_LayoutPriority: 1
--- !u!114 &5354665607884969002
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3486344428529569277}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 3c93e82eef7d613418b85194aace7f69, type: 3}
m_Name:
m_EditorClassIdentifier:
--- !u!1 &3603267332317325680
GameObject:
m_ObjectHideFlags: 0

m_faceColor:
serializedVersion: 2
rgba: 4294967295
m_fontSize: 35.7
m_fontSize: 35.85
m_fontSizeBase: 24
m_fontWeight: 400
m_enableAutoSizing: 1

m_faceColor:
serializedVersion: 2
rgba: 4294967295
m_fontSize: 35.7
m_fontSize: 35.85
m_fontSizeBase: 24
m_fontWeight: 400
m_enableAutoSizing: 1

- component: {fileID: 5836614391142406752}
- component: {fileID: 4578721078997909056}
- component: {fileID: 6102798993520257211}
- component: {fileID: 1512606419251751951}
m_Layer: 5
m_Name: JoinCreateRoomCanvas
m_TagString: Untagged

m_Script: {fileID: 11500000, guid: 529b8834cbd491e4db04601e76a21e26, type: 3}
m_Name:
m_EditorClassIdentifier:
m_onVisibilityChange:
m_PersistentCalls:
m_Calls: []
showing: 0
--- !u!225 &6102798993520257211
CanvasGroup:

m_Interactable: 1
m_BlocksRaycasts: 1
m_IgnoreParentGroups: 0
--- !u!114 &1512606419251751951
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5836614391142406755}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 51373dc3c6ac79b4f8e36ac7c4419205, type: 3}
m_Name:
m_EditorClassIdentifier:
OnObservedUpdated:
m_PersistentCalls:
m_Calls:
- m_Target: {fileID: 4578721078997909056}
m_TargetAssemblyTypeName: LobbyRooms.UI.JoinCreateRoomUI, LobbyRooms
m_MethodName: ObservedUpdated
m_Mode: 0
m_Arguments:
m_ObjectArgument: {fileID: 0}
m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine
m_IntArgument: 0
m_FloatArgument: 0
m_StringArgument:
m_BoolArgument: 0
m_CallState: 2
observeOnStart: 1
--- !u!1 &7348548600648247480
GameObject:
m_ObjectHideFlags: 0

objectReference: {fileID: 0}
- target: {fileID: 6554840528482635367, guid: c308ffc2a02e5ab4bbe70a8b2e8108c6, type: 3}
propertyPath: m_fontSize
value: 49.15
value: 49.25
objectReference: {fileID: 0}
- target: {fileID: 7315760059761538639, guid: c308ffc2a02e5ab4bbe70a8b2e8108c6, type: 3}
propertyPath: m_AnchorMax.x

- target: {fileID: 7573825319354851387, guid: c308ffc2a02e5ab4bbe70a8b2e8108c6, type: 3}
propertyPath: m_AnchorMin.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 7824921818678239159, guid: c308ffc2a02e5ab4bbe70a8b2e8108c6, type: 3}
propertyPath: m_SizeDelta.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 7824921818678239159, guid: c308ffc2a02e5ab4bbe70a8b2e8108c6, type: 3}
propertyPath: m_AnchoredPosition.y
value: 0.000029735498
objectReference: {fileID: 0}
- target: {fileID: 7955209533444849375, guid: c308ffc2a02e5ab4bbe70a8b2e8108c6, type: 3}
propertyPath: m_AnchorMax.x

196
Assets/Prefabs/UI/LobbyGameCanvas.prefab


m_StringArgument:
m_BoolArgument: 0
m_CallState: 2
observeOnStart: 1
--- !u!114 &3403950992349691351
MonoBehaviour:
m_ObjectHideFlags: 0

m_Script: {fileID: 11500000, guid: 166d8ab6b922da04f851733dcb0e37e1, type: 3}
m_Name:
m_EditorClassIdentifier:
m_onVisibilityChange:
m_PersistentCalls:
m_Calls: []
ShowThisWhen: 6
ShowThisWhen: 2
--- !u!1 &4637522307789944801
GameObject:
m_ObjectHideFlags: 0

m_StringArgument:
m_BoolArgument: 0
m_CallState: 2
observeOnStart: 1
--- !u!114 &6860436446719602335
MonoBehaviour:
m_ObjectHideFlags: 0

m_Script: {fileID: 11500000, guid: e9fd35ea14cd449428dd0b751b1f13c0, type: 3}
m_Name:
m_EditorClassIdentifier:
m_onVisibilityChange:
m_PersistentCalls:
m_Calls: []
showing: 0
m_ServerNameText: {fileID: 7322885418547999459}
--- !u!225 &6749879306276389991

m_StringArgument:
m_BoolArgument: 0
m_CallState: 2
observeOnStart: 1
--- !u!114 &279783410280127446
MonoBehaviour:
m_ObjectHideFlags: 0

m_Script: {fileID: 11500000, guid: a13af6aa02ca28341ae671097a70fdb8, type: 3}
m_Name:
m_EditorClassIdentifier:
m_onVisibilityChange:
m_PersistentCalls:
m_Calls: []
showing: 0
m_IPAddressText: {fileID: 2804283545537723312}
--- !u!225 &8630015524497407890

propertyPath: m_Alpha
value: 0
objectReference: {fileID: 0}
m_RemovedComponents:
- {fileID: 7948229591525432809, guid: 27536a164837c9141bbe1adf7ba37dde, type: 3}
- {fileID: 8640852021294056703, guid: 27536a164837c9141bbe1adf7ba37dde, type: 3}
m_RemovedComponents: []
m_SourcePrefab: {fileID: 100100000, guid: 27536a164837c9141bbe1adf7ba37dde, type: 3}
--- !u!224 &2957117094117392419 stripped
RectTransform:

m_Modification:
m_TransformParent: {fileID: 2244251207921394025}
m_Modifications:
- target: {fileID: 137400430986805703, guid: 2ff073ec9c74c8942bd90a541dc41bfc, type: 3}
propertyPath: m_AnchorMax.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 137400430986805703, guid: 2ff073ec9c74c8942bd90a541dc41bfc, type: 3}
propertyPath: m_AnchorMin.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 137400430986805703, guid: 2ff073ec9c74c8942bd90a541dc41bfc, type: 3}
propertyPath: m_SizeDelta.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 137400430986805703, guid: 2ff073ec9c74c8942bd90a541dc41bfc, type: 3}
propertyPath: m_SizeDelta.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 137400430986805703, guid: 2ff073ec9c74c8942bd90a541dc41bfc, type: 3}
propertyPath: m_AnchoredPosition.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 137400430986805703, guid: 2ff073ec9c74c8942bd90a541dc41bfc, type: 3}
propertyPath: m_AnchoredPosition.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 1135759803389522016, guid: 2ff073ec9c74c8942bd90a541dc41bfc, type: 3}
propertyPath: m_AnchorMax.y
value: 0

objectReference: {fileID: 0}
- target: {fileID: 2507055715224942121, guid: 2ff073ec9c74c8942bd90a541dc41bfc, type: 3}
propertyPath: m_Pivot.y
value: 1
value: 0
objectReference: {fileID: 0}
- target: {fileID: 2507055715224942121, guid: 2ff073ec9c74c8942bd90a541dc41bfc, type: 3}
propertyPath: m_RootOrder

objectReference: {fileID: 0}
- target: {fileID: 2507055715224942121, guid: 2ff073ec9c74c8942bd90a541dc41bfc, type: 3}
propertyPath: m_AnchorMax.y
value: 1
value: 0
objectReference: {fileID: 0}
- target: {fileID: 2507055715224942121, guid: 2ff073ec9c74c8942bd90a541dc41bfc, type: 3}
propertyPath: m_AnchorMin.x

value: 0
objectReference: {fileID: 0}
- target: {fileID: 2507055715224942121, guid: 2ff073ec9c74c8942bd90a541dc41bfc, type: 3}
propertyPath: m_SizeDelta.x
value: -30
objectReference: {fileID: 0}
- target: {fileID: 2507055715224942121, guid: 2ff073ec9c74c8942bd90a541dc41bfc, type: 3}
value: -340
value: 60
objectReference: {fileID: 0}
- target: {fileID: 2507055715224942121, guid: 2ff073ec9c74c8942bd90a541dc41bfc, type: 3}
propertyPath: m_LocalPosition.x

value: 0
objectReference: {fileID: 0}
- target: {fileID: 2507055715224942121, guid: 2ff073ec9c74c8942bd90a541dc41bfc, type: 3}
propertyPath: m_AnchoredPosition.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 2507055715224942121, guid: 2ff073ec9c74c8942bd90a541dc41bfc, type: 3}
value: -325
value: 0
objectReference: {fileID: 0}
- target: {fileID: 2507055715224942121, guid: 2ff073ec9c74c8942bd90a541dc41bfc, type: 3}
propertyPath: m_LocalEulerAnglesHint.x

propertyPath: m_AnchoredPosition.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 3614325118981636814, guid: 2ff073ec9c74c8942bd90a541dc41bfc, type: 3}
propertyPath: m_AnchorMax.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 3614325118981636814, guid: 2ff073ec9c74c8942bd90a541dc41bfc, type: 3}
propertyPath: m_AnchorMin.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 3614325118981636814, guid: 2ff073ec9c74c8942bd90a541dc41bfc, type: 3}
propertyPath: m_SizeDelta.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 3614325118981636814, guid: 2ff073ec9c74c8942bd90a541dc41bfc, type: 3}
propertyPath: m_AnchoredPosition.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 3614325118981636814, guid: 2ff073ec9c74c8942bd90a541dc41bfc, type: 3}
propertyPath: m_AnchoredPosition.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 3798908712565593569, guid: 2ff073ec9c74c8942bd90a541dc41bfc, type: 3}
propertyPath: m_AnchorMax.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 3798908712565593569, guid: 2ff073ec9c74c8942bd90a541dc41bfc, type: 3}
propertyPath: m_AnchorMin.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 3798908712565593569, guid: 2ff073ec9c74c8942bd90a541dc41bfc, type: 3}
propertyPath: m_SizeDelta.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 3798908712565593569, guid: 2ff073ec9c74c8942bd90a541dc41bfc, type: 3}
propertyPath: m_AnchoredPosition.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 3798908712565593569, guid: 2ff073ec9c74c8942bd90a541dc41bfc, type: 3}
propertyPath: m_AnchoredPosition.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 4468652570817037758, guid: 2ff073ec9c74c8942bd90a541dc41bfc, type: 3}
propertyPath: m_fontSize
value: 19.6
objectReference: {fileID: 0}
- target: {fileID: 4558362294547660329, guid: 2ff073ec9c74c8942bd90a541dc41bfc, type: 3}
propertyPath: m_AnchorMax.y
value: 0

propertyPath: m_AnchoredPosition.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 4943886293979569776, guid: 2ff073ec9c74c8942bd90a541dc41bfc, type: 3}
propertyPath: m_fontSize
value: 22.05
objectReference: {fileID: 0}
- target: {fileID: 5926215170268773762, guid: 2ff073ec9c74c8942bd90a541dc41bfc, type: 3}
propertyPath: m_fontSize
value: 26.4
objectReference: {fileID: 0}
- target: {fileID: 6004833744538984969, guid: 2ff073ec9c74c8942bd90a541dc41bfc, type: 3}
propertyPath: m_AnchorMax.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 6004833744538984969, guid: 2ff073ec9c74c8942bd90a541dc41bfc, type: 3}
propertyPath: m_AnchorMin.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 6004833744538984969, guid: 2ff073ec9c74c8942bd90a541dc41bfc, type: 3}
propertyPath: m_SizeDelta.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 6004833744538984969, guid: 2ff073ec9c74c8942bd90a541dc41bfc, type: 3}
propertyPath: m_AnchoredPosition.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 6004833744538984969, guid: 2ff073ec9c74c8942bd90a541dc41bfc, type: 3}
propertyPath: m_AnchoredPosition.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 6251885240963025851, guid: 2ff073ec9c74c8942bd90a541dc41bfc, type: 3}
propertyPath: m_AnchorMax.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 6251885240963025851, guid: 2ff073ec9c74c8942bd90a541dc41bfc, type: 3}
propertyPath: m_AnchorMin.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 6251885240963025851, guid: 2ff073ec9c74c8942bd90a541dc41bfc, type: 3}
propertyPath: m_SizeDelta.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 6251885240963025851, guid: 2ff073ec9c74c8942bd90a541dc41bfc, type: 3}
propertyPath: m_SizeDelta.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 6251885240963025851, guid: 2ff073ec9c74c8942bd90a541dc41bfc, type: 3}
propertyPath: m_AnchoredPosition.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 6251885240963025851, guid: 2ff073ec9c74c8942bd90a541dc41bfc, type: 3}
propertyPath: m_AnchoredPosition.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 6619948683217536837, guid: 2ff073ec9c74c8942bd90a541dc41bfc, type: 3}
propertyPath: m_fontSize
value: 26.4
objectReference: {fileID: 0}
- target: {fileID: 6664205945102926799, guid: 2ff073ec9c74c8942bd90a541dc41bfc, type: 3}
propertyPath: m_AnchorMax.y
value: 0

propertyPath: m_AnchoredPosition.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 7086662490557804040, guid: 2ff073ec9c74c8942bd90a541dc41bfc, type: 3}
propertyPath: m_fontSize
value: 22.75
objectReference: {fileID: 0}
- target: {fileID: 7558366957801075194, guid: 2ff073ec9c74c8942bd90a541dc41bfc, type: 3}
- target: {fileID: 8979361099148208042, guid: 2ff073ec9c74c8942bd90a541dc41bfc, type: 3}
- target: {fileID: 7558366957801075194, guid: 2ff073ec9c74c8942bd90a541dc41bfc, type: 3}
- target: {fileID: 8979361099148208042, guid: 2ff073ec9c74c8942bd90a541dc41bfc, type: 3}
- target: {fileID: 7558366957801075194, guid: 2ff073ec9c74c8942bd90a541dc41bfc, type: 3}
- target: {fileID: 8979361099148208042, guid: 2ff073ec9c74c8942bd90a541dc41bfc, type: 3}
- target: {fileID: 7558366957801075194, guid: 2ff073ec9c74c8942bd90a541dc41bfc, type: 3}
- target: {fileID: 8979361099148208042, guid: 2ff073ec9c74c8942bd90a541dc41bfc, type: 3}
- target: {fileID: 7558366957801075194, guid: 2ff073ec9c74c8942bd90a541dc41bfc, type: 3}
- target: {fileID: 8979361099148208042, guid: 2ff073ec9c74c8942bd90a541dc41bfc, type: 3}
- target: {fileID: 7558366957801075194, guid: 2ff073ec9c74c8942bd90a541dc41bfc, type: 3}
- target: {fileID: 8979361099148208042, guid: 2ff073ec9c74c8942bd90a541dc41bfc, type: 3}
objectReference: {fileID: 0}
- target: {fileID: 8728729501810850770, guid: 2ff073ec9c74c8942bd90a541dc41bfc, type: 3}
propertyPath: m_fontSize
value: 22.05
objectReference: {fileID: 0}
m_RemovedComponents: []
m_SourcePrefab: {fileID: 100100000, guid: 2ff073ec9c74c8942bd90a541dc41bfc, type: 3}

propertyPath: m_AnchoredPosition.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 4414001663685772086, guid: e269788e17cbca145bf78e8971aeb223, type: 3}
propertyPath: m_Color.a
value: 1
objectReference: {fileID: 0}
- target: {fileID: 4414001663685772086, guid: e269788e17cbca145bf78e8971aeb223, type: 3}
propertyPath: m_Color.b
value: 1
objectReference: {fileID: 0}
- target: {fileID: 4414001663685772086, guid: e269788e17cbca145bf78e8971aeb223, type: 3}
propertyPath: m_Color.g
value: 1
objectReference: {fileID: 0}
- target: {fileID: 4414001663685772086, guid: e269788e17cbca145bf78e8971aeb223, type: 3}
propertyPath: m_Color.r
value: 1
objectReference: {fileID: 0}
- target: {fileID: 4463750083940306576, guid: e269788e17cbca145bf78e8971aeb223, type: 3}
propertyPath: m_Alpha
value: 1

objectReference: {fileID: 0}
- target: {fileID: 4463750083940306589, guid: e269788e17cbca145bf78e8971aeb223, type: 3}
propertyPath: m_Name
value: PlayerList
value: UserList
objectReference: {fileID: 0}
- target: {fileID: 4463750083940306590, guid: e269788e17cbca145bf78e8971aeb223, type: 3}
propertyPath: m_Pivot.x

331
Assets/Prefabs/UI/MainMenuCanvas.prefab


m_faceColor:
serializedVersion: 2
rgba: 4294967295
m_fontSize: 18
m_fontSize: 72
m_fontSizeBase: 36
m_fontWeight: 400
m_enableAutoSizing: 1

- {fileID: 1547097155015051324}
- {fileID: 1547097153480224111}
- {fileID: 1547097154637997989}
- {fileID: 3838875500213396203}
m_Father: {fileID: 0}
m_RootOrder: 0
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}

m_Script: {fileID: 11500000, guid: 166d8ab6b922da04f851733dcb0e37e1, type: 3}
m_Name:
m_EditorClassIdentifier:
m_onVisibilityChange:
m_PersistentCalls:
m_Calls: []
showing: 0
ShowThisWhen: 1
--- !u!114 &575636749548035060

m_StringArgument:
m_BoolArgument: 0
m_CallState: 2
observeOnStart: 1
--- !u!1 &1547097154637997988
GameObject:
m_ObjectHideFlags: 0

- component: {fileID: 1547097154637997991}
- component: {fileID: 1547097154637997990}
- component: {fileID: 465350811}
- component: {fileID: 5711833839885862093}
m_Layer: 5
m_Name: StartLobbyButton
m_TagString: Untagged

m_AnchorMin: {x: 0.5, y: 0}
m_AnchorMax: {x: 0.5, y: 0}
m_AnchoredPosition: {x: 0, y: 100}
m_SizeDelta: {x: 200, y: 50}
m_SizeDelta: {x: 150, y: 50}
m_Pivot: {x: 0.5, y: 0}
--- !u!222 &1547097154637997992
CanvasRenderer:

m_OnClick:
m_PersistentCalls:
m_Calls:
- m_Target: {fileID: 0}
m_TargetAssemblyTypeName: LobbyRooms.UI.UIPanelBase, LobbyRooms
m_MethodName: Toggle
- m_Target: {fileID: 5711833839885862093}
m_TargetAssemblyTypeName: LobbyRooms.StartLobbyButton, Assembly-CSharp
m_MethodName: ToJoinMenu
m_Mode: 1
m_Arguments:
m_ObjectArgument: {fileID: 0}

m_FlexibleWidth: -1
m_FlexibleHeight: -1
m_LayoutPriority: 1
--- !u!114 &5711833839885862093
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1547097154637997988}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 507533c9939ee6f4abe2b70c9c1eae43, type: 3}
m_Name:
m_EditorClassIdentifier:
--- !u!1 &1547097155015051323
GameObject:
m_ObjectHideFlags: 0

m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1547097155015051323}
m_CullTransparentMesh: 1
--- !u!1 &7289533092095977270
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 3838875500213396203}
- component: {fileID: 3951612770663882587}
- component: {fileID: 6626590660097895607}
- component: {fileID: 2183907465135059793}
- component: {fileID: 2424262467961163401}
- component: {fileID: 7509439815957580072}
m_Layer: 5
m_Name: ExitButton
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &3838875500213396203
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 7289533092095977270}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children:
- {fileID: 3557122422878236895}
m_Father: {fileID: 1547097154335127670}
m_RootOrder: 3
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0.5, y: 0}
m_AnchorMax: {x: 0.5, y: 0}
m_AnchoredPosition: {x: 0, y: 40}
m_SizeDelta: {x: 150, y: 50}
m_Pivot: {x: 0.5, y: 0}
--- !u!222 &3951612770663882587
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 7289533092095977270}
m_CullTransparentMesh: 1
--- !u!114 &6626590660097895607
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 7289533092095977270}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 0}
m_Color: {r: 0.6792453, g: 0.6792453, b: 0.6792453, a: 1}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_Sprite: {fileID: 0}
m_Type: 1
m_PreserveAspect: 0
m_FillCenter: 1
m_FillMethod: 4
m_FillAmount: 1
m_FillClockwise: 1
m_FillOrigin: 0
m_UseSpriteMesh: 0
m_PixelsPerUnitMultiplier: 1
--- !u!114 &2183907465135059793
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 7289533092095977270}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Navigation:
m_Mode: 3
m_WrapAround: 0
m_SelectOnUp: {fileID: 0}
m_SelectOnDown: {fileID: 0}
m_SelectOnLeft: {fileID: 0}
m_SelectOnRight: {fileID: 0}
m_Transition: 1
m_Colors:
m_NormalColor: {r: 1, g: 1, b: 1, a: 1}
m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}
m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608}
m_ColorMultiplier: 1
m_FadeDuration: 0.1
m_SpriteState:
m_HighlightedSprite: {fileID: 0}
m_PressedSprite: {fileID: 0}
m_SelectedSprite: {fileID: 0}
m_DisabledSprite: {fileID: 0}
m_AnimationTriggers:
m_NormalTrigger: Normal
m_HighlightedTrigger: Highlighted
m_PressedTrigger: Pressed
m_SelectedTrigger: Selected
m_DisabledTrigger: Disabled
m_Interactable: 1
m_TargetGraphic: {fileID: 6626590660097895607}
m_OnClick:
m_PersistentCalls:
m_Calls:
- m_Target: {fileID: 7509439815957580072}
m_TargetAssemblyTypeName: LobbyRooms.UI.ExitButtonUI, Assembly-CSharp
m_MethodName: OnExitButton
m_Mode: 1
m_Arguments:
m_ObjectArgument: {fileID: 0}
m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine
m_IntArgument: 0
m_FloatArgument: 0
m_StringArgument:
m_BoolArgument: 0
m_CallState: 2
--- !u!114 &2424262467961163401
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 7289533092095977270}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3}
m_Name:
m_EditorClassIdentifier:
m_IgnoreLayout: 0
m_MinWidth: 200
m_MinHeight: 50
m_PreferredWidth: -1
m_PreferredHeight: -1
m_FlexibleWidth: -1
m_FlexibleHeight: -1
m_LayoutPriority: 1
--- !u!114 &7509439815957580072
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 7289533092095977270}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 7a8d936c1e569c84ab12655041cb57ba, type: 3}
m_Name:
m_EditorClassIdentifier:
--- !u!1 &9196281146942283462
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 3557122422878236895}
- component: {fileID: 5125783512792526142}
- component: {fileID: 6482307309586441934}
m_Layer: 5
m_Name: ExitButtonText
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &3557122422878236895
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 9196281146942283462}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 3838875500213396203}
m_RootOrder: 0
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 1, y: 1}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 0, y: 0}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &5125783512792526142
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 9196281146942283462}
m_CullTransparentMesh: 1
--- !u!114 &6482307309586441934
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 9196281146942283462}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 0}
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_text: Exit
m_isRightToLeft: 0
m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
m_fontSharedMaterials: []
m_fontMaterial: {fileID: 0}
m_fontMaterials: []
m_fontColor32:
serializedVersion: 2
rgba: 4281479730
m_fontColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1}
m_enableVertexGradient: 0
m_colorMode: 3
m_fontColorGradient:
topLeft: {r: 1, g: 1, b: 1, a: 1}
topRight: {r: 1, g: 1, b: 1, a: 1}
bottomLeft: {r: 1, g: 1, b: 1, a: 1}
bottomRight: {r: 1, g: 1, b: 1, a: 1}
m_fontColorGradientPreset: {fileID: 0}
m_spriteAsset: {fileID: 0}
m_tintAllSprites: 0
m_StyleSheet: {fileID: 0}
m_TextStyleHashCode: -1183493901
m_overrideHtmlColors: 0
m_faceColor:
serializedVersion: 2
rgba: 4294967295
m_fontSize: 44.75
m_fontSizeBase: 24
m_fontWeight: 400
m_enableAutoSizing: 1
m_fontSizeMin: 18
m_fontSizeMax: 72
m_fontStyle: 0
m_HorizontalAlignment: 2
m_VerticalAlignment: 512
m_textAlignment: 65535
m_characterSpacing: 0
m_wordSpacing: 0
m_lineSpacing: 0
m_lineSpacingMax: 0
m_paragraphSpacing: 0
m_charWidthMaxAdj: 0
m_enableWordWrapping: 1
m_wordWrappingRatios: 0.4
m_overflowMode: 0
m_linkedTextComponent: {fileID: 0}
parentLinkedComponent: {fileID: 0}
m_enableKerning: 1
m_enableExtraPadding: 0
checkPaddingRequired: 0
m_isRichText: 1
m_parseCtrlCharacters: 1
m_isOrthographic: 1
m_isCullingEnabled: 0
m_horizontalMapping: 0
m_verticalMapping: 0
m_uvLineOffset: 0
m_geometrySortingOrder: 0
m_IsTextObjectScaleStatic: 0
m_VertexBufferAutoSizeReduction: 0
m_useMaxVisibleDescender: 1
m_pageToDisplay: 1
m_margin: {x: 0, y: 0, z: 0, w: 0}
m_isUsingLegacyAnimationComponent: 0
m_isVolumetricText: 0
m_hasFontAssetChanged: 0
m_baseMaterial: {fileID: 0}
m_maskOffset: {x: 0, y: 0, z: 0, w: 0}

839
Assets/Prefabs/UI/PlayerInteractionPanel.prefab
文件差异内容过多而无法显示
查看文件

47
Assets/Prefabs/UI/RelayCodeCanvas.prefab


- component: {fileID: 4102997489641105917}
- component: {fileID: 4102997489641105913}
- component: {fileID: 7676491730539518990}
- component: {fileID: 7948229591525432809}
- component: {fileID: 8640852021294056703}
m_Layer: 5
m_Name: RelayCodeCanvas
m_TagString: Untagged

m_Interactable: 0
m_BlocksRaycasts: 0
m_IgnoreParentGroups: 0
--- !u!114 &7948229591525432809
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4102997489641105918}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 166d8ab6b922da04f851733dcb0e37e1, type: 3}
m_Name:
m_EditorClassIdentifier:
showing: 0
ShowThisWhen: 6
--- !u!114 &2381432589029884226
MonoBehaviour:
m_ObjectHideFlags: 0

m_Script: {fileID: 11500000, guid: 9a70bc1b6f999ee43974bbbf991a0b6a, type: 3}
m_Name:
m_EditorClassIdentifier:
m_onVisibilityChange:
m_PersistentCalls:
m_Calls: []
showing: 1
relayCodeText: {fileID: 8798075752901962210}
--- !u!114 &4523467532116611583

m_StringArgument:
m_BoolArgument: 0
m_CallState: 2
--- !u!114 &8640852021294056703
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4102997489641105918}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 51373dc3c6ac79b4f8e36ac7c4419205, type: 3}
m_Name:
m_EditorClassIdentifier:
OnObservedUpdated:
m_PersistentCalls:
m_Calls:
- m_Target: {fileID: 7948229591525432809}
m_TargetAssemblyTypeName: LobbyRooms.GameStatePanelUI, Assembly-CSharp
m_MethodName: ObservedUpdated
m_Mode: 0
m_Arguments:
m_ObjectArgument: {fileID: 0}
m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine
m_IntArgument: 0
m_FloatArgument: 0
m_StringArgument:
m_BoolArgument: 0
m_CallState: 2
observeOnStart: 1
--- !u!1 &4142193733183565639
GameObject:
m_ObjectHideFlags: 0

7
Assets/Prefabs/UI/UserCardPanel.prefab


- component: {fileID: 788426075660952210}
- component: {fileID: 7885056472121154813}
m_Layer: 5
m_Name: PlayerCardPanel
m_Name: UserCardPanel
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0

m_Script: {fileID: 11500000, guid: 9557a5d232068a149987bc0753800f26, type: 3}
m_Name:
m_EditorClassIdentifier:
m_onVisibilityChange:
m_PersistentCalls:
m_Calls: []
assigned: 0
--- !u!114 &788426075660952210
MonoBehaviour:
m_ObjectHideFlags: 0

m_StringArgument:
m_BoolArgument: 0
m_CallState: 2
observeOnStart: 0
--- !u!114 &7885056472121154813
MonoBehaviour:
m_ObjectHideFlags: 0

435
Assets/Scenes/mainMenu.unity


debug:
m_Flags: 0
m_NavMeshData: {fileID: 0}
--- !u!114 &113557733 stripped
MonoBehaviour:
m_CorrespondingSourceObject: {fileID: 517582375000166859, guid: f1d618bdc6f1813449d428126e640aa5, type: 3}
m_PrefabInstance: {fileID: 2637199315837045693}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: edfa4d53eaae84c43ba581088940700c, type: 3}
m_Name:
m_EditorClassIdentifier:
--- !u!1 &203192673
GameObject:
m_ObjectHideFlags: 0

m_Script: {fileID: 11500000, guid: 70dfc2fde0a9ef04eaff29a138f0bf45, type: 3}
m_Name:
m_EditorClassIdentifier:
--- !u!114 &371605424 stripped
MonoBehaviour:
m_CorrespondingSourceObject: {fileID: 8727371508936804372, guid: f1d618bdc6f1813449d428126e640aa5, type: 3}
m_PrefabInstance: {fileID: 2637199315837045693}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 160dfc78f3641c94fbebe419be087996, type: 3}
m_Name:
m_EditorClassIdentifier:
--- !u!1 &457234252
GameObject:
m_ObjectHideFlags: 0

m_CorrespondingSourceObject: {fileID: 2637199315671523625, guid: f1d618bdc6f1813449d428126e640aa5, type: 3}
m_PrefabInstance: {fileID: 2637199315837045693}
m_PrefabAsset: {fileID: 0}
--- !u!114 &648562208 stripped
MonoBehaviour:
m_CorrespondingSourceObject: {fileID: 6939937855246394599, guid: f1d618bdc6f1813449d428126e640aa5, type: 3}
m_PrefabInstance: {fileID: 2637199315837045693}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 70dfc2fde0a9ef04eaff29a138f0bf45, type: 3}
m_Name:
m_EditorClassIdentifier:
--- !u!114 &883450645 stripped
MonoBehaviour:
m_CorrespondingSourceObject: {fileID: 6961224259983233844, guid: f1d618bdc6f1813449d428126e640aa5, type: 3}
m_PrefabInstance: {fileID: 2637199315837045693}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 51373dc3c6ac79b4f8e36ac7c4419205, type: 3}
m_Name:
m_EditorClassIdentifier:
--- !u!114 &1217229506 stripped
MonoBehaviour:
m_CorrespondingSourceObject: {fileID: 354886978664675623, guid: f1d618bdc6f1813449d428126e640aa5, type: 3}

m_Script: {fileID: 11500000, guid: a03b37d5b8df06948b36dfbc430a1ea5, type: 3}
m_Name:
m_EditorClassIdentifier:
--- !u!114 &1370547229 stripped
--- !u!114 &1412109061 stripped
m_CorrespondingSourceObject: {fileID: 4979757397669888529, guid: f1d618bdc6f1813449d428126e640aa5, type: 3}
m_CorrespondingSourceObject: {fileID: 8684674544016225909, guid: f1d618bdc6f1813449d428126e640aa5, type: 3}
m_Script: {fileID: 11500000, guid: a03b37d5b8df06948b36dfbc430a1ea5, type: 3}
m_Script: {fileID: 11500000, guid: 70dfc2fde0a9ef04eaff29a138f0bf45, type: 3}
m_Name:
m_EditorClassIdentifier:
--- !u!1 &1790515943

m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1839563667}
m_CullTransparentMesh: 1
--- !u!114 &1886099429 stripped
MonoBehaviour:
m_CorrespondingSourceObject: {fileID: 3845984648666374778, guid: f1d618bdc6f1813449d428126e640aa5, type: 3}
m_PrefabInstance: {fileID: 2637199315837045693}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 70dfc2fde0a9ef04eaff29a138f0bf45, type: 3}
m_Name:
m_EditorClassIdentifier:
--- !u!114 &1969944515 stripped
MonoBehaviour:
m_CorrespondingSourceObject: {fileID: 8619884486222418397, guid: f1d618bdc6f1813449d428126e640aa5, type: 3}

objectReference: {fileID: 0}
- target: {fileID: 115037783493914682, guid: f1d618bdc6f1813449d428126e640aa5, type: 3}
propertyPath: m_fontSize
value: 35.8
value: 26.6
objectReference: {fileID: 0}
- target: {fileID: 269281908346235976, guid: f1d618bdc6f1813449d428126e640aa5, type: 3}
propertyPath: m_AnchorMax.y

objectReference: {fileID: 0}
- target: {fileID: 505980609262872673, guid: f1d618bdc6f1813449d428126e640aa5, type: 3}
propertyPath: m_fontSize
value: 35.8
value: 26.6
objectReference: {fileID: 0}
- target: {fileID: 594314551941645310, guid: f1d618bdc6f1813449d428126e640aa5, type: 3}
propertyPath: m_AnchorMax.y

propertyPath: m_SizeDelta.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 741689626084393640, guid: f1d618bdc6f1813449d428126e640aa5, type: 3}
propertyPath: m_AnchorMax.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 741689626084393640, guid: f1d618bdc6f1813449d428126e640aa5, type: 3}
propertyPath: m_AnchorMin.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 741689626084393640, guid: f1d618bdc6f1813449d428126e640aa5, type: 3}
propertyPath: m_SizeDelta.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 741689626084393640, guid: f1d618bdc6f1813449d428126e640aa5, type: 3}
propertyPath: m_AnchoredPosition.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 741689626084393640, guid: f1d618bdc6f1813449d428126e640aa5, type: 3}
propertyPath: m_AnchoredPosition.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 774903988744295172, guid: f1d618bdc6f1813449d428126e640aa5, type: 3}
propertyPath: m_AnchoredPosition.y
value: 15
objectReference: {fileID: 0}
- target: {fileID: 901738327287436208, guid: f1d618bdc6f1813449d428126e640aa5, type: 3}
propertyPath: m_AnchorMax.y
value: 0

propertyPath: m_AnchoredPosition.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 1193216679110899971, guid: f1d618bdc6f1813449d428126e640aa5, type: 3}
propertyPath: m_Alpha
value: 0
objectReference: {fileID: 0}
- target: {fileID: 1193216679110899971, guid: f1d618bdc6f1813449d428126e640aa5, type: 3}
propertyPath: m_Interactable
value: 0
objectReference: {fileID: 0}
- target: {fileID: 1193216679110899971, guid: f1d618bdc6f1813449d428126e640aa5, type: 3}
propertyPath: m_BlocksRaycasts
value: 0
objectReference: {fileID: 0}
- target: {fileID: 1454912980518621394, guid: f1d618bdc6f1813449d428126e640aa5, type: 3}
propertyPath: m_AnchorMax.y
value: 0

- target: {fileID: 1533286284285053728, guid: f1d618bdc6f1813449d428126e640aa5, type: 3}
propertyPath: m_AnchoredPosition.y
value: -0.5
objectReference: {fileID: 0}
- target: {fileID: 1582058628584328142, guid: f1d618bdc6f1813449d428126e640aa5, type: 3}
propertyPath: m_fontSize
value: 12.85
objectReference: {fileID: 0}
- target: {fileID: 1587533333931548819, guid: f1d618bdc6f1813449d428126e640aa5, type: 3}
propertyPath: m_fontSize

propertyPath: m_AnchoredPosition.y
value: -0.40582275
objectReference: {fileID: 0}
- target: {fileID: 1745599919191268329, guid: f1d618bdc6f1813449d428126e640aa5, type: 3}
propertyPath: m_AnchorMax.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 1745599919191268329, guid: f1d618bdc6f1813449d428126e640aa5, type: 3}
propertyPath: m_AnchorMin.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 1745599919191268329, guid: f1d618bdc6f1813449d428126e640aa5, type: 3}
propertyPath: m_SizeDelta.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 1745599919191268329, guid: f1d618bdc6f1813449d428126e640aa5, type: 3}
propertyPath: m_SizeDelta.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 1745599919191268329, guid: f1d618bdc6f1813449d428126e640aa5, type: 3}
propertyPath: m_AnchoredPosition.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 1745599919191268329, guid: f1d618bdc6f1813449d428126e640aa5, type: 3}
propertyPath: m_AnchoredPosition.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 1804602476780209070, guid: f1d618bdc6f1813449d428126e640aa5, type: 3}
propertyPath: m_AnchorMax.y
value: 0

objectReference: {fileID: 0}
- target: {fileID: 1883476038899951587, guid: f1d618bdc6f1813449d428126e640aa5, type: 3}
propertyPath: m_AnchorMin.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 1883476038899951587, guid: f1d618bdc6f1813449d428126e640aa5, type: 3}
propertyPath: m_SizeDelta.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 1883476038899951587, guid: f1d618bdc6f1813449d428126e640aa5, type: 3}

- target: {fileID: 1943661725318325889, guid: f1d618bdc6f1813449d428126e640aa5, type: 3}
propertyPath: m_AnchoredPosition.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 1955367429234041653, guid: f1d618bdc6f1813449d428126e640aa5, type: 3}
propertyPath: OnObservedUpdated.m_PersistentCalls.m_Calls.Array.data[0].m_Target
value:
objectReference: {fileID: 0}
- target: {fileID: 2068196391760474316, guid: f1d618bdc6f1813449d428126e640aa5, type: 3}
propertyPath: m_AnchorMax.y

value: 0
objectReference: {fileID: 0}
- target: {fileID: 2068196391760474316, guid: f1d618bdc6f1813449d428126e640aa5, type: 3}
propertyPath: m_SizeDelta.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 2068196391760474316, guid: f1d618bdc6f1813449d428126e640aa5, type: 3}
propertyPath: m_SizeDelta.y
value: 0
objectReference: {fileID: 0}

- target: {fileID: 2398557476308905413, guid: f1d618bdc6f1813449d428126e640aa5, type: 3}
propertyPath: m_SizeDelta.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 2409936501861894792, guid: f1d618bdc6f1813449d428126e640aa5, type: 3}
propertyPath: m_fontSize
value: 21
objectReference: {fileID: 0}
- target: {fileID: 2545639037669962845, guid: f1d618bdc6f1813449d428126e640aa5, type: 3}
propertyPath: m_AnchorMax.y

propertyPath: m_Pivot.y
value: 0.5
objectReference: {fileID: 0}
- target: {fileID: 2637199315733066108, guid: f1d618bdc6f1813449d428126e640aa5, type: 3}
propertyPath: m_SizeDelta.y
value: -50.000027
objectReference: {fileID: 0}
- target: {fileID: 2637199315733066108, guid: f1d618bdc6f1813449d428126e640aa5, type: 3}
propertyPath: m_AnchoredPosition.y
value: -24.999987
objectReference: {fileID: 0}
- target: {fileID: 2637199315820453693, guid: f1d618bdc6f1813449d428126e640aa5, type: 3}
propertyPath: m_AnchorMax.y
value: 0

propertyPath: m_AnchoredPosition.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 2637199315984481069, guid: f1d618bdc6f1813449d428126e640aa5, type: 3}
propertyPath: m_text
value: Game Lobby Sample
objectReference: {fileID: 0}
- target: {fileID: 2637199315984481069, guid: f1d618bdc6f1813449d428126e640aa5, type: 3}
propertyPath: m_fontSize
value: 72
objectReference: {fileID: 0}
propertyPath: m_SizeDelta.y
value: -50
propertyPath: m_SizeDelta.x
value: -30
objectReference: {fileID: 0}
- target: {fileID: 2637199316291327119, guid: f1d618bdc6f1813449d428126e640aa5, type: 3}
propertyPath: m_AnchoredPosition.x
value: 0
value: -25
value: -12.5
objectReference: {fileID: 0}
- target: {fileID: 2637199316850714327, guid: f1d618bdc6f1813449d428126e640aa5, type: 3}
propertyPath: m_PresetInfoIsWorld

propertyPath: m_AnchoredPosition.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 2995192838028648417, guid: f1d618bdc6f1813449d428126e640aa5, type: 3}
propertyPath: m_AnchorMax.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 2995192838028648417, guid: f1d618bdc6f1813449d428126e640aa5, type: 3}
propertyPath: m_AnchorMin.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 2995192838028648417, guid: f1d618bdc6f1813449d428126e640aa5, type: 3}
propertyPath: m_SizeDelta.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 2995192838028648417, guid: f1d618bdc6f1813449d428126e640aa5, type: 3}
propertyPath: m_SizeDelta.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 2995192838028648417, guid: f1d618bdc6f1813449d428126e640aa5, type: 3}
propertyPath: m_AnchoredPosition.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 2995192838028648417, guid: f1d618bdc6f1813449d428126e640aa5, type: 3}
propertyPath: m_AnchoredPosition.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 3018535483078550762, guid: f1d618bdc6f1813449d428126e640aa5, type: 3}
propertyPath: m_AnchorMax.y
value: 0

propertyPath: m_AnchoredPosition.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 3928466360835691867, guid: f1d618bdc6f1813449d428126e640aa5, type: 3}
propertyPath: m_Color.b
value: 0.7254902
objectReference: {fileID: 0}
- target: {fileID: 3928466360835691867, guid: f1d618bdc6f1813449d428126e640aa5, type: 3}
propertyPath: m_Color.g
value: 0.7254902
objectReference: {fileID: 0}
- target: {fileID: 3928466360835691867, guid: f1d618bdc6f1813449d428126e640aa5, type: 3}
propertyPath: m_Color.r
value: 0.7254902
objectReference: {fileID: 0}
- target: {fileID: 4052760935431886671, guid: f1d618bdc6f1813449d428126e640aa5, type: 3}
propertyPath: m_AnchorMax.x
value: 0

value: 0
objectReference: {fileID: 0}
- target: {fileID: 4822032080772604407, guid: f1d618bdc6f1813449d428126e640aa5, type: 3}
propertyPath: m_SizeDelta.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 4822032080772604407, guid: f1d618bdc6f1813449d428126e640aa5, type: 3}
value: 0.000032186508
value: -0.00005787611
value: -0.00076148746
value: 0.0000018929122
objectReference: {fileID: 0}
- target: {fileID: 4824240073023402834, guid: f1d618bdc6f1813449d428126e640aa5, type: 3}
propertyPath: m_AnchorMax.y

propertyPath: m_AnchoredPosition.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 4901918443813663430, guid: f1d618bdc6f1813449d428126e640aa5, type: 3}
propertyPath: m_IsActive
value: 1
objectReference: {fileID: 0}
- target: {fileID: 4997670782991565005, guid: f1d618bdc6f1813449d428126e640aa5, type: 3}
propertyPath: m_AnchorMax.y
value: 0

propertyPath: m_AnchoredPosition.y
value: -0.5
objectReference: {fileID: 0}
- target: {fileID: 5568947153002203677, guid: f1d618bdc6f1813449d428126e640aa5, type: 3}
propertyPath: m_Alpha
value: 0
objectReference: {fileID: 0}
- target: {fileID: 5568947153002203677, guid: f1d618bdc6f1813449d428126e640aa5, type: 3}
propertyPath: m_Interactable
value: 0
objectReference: {fileID: 0}
- target: {fileID: 5568947153002203677, guid: f1d618bdc6f1813449d428126e640aa5, type: 3}
propertyPath: m_BlocksRaycasts
value: 0
objectReference: {fileID: 0}
- target: {fileID: 5674629351396617348, guid: f1d618bdc6f1813449d428126e640aa5, type: 3}
propertyPath: m_Alpha
value: 0

propertyPath: m_fontSize
value: 22.05
objectReference: {fileID: 0}
- target: {fileID: 5880123119007547921, guid: f1d618bdc6f1813449d428126e640aa5, type: 3}
propertyPath: m_AnchoredPosition.x
value: -9.757019
objectReference: {fileID: 0}
- target: {fileID: 5991488785009139195, guid: f1d618bdc6f1813449d428126e640aa5, type: 3}
propertyPath: m_Size
value: 1

propertyPath: m_AnchoredPosition.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 6095274280378679943, guid: f1d618bdc6f1813449d428126e640aa5, type: 3}
propertyPath: m_AnchorMax.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 6095274280378679943, guid: f1d618bdc6f1813449d428126e640aa5, type: 3}
propertyPath: m_AnchorMin.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 6095274280378679943, guid: f1d618bdc6f1813449d428126e640aa5, type: 3}
propertyPath: m_SizeDelta.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 6095274280378679943, guid: f1d618bdc6f1813449d428126e640aa5, type: 3}
propertyPath: m_SizeDelta.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 6095274280378679943, guid: f1d618bdc6f1813449d428126e640aa5, type: 3}
propertyPath: m_AnchoredPosition.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 6095274280378679943, guid: f1d618bdc6f1813449d428126e640aa5, type: 3}
propertyPath: m_AnchoredPosition.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 6162619661446561387, guid: f1d618bdc6f1813449d428126e640aa5, type: 3}
propertyPath: m_AnchorMax.y
value: 0

propertyPath: m_AnchoredPosition.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 6221486310396140244, guid: f1d618bdc6f1813449d428126e640aa5, type: 3}
propertyPath: m_Alpha
value: 1
objectReference: {fileID: 0}
- target: {fileID: 6366899791732448022, guid: f1d618bdc6f1813449d428126e640aa5, type: 3}
propertyPath: m_AnchorMax.y
value: 0

propertyPath: m_AnchoredPosition.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 6656827769630762920, guid: f1d618bdc6f1813449d428126e640aa5, type: 3}
propertyPath: m_Alpha
value: 0
objectReference: {fileID: 0}
- target: {fileID: 6664893525864283123, guid: f1d618bdc6f1813449d428126e640aa5, type: 3}
propertyPath: m_AnchoredPosition.x
value: -19.000122
objectReference: {fileID: 0}
- target: {fileID: 6734163437853515196, guid: f1d618bdc6f1813449d428126e640aa5, type: 3}
propertyPath: m_AnchorMax.x
value: 0

propertyPath: m_AnchorMin.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 6766685212619736553, guid: f1d618bdc6f1813449d428126e640aa5, type: 3}
propertyPath: m_Color.b
value: 0.7264151
objectReference: {fileID: 0}
- target: {fileID: 6766685212619736553, guid: f1d618bdc6f1813449d428126e640aa5, type: 3}
propertyPath: m_Color.g
value: 0.7264151
objectReference: {fileID: 0}
- target: {fileID: 6766685212619736553, guid: f1d618bdc6f1813449d428126e640aa5, type: 3}
propertyPath: m_Color.r
value: 0.7264151
objectReference: {fileID: 0}
- target: {fileID: 6769260811906812456, guid: f1d618bdc6f1813449d428126e640aa5, type: 3}
propertyPath: m_AnchorMax.y
value: 0

propertyPath: m_AnchoredPosition.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 6843940383602865416, guid: f1d618bdc6f1813449d428126e640aa5, type: 3}
propertyPath: m_AnchorMax.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 6843940383602865416, guid: f1d618bdc6f1813449d428126e640aa5, type: 3}
propertyPath: m_AnchorMin.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 6843940383602865416, guid: f1d618bdc6f1813449d428126e640aa5, type: 3}
propertyPath: m_SizeDelta.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 6843940383602865416, guid: f1d618bdc6f1813449d428126e640aa5, type: 3}
propertyPath: m_SizeDelta.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 6843940383602865416, guid: f1d618bdc6f1813449d428126e640aa5, type: 3}
propertyPath: m_AnchoredPosition.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 6843940383602865416, guid: f1d618bdc6f1813449d428126e640aa5, type: 3}
propertyPath: m_AnchoredPosition.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 6910946530474729345, guid: f1d618bdc6f1813449d428126e640aa5, type: 3}
propertyPath: m_Alpha
value: 1
objectReference: {fileID: 0}
- target: {fileID: 6970381027661675607, guid: f1d618bdc6f1813449d428126e640aa5, type: 3}
propertyPath: m_AnchorMax.y
value: 0

objectReference: {fileID: 0}
- target: {fileID: 7198558056733765308, guid: f1d618bdc6f1813449d428126e640aa5, type: 3}
propertyPath: m_fontSize
value: 9.4
value: 9.95
objectReference: {fileID: 0}
- target: {fileID: 7198558057177865241, guid: f1d618bdc6f1813449d428126e640aa5, type: 3}
propertyPath: m_OnClick.m_PersistentCalls.m_Calls.Array.data[0].m_Target
value:
objectReference: {fileID: 371605424}
- target: {fileID: 7198558057177865241, guid: f1d618bdc6f1813449d428126e640aa5, type: 3}
propertyPath: m_OnClick.m_PersistentCalls.m_Calls.Array.data[0].m_MethodName
value: Show
objectReference: {fileID: 0}
- target: {fileID: 7198558057177865242, guid: f1d618bdc6f1813449d428126e640aa5, type: 3}
propertyPath: m_AnchorMax.y

objectReference: {fileID: 0}
- target: {fileID: 7824982990876343133, guid: f1d618bdc6f1813449d428126e640aa5, type: 3}
propertyPath: m_fontSize
value: 22.05
value: 18
objectReference: {fileID: 0}
- target: {fileID: 7864410018658149118, guid: f1d618bdc6f1813449d428126e640aa5, type: 3}
propertyPath: m_AnchorMax.y

propertyPath: m_AnchoredPosition.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 8131161780596565425, guid: f1d618bdc6f1813449d428126e640aa5, type: 3}
propertyPath: m_Alpha
value: 1
objectReference: {fileID: 0}
- target: {fileID: 8131161780596565425, guid: f1d618bdc6f1813449d428126e640aa5, type: 3}
propertyPath: m_Interactable
value: 0
objectReference: {fileID: 0}
- target: {fileID: 8131161780596565425, guid: f1d618bdc6f1813449d428126e640aa5, type: 3}
propertyPath: m_BlocksRaycasts
value: 0
objectReference: {fileID: 0}
- target: {fileID: 8166602275919004303, guid: f1d618bdc6f1813449d428126e640aa5, type: 3}
propertyPath: m_AnchorMax.y
value: 0

objectReference: {fileID: 0}
- target: {fileID: 8166602275919004303, guid: f1d618bdc6f1813449d428126e640aa5, type: 3}
propertyPath: m_AnchoredPosition.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 8171375587469674834, guid: f1d618bdc6f1813449d428126e640aa5, type: 3}
propertyPath: observeOnStart
value: 0
objectReference: {fileID: 0}
- target: {fileID: 8206858806911994013, guid: f1d618bdc6f1813449d428126e640aa5, type: 3}

objectReference: {fileID: 0}
- target: {fileID: 8397947723339444263, guid: f1d618bdc6f1813449d428126e640aa5, type: 3}
propertyPath: m_fontSize
value: 49.2
value: 35.8
objectReference: {fileID: 0}
- target: {fileID: 8428070622252142379, guid: f1d618bdc6f1813449d428126e640aa5, type: 3}
propertyPath: m_fontSize
value: 18
objectReference: {fileID: 0}
- target: {fileID: 8726787022963647593, guid: f1d618bdc6f1813449d428126e640aa5, type: 3}
propertyPath: showing

objectReference: {fileID: 0}
- target: {fileID: 8806225834216904879, guid: f1d618bdc6f1813449d428126e640aa5, type: 3}
propertyPath: m_fontSize
value: 26.4
value: 18
value: 0
objectReference: {fileID: 0}
- target: {fileID: 8889734615304832804, guid: f1d618bdc6f1813449d428126e640aa5, type: 3}
propertyPath: m_AnchorMin.y
value: 0
value: 1
value: 0
objectReference: {fileID: 0}
- target: {fileID: 8889734615304832804, guid: f1d618bdc6f1813449d428126e640aa5, type: 3}
propertyPath: m_AnchoredPosition.x
value: 0
value: -20
objectReference: {fileID: 0}
- target: {fileID: 8889734615304832804, guid: f1d618bdc6f1813449d428126e640aa5, type: 3}
propertyPath: m_AnchoredPosition.y

- target: {fileID: 8926445770515514182, guid: f1d618bdc6f1813449d428126e640aa5, type: 3}
propertyPath: m_AnchoredPosition.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 8976799664250177120, guid: f1d618bdc6f1813449d428126e640aa5, type: 3}
propertyPath: OnObservedUpdated.m_PersistentCalls.m_Calls.Array.data[0].m_Target
value:
objectReference: {fileID: 0}
- target: {fileID: 9135818411637517974, guid: f1d618bdc6f1813449d428126e640aa5, type: 3}
propertyPath: m_AnchorMax.y

m_Modification:
m_TransformParent: {fileID: 0}
m_Modifications:
- target: {fileID: 5193415626965589893, guid: f80fc24bab3dcda459a2669321e2e5a4, type: 3}
propertyPath: m_durationToleranceMs
value: 50
objectReference: {fileID: 0}
propertyPath: m_logMode
value: 0
objectReference: {fileID: 0}
- target: {fileID: 7716713811812636910, guid: f80fc24bab3dcda459a2669321e2e5a4, type: 3}
propertyPath: m_GameStateObservers.Array.size
value: 4
objectReference: {fileID: 0}
- target: {fileID: 7716713811812636910, guid: f80fc24bab3dcda459a2669321e2e5a4, type: 3}
value: 5
value: 8
value: 4
value: 3
objectReference: {fileID: 0}
- target: {fileID: 7716713811812636910, guid: f80fc24bab3dcda459a2669321e2e5a4, type: 3}
propertyPath: m_GameStateObservers.Array.data[0]
value:
objectReference: {fileID: 2637199315837045698}
- target: {fileID: 7716713811812636910, guid: f80fc24bab3dcda459a2669321e2e5a4, type: 3}
propertyPath: m_GameStateObservers.Array.data[1]
value:
objectReference: {fileID: 1547097153363664359}
- target: {fileID: 7716713811812636910, guid: f80fc24bab3dcda459a2669321e2e5a4, type: 3}
propertyPath: m_GameStateObservers.Array.data[2]
value:
objectReference: {fileID: 2637199315837045696}
- target: {fileID: 7716713811812636910, guid: f80fc24bab3dcda459a2669321e2e5a4, type: 3}
propertyPath: m_GameStateObservers.Array.data[3]
value:
objectReference: {fileID: 883450645}
- target: {fileID: 7716713811812636910, guid: f80fc24bab3dcda459a2669321e2e5a4, type: 3}
propertyPath: m_GameStateObservers.Array.data[4]
value:
objectReference: {fileID: 0}
- target: {fileID: 7716713811812636910, guid: f80fc24bab3dcda459a2669321e2e5a4, type: 3}
propertyPath: m_GameStateObservers.Array.data[5]
value:
objectReference: {fileID: 0}
- target: {fileID: 7716713811812636910, guid: f80fc24bab3dcda459a2669321e2e5a4, type: 3}
propertyPath: m_LobbyDataObservers.Array.data[0]

value:
objectReference: {fileID: 309485569}
- target: {fileID: 7716713811812636910, guid: f80fc24bab3dcda459a2669321e2e5a4, type: 3}
propertyPath: m_LobbyDataObservers.Array.data[5]
value:
objectReference: {fileID: 648562208}
- target: {fileID: 7716713811812636910, guid: f80fc24bab3dcda459a2669321e2e5a4, type: 3}
propertyPath: m_LobbyDataObservers.Array.data[6]
value:
objectReference: {fileID: 1412109061}
- target: {fileID: 7716713811812636910, guid: f80fc24bab3dcda459a2669321e2e5a4, type: 3}
propertyPath: m_LobbyDataObservers.Array.data[7]
value:
objectReference: {fileID: 1886099429}
- target: {fileID: 7716713811812636910, guid: f80fc24bab3dcda459a2669321e2e5a4, type: 3}
value: 1
value: 2
objectReference: {fileID: 0}
- target: {fileID: 7716713811812636910, guid: f80fc24bab3dcda459a2669321e2e5a4, type: 3}
propertyPath: m_LocalUserObservers.Array.data[0]

propertyPath: m_LocalUserObservers.Array.data[1]
value:
objectReference: {fileID: 1370547229}
objectReference: {fileID: 1217229506}
objectReference: {fileID: 1217229506}
objectReference: {fileID: 1969944515}
objectReference: {fileID: 1969944515}
objectReference: {fileID: 0}
- target: {fileID: 7716713811812636910, guid: f80fc24bab3dcda459a2669321e2e5a4, type: 3}
propertyPath: m_LobbyServerObservers.Array.data[0]
value:

value: 3
value: 6
- target: {fileID: 7716713811812636910, guid: f80fc24bab3dcda459a2669321e2e5a4, type: 3}
propertyPath: m_LobbyServiceObservers.Array.data[1]
value:
objectReference: {fileID: 113557733}
- target: {fileID: 7716713811812636910, guid: f80fc24bab3dcda459a2669321e2e5a4, type: 3}
propertyPath: m_LocalGameStateObservers.Array.data[0]
value:

- target: {fileID: 7716713811812636910, guid: f80fc24bab3dcda459a2669321e2e5a4, type: 3}
propertyPath: m_LocalGameStateObservers.Array.data[3]
value:
objectReference: {fileID: 0}
objectReference: {fileID: 883450645}
value:
objectReference: {fileID: 0}
- target: {fileID: 7716713811812636910, guid: f80fc24bab3dcda459a2669321e2e5a4, type: 3}
propertyPath: m_LocalGameStateObservers.Array.data[5]
value:
objectReference: {fileID: 0}
- target: {fileID: 7716713811812636911, guid: f80fc24bab3dcda459a2669321e2e5a4, type: 3}

12
Assets/Scripts/Auth/Identity.cs


/// One will be created for the local player, as well as for each other member of the room.
/// (TODO: If that's the case, reevaluate the usage as a Located service.)
/// </summary>
public class Identity : IIdentity
public class Identity : IIdentity, IDisposable
{
private Dictionary<IIdentityType, SubIdentity> m_subIdentities = new Dictionary<IIdentityType, SubIdentity>();

m_subIdentities.Add(IIdentityType.Auth, new SubIdentity_Authentication(callbackOnAuthLogin));
}
// Need: Query for the current ID for this player with whatever service, to then be able to get info from that service.
// e.g. What is this player's Vivox SIP so that we can join a channel?
public SubIdentity GetSubIdentity(IIdentityType identityType)
{
return m_subIdentities[identityType];

foreach (var entry in prevIdentity.m_subIdentities)
m_subIdentities.Add(entry.Key, entry.Value);
}
}
public void Dispose()
{
foreach (var sub in m_subIdentities)
if (sub.Value is IDisposable)
(sub.Value as IDisposable).Dispose();
}
}
}

17
Assets/Scripts/Auth/SubIdentity_Authentication.cs


/// </summary>
public SubIdentity_Authentication(Action onSigninComplete = null)
{
Authentication.SetLogLevel(Unity.Services.Authentication.Utilities.LogLevel.Verbose);
Authentication.SignedIn += OnSignInChange;
Authentication.SignedOut += OnSignInChange;
DoSignIn(onSigninComplete);
}
~SubIdentity_Authentication()

{
if (!m_hasDisposed)
{
Authentication.SignedIn -= OnSignInChange;
Authentication.SignedOut -= OnSignInChange;
AuthenticationService.Instance.SignedIn -= OnSignInChange;
AuthenticationService.Instance.SignedOut -= OnSignInChange;
m_hasDisposed = true;
}
}

await UnityServices.Initialize();
await Authentication.SignInAnonymously();
// Authentication.SignOut(); // TODO: I think we want to sign out at *some* point? But then the UAS anonymous token changes, so they can't access any outstanding rooms they've created.
//Authentication.SetLogLevel(Unity.Services.Authentication.Utilities.LogLevel.Verbose); TODO: Is there a new API for this?
AuthenticationService.Instance.SignedIn += OnSignInChange;
AuthenticationService.Instance.SignedOut += OnSignInChange;
if (!AuthenticationService.Instance.IsSignedIn)
await AuthenticationService.Instance.SignInAnonymouslyAsync(); // Note: We don't want to sign out later, since that changes the UAS anonymous token, which would prevent the player from exiting rooms they're already in.
SetContent("id", Authentication.PlayerId);
SetContent("id", AuthenticationService.Instance.PlayerId);
}
}
}

318
Assets/Scripts/Entities/GameStateManager.cs


using Player;
using Unity.Services.Relay.Models;
using UnityEngine;
using UnityEngine.SceneManagement; // TODO: Definitely shouldn't need this just for logging?
using Utilities;
namespace LobbyRooms

[SerializeField]
LogMode m_logMode = LogMode.Critical;
List<LocalGameStateObserver> m_LocalGameStateObservers = new List<LocalGameStateObserver>();
List<LocalGameStateObserver> m_GameStateObservers = new List<LocalGameStateObserver>();
[SerializeField]
List<LobbyDataObserver> m_LobbyDataObservers = new List<LobbyDataObserver>();
[SerializeField]

private RoomsContentHeartbeat m_roomsContentHeartbeat = new RoomsContentHeartbeat();
LocalGameState m_localGameState = new LocalGameState();
LobbyReadyCheck m_LobbyReadyCheck = null;
LocalGameState m_localGameState = new LocalGameState();
LobbyReadyCheck m_LobbyReadyCheck;
LogHandler.Get();
LogHandler.Get().mode = m_logMode;
m_LobbyReadyCheck = new LobbyReadyCheck(null, 7);
Application.wantsToQuit += OnWantToQuit;
}
private void OnAuthSignIn()

m_localUser.DisplayName = NameGenerator.GetName(m_localUser.ID);
}
public void OnReceiveMessage(MessageType type, object msg)

else if (type == MessageType.CreateRoomRequest)
{
var createRoomData = (LobbyData)msg;
RoomsQuery.Instance.CreateRoomAsync(createRoomData.LobbyName, createRoomData.MaxPlayerCount, (r) => { Rooms.ToLobbyData.Convert(r, m_lobbyData, m_localUser); OnCreatedRoom(); }, null); // TODO: Report failure?
RoomsQuery.Instance.CreateRoomAsync(createRoomData.LobbyName, createRoomData.MaxPlayerCount, createRoomData.Private, (r) =>
{
Rooms.ToLobbyData.Convert(r, m_lobbyData, m_localUser);
OnCreatedRoom();
}, OnFailedJoin); // TODO: Report failure?
RoomsQuery.Instance.JoinRoomAsync(roomData.RoomID, roomData.RoomCode, (r) => { Rooms.ToLobbyData.Convert(r, m_lobbyData, m_localUser); OnJoinedRoom(); }, null); // TODO: Report failure?
RoomsQuery.Instance.JoinRoomAsync(roomData.RoomID, roomData.RoomCode, (r) =>
{
Rooms.ToLobbyData.Convert(r, m_lobbyData, m_localUser);
OnJoinedRoom();
}, OnFailedJoin); // TODO: Report failure?
RoomsQuery.Instance.RetrieveRoomListAsync((qr) => { OnRefreshed(Rooms.ToLobbyData.Convert(qr)); });
m_lobbyServiceData.State = LobbyServiceState.Fetching;
RoomsQuery.Instance.RetrieveRoomListAsync(
qr =>
{
if (qr != null)
OnRefreshed(Rooms.ToLobbyData.Convert(qr));
}, er =>
{
long errorLong = 0;
if (er != null)
errorLong = er.Status;
OnRefreshFailed(errorLong);
});
}
else if (type == MessageType.ChangeGameState)
{

var emote = (string)msg;
m_localUser.Emote = emote;
}
else if (type == MessageType.HostInitReadyCheck) //A message that either Initiates or Cancels a ready check. Inititated either by the local user, or recieved via the Room service.
else if (type == MessageType.ChangeLobbyUserState)
var notCancelledByHost = (bool)msg;
m_LobbyReadyCheck = new LobbyReadyCheck(m_lobbyData, OnReadyComplete);
if (notCancelledByHost)
{
if (m_localUser.IsHost)
{
m_localUser.UserStatus = UserStatus.Ready;
}
else
{
m_localUser.UserStatus = UserStatus.ReadyCheck;
}
}
else
{
m_localUser.UserStatus = UserStatus.Cancelled;
m_LobbyReadyCheck.Dispose();
}
m_localUser.UserStatus = (UserStatus)msg;
else if (type == MessageType.LocalUserReadyCheckResponse)
else if (type == MessageType.Client_EndReadyCountdownAt)
var isReady = (bool)msg;
if (isReady)
m_localUser.UserStatus = UserStatus.Ready;
else
m_localUser.UserStatus = UserStatus.Cancelled;
m_lobbyData.TargetEndTime = (DateTime)msg;
BeginCountDown();
else if (type == MessageType.ChangeLobbyUserState)
else if (type == MessageType.ToLobby)
UserStatus newStatus = (UserStatus)msg;
m_localUser.UserStatus = newStatus;
ToLobby();
m_lobbyData = new LobbyData();
m_lobbyData = new LobbyData
{
State = LobbyState.Lobby
};
m_localUser.DisplayName = "New Player";
DefaultObserverSetup();
void InitObservers()
/// <summary>
/// We find and validate that the scene has all the Observers we expect
/// </summary>
void DefaultObserverSetup()
foreach (var gameStateObs in m_LocalGameStateObservers)
foreach (var gameStateObs in FindObjectsOfType<LocalGameStateObserver>())
gameStateObs.BeginObserving(m_localGameState);
if (!gameStateObs.observeOnStart)
continue;
if (!m_GameStateObservers.Contains(gameStateObs))
m_GameStateObservers.Add(gameStateObs);
foreach (var serviceObs in m_LobbyServiceObservers)
foreach (var lobbyData in FindObjectsOfType<LobbyDataObserver>())
serviceObs.BeginObserving(m_lobbyServiceData);
if (!lobbyData.observeOnStart)
continue;
if (!m_LobbyDataObservers.Contains(lobbyData))
m_LobbyDataObservers.Add(lobbyData);
foreach (var lobbyObs in m_LobbyDataObservers)
foreach (var lobbyUserObs in FindObjectsOfType<LobbyUserObserver>())
lobbyObs.BeginObserving(m_lobbyData);
if (!lobbyUserObs.observeOnStart)
continue;
if (!m_LocalUserObservers.Contains(lobbyUserObs))
m_LocalUserObservers.Add(lobbyUserObs);
foreach (var userObs in m_LocalUserObservers)
foreach (var lobbyServiceObs in FindObjectsOfType<LobbyServiceDataObserver>())
userObs.BeginObserving(m_localUser);
if (!lobbyServiceObs.observeOnStart)
continue;
if (!m_LobbyServiceObservers.Contains(lobbyServiceObs))
m_LobbyServiceObservers.Add(lobbyServiceObs);
if (m_GameStateObservers.Count < 4)
Debug.LogWarning($"Scene: {SceneManager.GetActiveScene().name} has less than the default expected Game State Observers, ensure all the observers in the scene that need to watch the gameState are registered in the LocalGameStateObservers List.");
if (m_LobbyDataObservers.Count < 8)
Debug.LogWarning($"Scene: {SceneManager.GetActiveScene().name} has less than the default expected Lobby Data Observers, ensure all the observers in the scene that need to watch the Local Lobby Data are registered in the LobbyDataObservers List.");
if (m_LocalUserObservers.Count < 3)
Debug.LogWarning($"Scene: {SceneManager.GetActiveScene().name} has less than the default expected Local User Observers, ensure all the observers in the scene that need to watch the gameState are registered in the LocalUserObservers List.");
if (m_LobbyServiceObservers.Count < 2)
Debug.LogWarning($"Scene: {SceneManager.GetActiveScene().name} has less than the default expected Lobby Service Observers, ensure all the observers in the scene that need to watch the lobby service state are registered in the LobbyServiceObservers List.");
void SetGameState(GameState state)
void InitObservers()
m_localGameState.State = state;
if (state == GameState.Menu)
foreach (var gameStateObs in m_GameStateObservers)
m_localUser.Emote = null; // TODO: Should we have a more centralized location for cleaning up on room leave? We still have UI bugs with, e.g., leaving and rejoining rooms.
RoomsQuery.Instance.LeaveRoomAsync(m_lobbyData.RoomID, () => { m_lobbyData.CopyObserved(new LobbyInfo(), new Dictionary<string, LobbyUser>()); });
if (gameStateObs == null)
{
Debug.LogError("Missing a gameStateObserver, please make sure all GameStateObservers in the scene are registered here.");
continue;
}
gameStateObs.BeginObserving(m_localGameState);
}
void OnReadyComplete(bool success)
{
if (success)
foreach (var lobbyObs in m_LobbyDataObservers)
m_localGameState.State = GameState.Joining;
RelayInterface.JoinAsync(m_lobbyData.RelayCode, OnJoined);
if (lobbyObs == null)
{
Debug.LogError("Missing a gameStateObserver, please make sure all GameStateObservers in the scene are registered here.");
continue;
}
lobbyObs.BeginObserving(m_lobbyData);
else
foreach (var userObs in m_LocalUserObservers)
m_localGameState.State = GameState.Lobby;
if (userObs == null)
{
Debug.LogError("Missing a gameStateObserver, please make sure all GameStateObservers in the scene are registered here.");
continue;
}
userObs.BeginObserving(m_localUser);
}
foreach (var serviceObs in m_LobbyServiceObservers)
{
if (serviceObs == null)
{
Debug.LogError("Missing a gameStateObserver, please make sure all GameStateObservers in the scene are registered here.");
continue;
}
serviceObs.BeginObserving(m_lobbyServiceData);
void OnJoined(JoinAllocation joinData)
void SetGameState(GameState state)
var ip = joinData.RelayServer.IpV4;
var port = joinData.RelayServer.Port;
m_lobbyData.RelayServer = new ServerAddress(ip, port);
bool isLeavingRoom = (state == GameState.Menu || state == GameState.JoinMenu) && m_localGameState.State == GameState.Lobby;
m_localGameState.State = state;
if (isLeavingRoom)
OnLeftRoom();
void OnRefreshed(IEnumerable<LobbyData> lobbies)
{
var newLobbyDict = new Dictionary<string, LobbyData>();

}
m_lobbyServiceData.State = LobbyServiceState.Fetched;
void OnRefreshFailed(long errorCode)
{
m_lobbyServiceData.lastErrorCode = errorCode;
m_lobbyServiceData.State = LobbyServiceState.Error;
}
void OnCreatedRoom()
{
OnJoinedRoom();

void OnGotRelayAllocation(Allocation allocationID)
{
Debug.Log("allocated relay server");
Debug.Log($"Got Relay code: {relayCode}");
RoomsQuery.Instance.BeginTracking(m_lobbyData.RoomID);
m_roomsContentHeartbeat.BeginTracking(m_lobbyData, m_localUser);
SetUserLobbyState();
Dictionary<string, string> displayNameData = new Dictionary<string, string>();
displayNameData.Add("DisplayName", m_localUser.DisplayName);
RoomsQuery.Instance.UpdatePlayerDataAsync(displayNameData, null);
}
void OnLeftRoom()
{
m_localUser.Emote = null;
RoomsQuery.Instance.LeaveRoomAsync(m_lobbyData.RoomID, ResetLobbyData);
m_roomsContentHeartbeat.EndTracking();
RoomsQuery.Instance.EndTracking();
}
/// <summary>
/// Back to Join menu if we fail to join for whatever reason.
/// </summary>
void OnFailedJoin()
{
SetGameState(GameState.JoinMenu);
}
void BeginCountDown()
{
// Only start the countdown once.
if (m_lobbyData.State == LobbyState.CountDown)
return;
m_lobbyData.CountDownTime = m_lobbyData.TargetEndTime.Subtract(DateTime.Now).Seconds;
m_lobbyData.State = LobbyState.CountDown;
StartCoroutine(CountDown());
}
IEnumerator CountDown()
{
m_LobbyReadyCheck.EndCheckingForReady();
while (m_lobbyData.CountDownTime > 0)
{
yield return new WaitForSeconds(0.2f);
if (m_lobbyData.State != LobbyState.CountDown)
yield break;
m_lobbyData.CountDownTime = m_lobbyData.TargetEndTime.Subtract(DateTime.Now).Seconds;
}
m_localUser.UserStatus = UserStatus.Connecting;
m_lobbyData.State = LobbyState.InGame;
RelayInterface.JoinAsync(m_lobbyData.RelayCode, OnJoinedGame);
}
void OnJoinedGame(JoinAllocation joinData)
{
m_localUser.UserStatus = UserStatus.Connected;
var ip = joinData.RelayServer.IpV4;
var port = joinData.RelayServer.Port;
m_lobbyData.RelayServer = new ServerAddress(ip, port);
}
void ToLobby()
{
m_lobbyData.State = LobbyState.Lobby;
m_lobbyData.CountDownTime = 0;
m_lobbyData.RelayServer = null;
SetUserLobbyState();
}
void SetUserLobbyState()
{
m_roomsContentHeartbeat.BeginTracking(m_lobbyData, m_localUser); // TODO: End tracking somewhere
if (m_localUser.IsHost)
m_LobbyReadyCheck.BeginCheckingForReady();
}
Dictionary<string, string> displayNameData = new Dictionary<string, string>();
displayNameData.Add("DisplayName", m_localUser.DisplayName);
RoomsQuery.Instance.RetrieveRoomAsync(m_lobbyData.RoomID, (r) => {
RoomsQuery.Instance.UpdatePlayerDataAsync(r, displayNameData, null);
});
void ResetLobbyData()
{
m_lobbyData.CopyObserved(new LobbyInfo(), new Dictionary<string, LobbyUser>());
m_lobbyData.CountDownTime = 0;
m_lobbyData.RelayServer = null;
m_LobbyReadyCheck.EndCheckingForReady();
ForceLeaveAttempt();
}
bool OnWantToQuit()
{
bool canQuit = string.IsNullOrEmpty(m_lobbyData?.RoomID);
StartCoroutine(LeaveBeforeQuit());
return canQuit;
}
void ForceLeaveAttempt()
{
if (!string.IsNullOrEmpty(m_lobbyData.RoomID))
RoomsQuery.Instance.LeaveRoomAsync(m_lobbyData.RoomID, null);
if (!string.IsNullOrEmpty(m_lobbyData?.RoomID))
{
RoomsQuery.Instance.LeaveRoomAsync(m_lobbyData?.RoomID, null);
m_lobbyData = null;
}
}
/// <summary>
/// In builds, if we are in a room and try to send a Leave request on application quit, it won't go through if we're quitting on the same frame.
/// So, we need to delay just briefly to let the request happen (though we don't need to wait for the result).
/// </summary>
IEnumerator LeaveBeforeQuit()
{
ForceLeaveAttempt();
// TEMP: Since we're temporarily (as of 6/31/21) deleting empty rooms when we leave them manually, we'll delay a bit to ensure that happens.
//yield return null;
yield return new WaitForSeconds(0.5f);
Application.Quit();
}
}
}

111
Assets/Scripts/Entities/LobbyData.cs


using System;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;

[Flags]
public enum LobbyState
{
Lobby = 1,
CountDown = 2,
InGame = 4
}
public ServerAddress RelayServer { get; set; }
public LobbyState State { get; set; }
RelayServer = existing.RelayServer;
State = existing.State;
}
public LobbyInfo(string roomCode)

RelayCode = null;
RelayServer = null;
State = LobbyState.Lobby;
}
}

Dictionary<string, LobbyUser> m_LobbyUsers = new Dictionary<string, LobbyUser>();
public Dictionary<string, LobbyUser> LobbyUsers => m_LobbyUsers;
#region LocalLobbyData
float m_CountDownTime;
public float CountDownTime
{
get { return m_CountDownTime; }
set
{
m_CountDownTime = value;
OnChanged(this);
}
}
DateTime m_TargetEndTime;
public DateTime TargetEndTime
{
get => m_TargetEndTime;
set
{
m_TargetEndTime = value;
OnChanged(this);
}
}
ServerAddress m_relayServer;
public ServerAddress RelayServer
{
get => m_relayServer;
set
{
m_relayServer = value;
OnChanged(this);
}
}
#endregion
public void AddPlayer(LobbyUser user)
{
if (m_LobbyUsers.ContainsKey(user.ID))

DoAddPlayer(user);
OnChanged(this);
}
private void DoAddPlayer(LobbyUser user)
{
m_LobbyUsers.Add(user.ID, user);

public void RemovePlayer(LobbyUser user)
{
DoRemoveUser(user);
OnChanged(this);
}
private void DoRemoveUser(LobbyUser user)
{
if (!m_LobbyUsers.ContainsKey(user.ID))
{
Debug.LogWarning($"Player {user.DisplayName}({user.ID}) does not exist in room: {RoomID}");

m_LobbyUsers.Remove(user.ID);
user.onChanged -= OnChangedUser;
OnChanged(this);
}
private void OnChangedUser(LobbyUser user)

}
}
public ServerAddress RelayServer
public string LobbyName
get => m_data.RelayServer;
get => m_data.LobbyName;
m_data.RelayServer = value;
m_data.LobbyName = value;
public string LobbyName
public LobbyState State
get => m_data.LobbyName;
get => m_data.State;
m_data.LobbyName = value;
m_data.State = value;
public bool Private
{
get => m_data.Private;

m_LobbyUsers = new Dictionary<string, LobbyUser>();
else
{
List<string> toRemove = new List<string>();
foreach (var m_user in m_LobbyUsers)
List<LobbyUser> toRemove = new List<LobbyUser>();
foreach (var user in m_LobbyUsers)
if (oldUsers.ContainsKey(m_user.Key))
m_user.Value.CopyObserved(oldUsers[m_user.Key]);
if (oldUsers.ContainsKey(user.Key))
user.Value.CopyObserved(oldUsers[user.Key]);
toRemove.Add(m_user.Key);
toRemove.Add(user.Value);
foreach (string remove in toRemove)
m_LobbyUsers.Remove(remove);
foreach (var remove in toRemove)
{
DoRemoveUser(remove);
}
foreach (var oldUser in oldUsers)
{
if (!m_LobbyUsers.ContainsKey(oldUser.Key))

OnChanged(this);
}

}
public void SetAllPlayersToState(UserStatus status)
{
foreach (var user in LobbyUsers.Values)
{
user.UserStatus = status;
}
}
~LobbyData()
{
OnDestroy(this);
}
}
}

78
Assets/Scripts/Entities/LobbyReadyCheck.cs


using System;
using UnityEngine;
using System.Collections.Generic;
using System.Linq;
/// <summary>
/// On the host, this will watch for all players to ready, and once they have, it will prepare for a synchronized countdown.
/// </summary>
public bool ReadyCheckFinished { get; private set; }
public bool ReadyCheckSuccess { get; private set; }
const float k_Checkinterval = 0.5f;
LobbyData m_LobbyData;
float m_ReadyTime = 10;
float m_ReadyTime = 5;
public LobbyReadyCheck(LobbyData lobbyData, Action<bool> onReadyCheckComplete, float readyTime = 10)
public LobbyReadyCheck(Action<bool> onReadyCheckComplete = null, float readyTime = 5)
m_ReadyTime = readyTime;
}
m_LobbyData = lobbyData;
m_LobbyData.SetAllPlayersToState(UserStatus.ReadyCheck);
m_ReadyTime = readyTime;
Locator.Get.UpdateSlow.Subscribe(CheckIfReady);
public void BeginCheckingForReady()
{
Locator.Get.UpdateSlow.Subscribe(OnUpdate);
float m_CheckCount;
float m_TimeElapsed = 0;
public void EndCheckingForReady()
{
Locator.Get.UpdateSlow.Unsubscribe(OnUpdate);
}
/// Checks the lobby to see if we have all Readied up, or any one has cancelled.
/// NOTE: The countdown will be happening at different times with this setup, possibility of a desynched game start.
/// Or a player cancellign the last milliseconds resulting in players starting without him
/// Checks the lobby to see if we have all Readied up. If so, send out a message with the target time at which to end a countdown.
void CheckIfReady(float dt)
void OnUpdate(float dt)
m_TimeElapsed += dt;
if (m_CheckCount < k_Checkinterval)
{
m_CheckCount += dt;
var room = RoomsQuery.Instance.CurrentRoom;
if (room == null || room.Players.Count == 0)
}
m_CheckCount = 0;
if (m_TimeElapsed + 1 < m_ReadyTime && m_LobbyData.PlayersOfState(UserStatus.Cancelled, 1)) //Dont allow cancels near the end of the ready check
int readyCount = room.Players.Count((p) =>
FinishedReadyCheck(false);
}
else if (m_LobbyData.PlayersOfState(UserStatus.Ready))
if (p.Data?.ContainsKey("UserStatus") != true) // Needs to be "!= true" to handle null properly.
return false;
UserStatus status;
if (Enum.TryParse(p.Data["UserStatus"].Value, out status))
return status == UserStatus.Ready;
return false;
});
if (readyCount == room.Players.Count)
FinishedReadyCheck(true);
}
else if (m_TimeElapsed > m_ReadyTime)
{
FinishedReadyCheck(false);
Dictionary<string, string> data = new Dictionary<string, string>();
DateTime targetTime = DateTime.Now.AddSeconds(m_ReadyTime);
data.Add("AllPlayersReady", targetTime.Ticks.ToString());
RoomsQuery.Instance.UpdateRoomDataAsync(data, null);
EndCheckingForReady(); // TODO: We'll need to restart checking once we end the relay sequence and return to the room.
void FinishedReadyCheck(bool success)
{
ReadyCheckSuccess = success;
ReadyCheckFinished = true;
m_OnReadyCheckComplete?.Invoke(success);
}
Locator.Get.UpdateSlow.Unsubscribe(CheckIfReady);
EndCheckingForReady();
}
}
}

21
Assets/Scripts/Entities/LobbyServiceData.cs


namespace LobbyRooms
{
public enum LobbyServiceState
{
Empty,
Fetching,
Error,
Fetched
}
/// <summary>
/// Holds the latest service data, such as the list of rooms
/// </summary>

LobbyServiceState m_CurrentState = LobbyServiceState.Empty;
public long lastErrorCode;
public LobbyServiceState State
{
get { return m_CurrentState; }
set
{
m_CurrentState = value;
OnChanged(this);
}
}
Dictionary<string, LobbyData> m_currentLobbies = new Dictionary<string, LobbyData>();
/// <summary>

28
Assets/Scripts/Entities/LobbyUser.cs


[Flags]
public enum UserStatus
{
Lobby = 1, //Connected to lobby
ReadyCheck = 2, //User is readying up.
Lobby = 1, // Connected to lobby, not ready yet
Connected = 16, // User Connected through relay
Menu = 32,
Cancelled = 64 // User Cancelled their Ready Check
Connected = 16, // User connected through relay
Menu = 32, // User is in a menu, external to the lobby
}
/// <summary>

public class LobbyUser : Observed<LobbyUser>
{
public LobbyUser(bool isHost = false, string displayName = null, string id = null, string emote = null)
public LobbyUser(bool isHost = false, string displayName = null, string id = null, string emote = null, string userStatus = null)
m_ID = id;
m_ID = id;
UserStatus status;
if (!string.IsNullOrEmpty(userStatus) && Enum.TryParse(userStatus, out status))
m_UserStatus = status;
}
bool m_isHost;

public override void CopyObserved(LobbyUser oldObserved)
{
m_DisplayName = oldObserved.m_DisplayName;
m_Emote = oldObserved.m_Emote;
m_ID = oldObserved.m_ID;
m_isHost = oldObserved.m_isHost;
m_UserStatus = oldObserved.m_UserStatus;
m_Emote = oldObserved.m_Emote;
m_ID = oldObserved.m_ID;
m_isHost = oldObserved.m_isHost;
m_UserStatus = oldObserved.m_UserStatus;
}
~LobbyUser()
{
OnDestroy(this);
}
}
}

3
Assets/Scripts/Entities/LocalGameState.cs


{
Menu = 1,
Lobby = 2,
InGame = 4,
Joining = 8
JoinMenu = 4,
}
/// <summary>

6
Assets/Scripts/Infrastructure/ObserverBehaviour.cs


using UnityEngine;
using UnityEngine.Events;
using UnityEngine.Serialization;
namespace LobbyRooms
{

public T observed { get; set; }
public UnityEvent<T> OnObservedUpdated;
/// <summary>
/// Option to allow certain observers to not be registered by the GameStateManager automatically.
/// </summary>
public bool observeOnStart = true;
protected virtual void UpdateObserver(T obs)
{

3
Assets/Scripts/Relay/RelayInterface.cs


/// </summary>
public static void SetPath(string path = "https://relay-allocations.cloud.unity3d.com")
{
Configuration.BasePath = path;
// TODO: Necessary?
//Configuration.BasePath = path;
}
/// <summary>

95
Assets/Scripts/Rooms/RoomsContentHeartbeat.cs


using Utilities;
using System;
using Utilities;
using Room = Unity.Services.Rooms.Models.Room;
namespace LobbyRooms
{

m_lobbyData = lobby;
m_localUser = localUser;
Locator.Get.UpdateSlow.Subscribe(OnUpdate);
lobby.onChanged += OnLobbyDataChanged;
m_lobbyData.onChanged += OnLobbyDataChanged;
m_shouldPushData = true; // Ensure the initial presence of a new player is pushed to the room; otherwise, when a non-host joins, the LobbyData never receives their data until they push something new.
}
public void EndTracking()
{
m_shouldPushData = false;
Locator.Get.UpdateSlow.Unsubscribe(OnUpdate);
if (m_lobbyData != null)
m_lobbyData.onChanged -= OnLobbyDataChanged;
m_lobbyData = null;
m_localUser = null;
{
m_shouldPushData = false;
Locator.Get.UpdateSlow.Unsubscribe(OnUpdate);
m_lobbyData.onChanged -= OnLobbyDataChanged;
m_lobbyData = null;
m_localUser = null;
}
EndTracking();
m_shouldPushData = true;
}

return;
m_isAwaitingQuery = true; // TODO: Recover if we fail? Try-catch?
m_isAwaitingQuery = true; // TODO: Recover if we fail? Try-catch? (I.e. if we fail during the update, this might not be reset to false.)
PushDataToRoom();
else
OnRetrieve();
void PushDataToRoom()
RoomsQuery.Instance.RetrieveRoomAsync(m_lobbyData.RoomID, (r) =>
if (m_localUser == null)
if (m_localUser.IsHost)
DoRoomDataPush(r);
else
DoPlayerDataPush(r);
});
m_isAwaitingQuery = false;
return; // Don't revert m_shouldPushData yet, so that we can retry.
}
m_shouldPushData = false;
if (m_localUser.IsHost)
DoRoomDataPush();
else
DoPlayerDataPush();
else
RoomsQuery.Instance.RetrieveRoomAsync(m_lobbyData.RoomID, OnRetrieve);
m_shouldPushData = false;
void DoRoomDataPush()
{
RoomsQuery.Instance.UpdateRoomDataAsync(Rooms.ToLobbyData.RetrieveRoomData(m_lobbyData), () => { DoPlayerDataPush(); }); // TODO: This needs not happen as often as player updates, right?
}
void DoRoomDataPush(Unity.Services.Rooms.Models.Room room)
void DoPlayerDataPush()
RoomsQuery.Instance.UpdateRoomDataAsync(room, Rooms.ToLobbyData.RetrieveRoomData(m_lobbyData), () => { DoPlayerDataPush(room); }); // TODO: This needs not happen as often as player updates, right?
RoomsQuery.Instance.UpdatePlayerDataAsync(Rooms.ToLobbyData.RetrieveUserData(m_localUser), () => { m_isAwaitingQuery = false; });
void DoPlayerDataPush(Unity.Services.Rooms.Models.Room room)
void OnRetrieve()
RoomsQuery.Instance.UpdatePlayerDataAsync(room, Rooms.ToLobbyData.RetrieveUserData(m_localUser), () => { m_isAwaitingQuery = false; });
m_isAwaitingQuery = false;
Room room = RoomsQuery.Instance.CurrentRoom;
if (room == null) return;
bool prevShouldPush = m_shouldPushData;
var prevState = m_lobbyData.State;
Rooms.ToLobbyData.Convert(room, m_lobbyData, m_localUser);
m_shouldPushData = prevShouldPush; // Copying the room data to the local lobby likely caused a change in its observed data, which would prompt updating room data, but that's not necessary here.
CheckForRoomReady(room);
if (prevState != LobbyState.Lobby && m_lobbyData.State == LobbyState.Lobby)
Locator.Get.Messenger.OnReceiveMessage(MessageType.ToLobby, null);
void OnRetrieve(Unity.Services.Rooms.Models.Room room)
void CheckForRoomReady(Room room)
m_isAwaitingQuery = false;
if (room != null)
bool areAllPlayersReady = room?.Data?.ContainsKey("AllPlayersReady") == true && !string.IsNullOrWhiteSpace(room.Data["AllPlayersReady"].Value);
if (areAllPlayersReady)
bool prevShouldPush = m_shouldPushData;
Rooms.ToLobbyData.Convert(room, m_lobbyData, m_localUser);
m_shouldPushData = prevShouldPush; // Copying the room data to the local lobby likely caused a change in its observed data, which would prompt updating room data, but that's not necessary here.
long targetTimeTicks;
if (long.TryParse(room.Data["AllPlayersReady"].Value, out targetTimeTicks))
{
DateTime targetTime = new DateTime(targetTimeTicks);
if (targetTime.Subtract(DateTime.Now).Seconds < 0)
return;
Locator.Get.Messenger.OnReceiveMessage(MessageType.Client_EndReadyCountdownAt, targetTime); // Note that this could be called multiple times.
// TODO: Make sure to disable state changes at this point? I guess we'll still have to handle disconnects, at least.
}
// TODO: Report failure?
}
}
}

15
Assets/Scripts/Rooms/RoomsInterface.cs


private async void DoRequest(Task<T> task, Action<T> onComplete)
{
T result = default;
string currentTrace = System.Environment.StackTrace;
result = await task; // TODO: We lose call stacks here. Can that be prevented?
result = await task;
} catch (Exception e) {
Exception eFull = new Exception($"Call stack before async call:\n{currentTrace}\n", e);
throw eFull;
} finally {
onComplete?.Invoke(result);
}

/// </summary>
public static void SetPath(string path = "https://rooms.cloud.unity3d.com/v1")
{
Configuration.BasePath = path;
// TODO: Necessary?
//Configuration.BasePath = path;
public static void CreateRoomAsync(string requesterUASId, string roomName, int maxPlayers, Action<Response<Room>> onComplete)
public static void CreateRoomAsync(string requesterUASId, string roomName, int maxPlayers, bool isPrivate, Action<Response<Room>> onComplete)
isPrivate: false
isPrivate: isPrivate
));
var task = RoomsService.RoomsApiClient.CreateRoomAsync(createRequest);
new InProgressRequest<Response<Room>>(task, onComplete);

new InProgressRequest<Response<Room>>(task, onComplete);
}
public static void UpdatePlayerAsync(string roomId, string playerId, Dictionary<string, DataObject> data, Action<Response<Room>> onComplete)
public static void UpdatePlayerAsync(string roomId, string playerId, Dictionary<string, PlayerDataObject> data, Action<Response<Room>> onComplete)
{
UpdatePlayerRequest updateRequest = new UpdatePlayerRequest(roomId, playerId, new PlayerUpdateRequest(
data: data

135
Assets/Scripts/Rooms/RoomsQuery.cs


{
// Just doing a singleton since static access is all that's really necessary but we also need to be able to subscribe to the slow update loop.
private static RoomsQuery s_instance;
public static RoomsQuery Instance {
get {
public static RoomsQuery Instance
{
get
{
if (s_instance == null)
s_instance = new RoomsQuery();
return s_instance;

public RoomsQuery()
{
Locator.Get.UpdateSlow.Subscribe(UpdateRoom); // Shouldn't need to unsubscribe since this instance won't be replaced.
}
#region We want to cache the room object so we don't query for it every time we need to do a different room operation or view current data.
// TODO: Replace this with just doing the room query update loop here instead of with each other operation.
// (This assumes that the player will be actively in just one room at a time, though they could passively be in more.)
private Queue<Action> m_pendingOperations = new Queue<Action>();
private string m_currentRoomId = null;
private Room m_lastKnownRoom;
private bool m_isMidRetrieve = false;
public Room CurrentRoom => m_lastKnownRoom;
public void BeginTracking(string roomId)
{
m_currentRoomId = roomId;
}
public void EndTracking()
{
m_currentRoomId = null;
}
private void UpdateRoom(float unused)
{
if (!string.IsNullOrEmpty(m_currentRoomId))
RetrieveRoomAsync(m_currentRoomId, OnComplete);
void OnComplete(Room room)
{
if (room != null)
m_lastKnownRoom = room;
m_isMidRetrieve = false;
HandlePendingOperations();
}
}
private void HandlePendingOperations()
{
while (m_pendingOperations.Count > 0)
m_pendingOperations.Dequeue()?.Invoke(); // Note: If this ends up enqueuing a bunch of operations, we might need to batch them and/or ensure they don't all execute at once.
}
#endregion
public void CreateRoomAsync(string roomName, int maxPlayers, Action<Room> onSuccess, Action onFailure)
public void CreateRoomAsync(string roomName, int maxPlayers, bool isPrivate, Action<Room> onSuccess, Action onFailure)
string uasId = Authentication.PlayerId;
RoomsInterface.CreateRoomAsync(uasId, roomName, maxPlayers, OnRoomCreated);
string uasId = AuthenticationService.Instance.PlayerId;
RoomsInterface.CreateRoomAsync(uasId, roomName, maxPlayers, isPrivate, OnRoomCreated);
void OnRoomCreated(Response<Room> response)
{

}
}
/// <summary>Attempt to join an existing room. ID xor code can be null.</summary>
/// <summary>Attempt to join an existing room. Either ID xor code can be null.</summary>
string uasId = Authentication.PlayerId;
string uasId = AuthenticationService.Instance.PlayerId;
RoomsInterface.JoinRoomAsync(uasId, roomId, roomCode, OnRoomJoined);
void OnRoomJoined(Response<Room> response)

}
}
/// <summary>Used for getting the list of all active rooms, without needing full info for each.</summary>
public void RetrieveRoomListAsync(Action<QueryResponse> onListRetrieved)
public void RetrieveRoomListAsync(Action<QueryResponse> onListRetrieved, Action<Response<QueryResponse>> onError = null)
string uasId = Authentication.PlayerId;
RoomsInterface.QueryAllRoomsAsync(OnRoomListRetrieved);
void OnRoomListRetrieved(Response<QueryResponse> response)

else
onError?.Invoke(response);
public void RetrieveRoomAsync(string roomId, Action<Room> onComplete)
private void RetrieveRoomAsync(string roomId, Action<Room> onComplete)
if (m_isMidRetrieve)
return; // Not calling onComplete since there's just the one point at which this is called.
m_isMidRetrieve = true;
m_isMidRetrieve = false;
onComplete?.Invoke(response?.Result);
}
}

/// <param name="onComplete">Called once the request completes, regardless of success or failure.</param>
public void LeaveRoomAsync(string roomId, Action onComplete)
{
string uasId = Authentication.PlayerId;
string uasId = AuthenticationService.Instance.PlayerId;
// TEMP. As of 6/31/21, the Rooms service doesn't automatically delete emptied rooms, though that functionality is expected in the near-term.
// Until then, we'll do a delete request whenever we leave, and if it's invalid, we'll just get a 403 back.
RoomsInterface.DeleteRoomAsync(roomId, null);
/// <param name="room">Pass in the room from a RetrieveRoomAsync. (This prevents a 429 Too Many Requests if updating both player and room data, by using one retrieval.)</param>
public void UpdatePlayerDataAsync(Room room, Dictionary<string, string> data, Action onComplete)
{ UpdateDataAsync(room, data, onComplete, false);
public void UpdatePlayerDataAsync(Dictionary<string, string> data, Action onComplete)
{
if (!ShouldUpdateData(() => { UpdatePlayerDataAsync(data, onComplete); }, onComplete))
return;
Room room = m_lastKnownRoom;
Dictionary<string, PlayerDataObject> dataCurr = new Dictionary<string, PlayerDataObject>();
foreach (var dataNew in data)
{
PlayerDataObject dataObj = new PlayerDataObject(visibility: PlayerDataObject.VisibilityOptions.Member, value: dataNew.Value);
if (dataCurr.ContainsKey(dataNew.Key))
dataCurr[dataNew.Key] = dataObj;
else
dataCurr.Add(dataNew.Key, dataObj);
}
RoomsInterface.UpdatePlayerAsync(room.Id, Locator.Get.Identity.GetSubIdentity(Auth.IIdentityType.Auth).GetContent("id"), dataCurr, (r) => { onComplete?.Invoke(); });
/// <param name="room">Pass in the room from a RetrieveRoomAsync. (This prevents a 429 Too Many Requests if updating both player and room data, by using one retrieval.)</param>
public void UpdateRoomDataAsync(Room room, Dictionary<string, string> data, Action onComplete)
{ UpdateDataAsync(room, data, onComplete, true);
}
public void UpdateRoomDataAsync(Dictionary<string, string> data, Action onComplete)
{
if (!ShouldUpdateData(() => { UpdateRoomDataAsync(data, onComplete); }, onComplete))
return;
private void UpdateDataAsync(Room room, Dictionary<string, string> data, Action onComplete, bool isRoom)
{
Room room = m_lastKnownRoom;
DataObject dataObj = new DataObject(visibility: "Member", value: dataNew.Value);
DataObject dataObj = new DataObject(visibility: DataObject.VisibilityOptions.Public, value: dataNew.Value); // Public so that when we request the list of lobbies, we can get info about them for filtering.
RoomsInterface.UpdateRoomAsync(room.Id, dataCurr, (r) => { onComplete?.Invoke(); });
}
if (isRoom)
RoomsInterface.UpdateRoomAsync(room.Id, dataCurr, (r) => { onComplete?.Invoke(); });
else
RoomsInterface.UpdatePlayerAsync(room.Id, Locator.Get.Identity.GetSubIdentity(Auth.IIdentityType.Auth).GetContent("id"), dataCurr, (r) => { onComplete?.Invoke(); });
private bool ShouldUpdateData(Action caller, Action onComplete)
{
if (m_isMidRetrieve)
{ m_pendingOperations.Enqueue(caller);
return false;
}
Room room = m_lastKnownRoom;
if (room == null)
{ onComplete?.Invoke();
return false;
}
return true;
}
}
}

10
Assets/Scripts/Rooms/ToLobbyData.cs


Private = room.IsPrivate,
LobbyName = room.Name,
MaxPlayerCount = room.MaxPlayers,
RelayCode = room.Data?.ContainsKey("RelayCode") == true ? room.Data["RelayCode"].Value : null
RelayCode = room.Data?.ContainsKey("RelayCode") == true ? room.Data["RelayCode"].Value : null,
State = room.Data?.ContainsKey("State") == true ? (LobbyState) int.Parse(room.Data["State"].Value) : LobbyState.Lobby
// TODO: RelayServer?
};
Dictionary<string, LobbyUser> roomUsers = new Dictionary<string, LobbyUser>();

displayName: player.Data?.ContainsKey("DisplayName") == true ? player.Data["DisplayName"].Value : "NewPlayer",
isHost: room.HostId.Equals(player.Id),
id: player.Id,
emote: player.Data?.ContainsKey("Emote") == true ? player.Data["Emote"].Value : null
emote: player.Data?.ContainsKey("Emote") == true ? player.Data["Emote"].Value : null,
userStatus: player.Data?.ContainsKey("UserStatus") == true ? player.Data["UserStatus"].Value : UserStatus.Lobby.ToString()
);
roomUsers.Add(user.ID, user);
}

{
Dictionary<string, string> data = new Dictionary<string, string>();
data.Add("RelayCode", room.RelayCode);
data.Add("State", ((int)room.State).ToString());
return data;
}

if (string.IsNullOrEmpty(user.ID))
if (user == null || string.IsNullOrEmpty(user.ID))
data.Add("UserStatus", user.UserStatus.ToString());
return data;
}
}

149
Assets/Scripts/Tests/PlayMode/ReadyCheckTests.cs


using System.Collections;
using System.Collections;
using Unity.Services.Rooms;
using Unity.Services.Rooms.Models;
using RoomsInterface = LobbyRooms.Rooms.RoomsInterface;
LobbyData m_LobbyData;
LobbyReadyCheck m_ReadyCheck;
const int k_TestUserCount = 3;
private string m_workingRoomId;
private LobbyRooms.Auth.Identity m_auth;
private bool m_didSigninComplete = false;
private GameObject m_updateSlowObj;
[SetUp]
public void FirstTimeSetup()
[OneTimeSetUp]
public void Setup()
m_LobbyData = new LobbyData();
new GameObject("SlowUpdater").AddComponent<UpdateSlow>();
m_auth = new LobbyRooms.Auth.Identity(() => { m_didSigninComplete = true; });
Locator.Get.Provide(m_auth);
var stagingpath = "https://rooms-stg.cloud.unity3d.com/v1";
RoomsInterface.SetPath(stagingpath); //Defaults to Test Path
m_updateSlowObj = new GameObject("UpdateSlowTest");
m_updateSlowObj.AddComponent<UpdateSlow>();
}
for (int i = 0; i < k_TestUserCount; i++)
{
m_LobbyData.AddPlayer(new LobbyUser
{
ID = i.ToString()
});
[UnityTearDown]
public IEnumerator PerTestTeardown()
{
if (m_workingRoomId != null)
{ RoomsInterface.DeleteRoomAsync(m_workingRoomId, null);
m_workingRoomId = null;
yield return new WaitForSeconds(0.5f); // We need a yield anyway, so wait long enough to probably delete the room. There currently (6/22/2021) aren't other tests that would have issues if this took longer.
[UnityTest]
public IEnumerator TimeOutWithSingleReadyUp()
[OneTimeTearDown]
public void Teardown()
m_ReadyCheck = new LobbyReadyCheck(m_LobbyData, AssertNotReady, 1);
yield return new WaitForSeconds(0.1f);
m_LobbyData.LobbyUsers["0"].UserStatus = UserStatus.Ready;
while (!m_ReadyCheck.ReadyCheckFinished)
yield return null;
Locator.Get.Provide(new LobbyRooms.Auth.IdentityNoop());
m_auth.Dispose();
LogAssert.ignoreFailingMessages = false;
RoomsQuery.Instance.EndTracking();
GameObject.Destroy(m_updateSlowObj);
[UnityTest]
public IEnumerator SucceedAllReadyUp()
private IEnumerator WaitForSignin()
m_ReadyCheck = new LobbyReadyCheck(m_LobbyData, AssertReady, 1);
yield return new WaitForSeconds(0.1f);
m_LobbyData.LobbyUsers["0"].UserStatus = UserStatus.Ready;
yield return new WaitForSeconds(0.1f);
m_LobbyData.LobbyUsers["1"].UserStatus = UserStatus.Ready;
yield return new WaitForSeconds(0.1f);
m_LobbyData.LobbyUsers["2"].UserStatus = UserStatus.Ready;
while (!m_ReadyCheck.ReadyCheckFinished)
yield return null;
// Wait a reasonable amount of time for sign-in to complete.
if (!m_didSigninComplete)
yield return new WaitForSeconds(3);
if (!m_didSigninComplete)
Assert.Fail("Did not sign in.");
[UnityTest]
public IEnumerator FailOnCancel()
private IEnumerator CreateRoom(string roomName, string userId)
m_ReadyCheck = new LobbyReadyCheck(m_LobbyData, AssertNotReady, 1);
yield return new WaitForSeconds(0.1f);
m_LobbyData.LobbyUsers["0"].UserStatus = UserStatus.Ready;
yield return new WaitForSeconds(0.1f);
m_LobbyData.LobbyUsers["1"].UserStatus = UserStatus.Ready;
yield return new WaitForSeconds(0.1f);
m_LobbyData.LobbyUsers["2"].UserStatus = UserStatus.Cancelled;
while (!m_ReadyCheck.ReadyCheckFinished)
yield return null;
Response<Room> createResponse = null;
float timeout = 5;
RoomsInterface.CreateRoomAsync(userId, roomName, 4, false, (r) => { createResponse = r; });
while (createResponse == null && timeout > 0)
{ yield return new WaitForSeconds(0.25f);
timeout -= 0.25f;
}
Assert.Greater(timeout, 0, "Timeout check (room creation).");
m_workingRoomId = createResponse.Result.Id;
void AssertReady(bool ready)
private IEnumerator PushPlayerData(LobbyUser player)
Assert.IsTrue(ready, $"ReadyCheck : {ready}");
bool hasPushedPlayerData = false;
float timeout = 5;
RoomsQuery.Instance.UpdatePlayerDataAsync(LobbyRooms.Rooms.ToLobbyData.RetrieveUserData(player), () => { hasPushedPlayerData = true; }); // RoomsContentHeartbeat normally does this.
while (!hasPushedPlayerData && timeout > 0)
{ yield return new WaitForSeconds(0.25f);
timeout -= 0.25f;
}
Assert.Greater(timeout, 0, "Timeout check (push player data).");
void AssertNotReady(bool ready)
/// <summary>
/// After creating a room and a player, signal that the player is Ready. This should lead to a countdown time being set for all players.
/// </summary>
[UnityTest]
public IEnumerator SetCountdownTimeSinglePlayer()
Assert.False(ready, $"NotReadyCheck : {ready}");
LogAssert.ignoreFailingMessages = true; // TODO: Not sure why, but when auth logs in, it sometimes generates an error: "A Native Collection has not been disposed[...]." We don't want this to cause test failures, since in practice it *seems* to not negatively impact behavior.
bool? readyResult = null;
LobbyReadyCheck readyCheck = new LobbyReadyCheck((b) => { readyResult = b; }, 5); // This ready time is used for the countdown target end, not for any of the timing of actually detecting readies.
yield return WaitForSignin();
string userId = m_auth.GetSubIdentity(LobbyRooms.Auth.IIdentityType.Auth).GetContent("id");
yield return CreateRoom("TestReadyRoom1", userId);
RoomsQuery.Instance.BeginTracking(m_workingRoomId);
yield return new WaitForSeconds(2); // Allow the initial room retrieval.
LobbyUser user = new LobbyUser();
user.ID = userId;
user.UserStatus = UserStatus.Ready;
yield return PushPlayerData(user);
readyCheck.BeginCheckingForReady();
float timeout = 5; // Long enough for two slow updates
yield return new WaitForSeconds(timeout);
readyCheck.Dispose();
RoomsQuery.Instance.EndTracking();
yield return new WaitForSeconds(2); // Buffer to prevent a 429 on the upcoming Get, since there's a Get request on the slow upate loop when that's active.
Response<Room> getResponse = null;
timeout = 5;
RoomsInterface.GetRoomAsync(m_workingRoomId, (r) => { getResponse = r; });
while (getResponse == null && timeout > 0)
{ yield return new WaitForSeconds(0.25f);
timeout -= 0.25f;
}
Assert.Greater(timeout, 0, "Timeout check (get room).");
Assert.NotNull(getResponse.Result, "Retrieved room successfully.");
Assert.NotNull(getResponse.Result.Data, "Room should have data.");
Assert.True(getResponse.Result.Data.ContainsKey("AllPlayersReady"), "Check for AllPlayersReady key.");
string readyString = getResponse.Result.Data["AllPlayersReady"]?.Value;
Assert.NotNull(readyString, "Check for non-null AllPlayersReady.");
Assert.True(long.TryParse(readyString, out long ticks), "Check for ticks value in AllPlayersReady."); // This will be based on the current time, so we won't check for a specific value.
// Can't test with multiple players on one machine, since anonymous UAS credentials can't be manually supplied.
}
}

44
Assets/Scripts/Tests/PlayMode/RoomsRoundtripTests.cs


using NUnit.Framework;
using System.Collections;
using System.Linq;
using Unity.Services.Rooms;
using Unity.Services.Rooms.Models;
using UnityEngine;

m_auth = new LobbyRooms.Auth.SubIdentity_Authentication(() => { m_didSigninComplete = true; });
var stagingpath = "https://rooms-stg.cloud.unity3d.com/v1";
RoomsInterface.SetPath(stagingpath); //Defaults to Test Path
}
[UnityTearDown]
public IEnumerator PerTestTeardown()
{
if (m_workingRoomId != null)
{ RoomsInterface.DeleteRoomAsync(m_workingRoomId, null);
m_workingRoomId = null;
}
yield return new WaitForSeconds(0.5f); // We need a yield anyway, so wait long enough to probably delete the room. There currently (6/22/2021) aren't other tests that would have issues if this took longer.
if (m_workingRoomId != null)
RoomsInterface.DeleteRoomAsync(m_workingRoomId, null);
m_auth?.Dispose();
LogAssert.ignoreFailingMessages = false;
}

if (!m_didSigninComplete)
Assert.Fail("Did not sign in.");
// Since we're signed in through the same pathway as the actual game, the list of rooms will include any that have been made in the game itself, so we should account for those.
yield return new WaitForSeconds(1); // To prevent a possible 429 with the upcoming Query request, in case a previous test had one; Query requests can only occur at a rate of 1 per second.
Response<QueryResponse> queryResponse = null;
float timeout = 5;
RoomsInterface.QueryAllRoomsAsync((qr) => { queryResponse = qr; });
while (queryResponse == null && timeout > 0)
{ yield return new WaitForSeconds(0.25f);
timeout -= 0.25f;
}
Assert.Greater(timeout, 0, "Timeout check (query #0)");
Assert.IsTrue(queryResponse.Status >= 200 && queryResponse.Status < 300, "QueryAllRoomsAsync should return a success code. (#0)");
int numRoomsIni = queryResponse.Result.Results?.Count ?? 0;
float timeout = 5;
timeout = 5;
RoomsInterface.CreateRoomAsync(m_auth.GetContent("id"), roomName, 123, (r) => { createResponse = r; });
RoomsInterface.CreateRoomAsync(m_auth.GetContent("id"), roomName, 100, false, (r) => { createResponse = r; });
while (createResponse == null && timeout > 0)
{ yield return new WaitForSeconds(0.25f);
timeout -= 0.25f;

Assert.AreEqual(roomName, createResponse.Result.Name, "Created room should match the provided name.");
// Query for the test room via QueryAllRooms.
Response<QueryResponse> queryResponse = null;
yield return new WaitForSeconds(1); // To prevent a possible 429 with the upcoming Query request.
queryResponse = null;
timeout = 5;
RoomsInterface.QueryAllRoomsAsync((qr) => { queryResponse = qr; });
while (queryResponse == null && timeout > 0)

Assert.Greater(timeout, 0, "Timeout check (query #1)");
Assert.IsTrue(queryResponse.Status >= 200 && queryResponse.Status < 300, "QueryAllRoomsAsync should return a success code. (#1)");
Assert.AreEqual(1, queryResponse.Result.Results.Count, "Queried rooms list should contain just the test room. (Are there rooms you created and did not yet delete?)"); // TODO: Can we get a test account such that having actual rooms open doesn't impact this?
Assert.AreEqual(roomName, queryResponse.Result.Results[0].Name, "Checking queried room for name.");
Assert.AreEqual(m_workingRoomId, queryResponse.Result.Results[0].Id, "Checking queried room for ID.");
Assert.AreEqual(1 + numRoomsIni, queryResponse.Result.Results.Count, "Queried rooms list should contain just the test room. (Are there rooms you created and did not yet delete?)"); // TODO: Can we get a test account such that having actual rooms open doesn't impact this?
Assert.IsTrue(queryResponse.Result.Results.Where(r => r.Name == roomName).Count() == 1, "Checking queried room for name.");
Assert.IsTrue(queryResponse.Result.Results.Where(r => r.Id == m_workingRoomId).Count() == 1, "Checking queried room for ID.");
// Query for solely the test room via GetRoom.
Response<Room> getResponse = null;

m_workingRoomId = null;
// Query to ensure the room is gone.
yield return new WaitForSeconds(1); // To prevent a possible 429 with the upcoming Query request.
Response<QueryResponse> queryResponseTwo = null;
timeout = 5;
RoomsInterface.QueryAllRoomsAsync((qr) => { queryResponseTwo = qr; });

}
Assert.Greater(timeout, 0, "Timeout check (query #2)");
Assert.IsTrue(queryResponseTwo.Status >= 200 && queryResponseTwo.Status < 300, "QueryAllRoomsAsync should return a success code. (#2)");
Assert.AreEqual(0, queryResponseTwo.Result.Results.Count, "Queried rooms list should be empty.");
Assert.AreEqual(numRoomsIni, queryResponseTwo.Result.Results.Count, "Queried rooms list should be empty.");
// Some error messages might be asynchronous, so to reduce spillover into other tests, just wait here for a bit before proceeding.
yield return new WaitForSeconds(3);

Assert.Fail("Did not sign in.");
bool? didComplete = null;
RoomsInterface.CreateRoomAsync("ThisStringIsInvalidHere", "room name", 123, (r) => { didComplete = (r == null); });
RoomsInterface.CreateRoomAsync("ThisStringIsInvalidHere", "room name", 123, false, (r) => { didComplete = (r == null); });
float timeout = 5;
while (didComplete == null && timeout > 0)
{ yield return new WaitForSeconds(0.25f);

51
Assets/Scripts/Tests/PlayMode/UpdateSlowTests.cs


{
private GameObject m_updateSlowObj;
private List<Subscriber> m_activeSubscribers = new List<Subscriber>(); // For cleaning up, in case an Assert prevents a Subscriber from taking care of itself.
private const float k_period = 1.5f;
private class Subscriber : IDisposable
{

yield return null;
Assert.AreEqual(0, updateCount, "Update loop should be slow and not update per-frame.");
yield return new WaitForSeconds(0.9f);
Assert.AreEqual(0, updateCount, "Assuming a default period of 1s and a reasonable frame rate, the slow update should still not have hit.");
yield return new WaitForSeconds(k_period - 0.1f);
Assert.AreEqual(0, updateCount, "Assuming a default period of 1.5s and a reasonable frame rate, the slow update should still not have hit.");
yield return new WaitForSeconds(1);
yield return new WaitForSeconds(k_period);
yield return new WaitForSeconds(1);
yield return new WaitForSeconds(k_period);
yield return new WaitForSeconds(1);
yield return new WaitForSeconds(k_period);
yield return new WaitForSeconds(1);
yield return new WaitForSeconds(k_period);
Assert.AreEqual(11, updateCount, "Should have unsubscribed the remaining subscriber.");
}

int updateCount = 0;
Locator.Get.UpdateSlow.Subscribe((dt) => { updateCount++; });
LogAssert.Expect(LogType.Error, new Regex(".*Removed anonymous.*"));
yield return new WaitForSeconds(1.1f);
yield return new WaitForSeconds(k_period + 0.1f);
public IEnumerator StaggerClients()
{
int updateCountA = 0, updateCountB = 0;
Subscriber subA = new Subscriber(() => { updateCountA++; });
Subscriber subB = new Subscriber(() => { updateCountB++; });
m_activeSubscribers.Add(subA);
m_activeSubscribers.Add(subB);
float periodHalf = k_period / 2;
yield return new WaitForSeconds(periodHalf - 0.1f);
Assert.AreEqual(0, updateCountA, "Base case (count A)");
Assert.AreEqual(0, updateCountB, "Base case (count B)");
yield return new WaitForSeconds(0.2f);
Assert.AreEqual(1, updateCountA, "Updates are now on half the normal period. First update is first.");
Assert.AreEqual(0, updateCountB, "Updates are now on half the normal period. Second update is second.");
yield return new WaitForSeconds(periodHalf);
Assert.AreEqual(1, updateCountA, "First update is still offset.");
Assert.AreEqual(1, updateCountB, "Second update should hit now.");
subB.Dispose();
yield return new WaitForSeconds(periodHalf);
Assert.AreEqual(1, updateCountA, "First update should no longer be offset.");
Assert.AreEqual(1, updateCountB, "Second update is unsubscribed.");
yield return new WaitForSeconds(periodHalf);
Assert.AreEqual(2, updateCountA, "First update should hit with normal timing.");
Assert.AreEqual(1, updateCountB, "Second update is still unsubscribed.");
}
[UnityTest]
public IEnumerator WhatIfASubscriberIsVerySlow()
{
int updateCount = 0;

m_activeSubscribers.Add(sub);
LogAssert.Expect(LogType.Error, new Regex(".*took too long.*"));
yield return new WaitForSeconds(1.1f);
yield return new WaitForSeconds(k_period + 0.1f);
yield return new WaitForSeconds(1);
yield return new WaitForSeconds(k_period);
Assert.AreEqual(1, updateCount, "Should have removed the offending subscriber.");
}
}

5
Assets/Scripts/UI/BackButtonUI.cs


{
public class BackButtonUI : MonoBehaviour
{
public void ToJoinMenu()
{
Locator.Get.Messenger.OnReceiveMessage(MessageType.ChangeGameState, GameState.JoinMenu);
}
public void ToMenu()
{
Locator.Get.Messenger.OnReceiveMessage(MessageType.ChangeGameState, GameState.Menu);

3
Assets/Scripts/UI/GameStateVisibilityUI.cs


[RequireComponent(typeof(LocalGameStateObserver))]
public class GameStateVisibilityUI : ObserverPanel<LocalGameState>
{
public GameState ShowThisWhen;
[SerializeField]
GameState ShowThisWhen;
public override void ObservedUpdated(LocalGameState observed)
{

20
Assets/Scripts/UI/JoinCreateRoomUI.cs


using System;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.Serialization;
using Utilities;
namespace LobbyRooms.UI

/// </summary>
public class JoinCreateRoomUI : UIPanelBase { }
public class JoinCreateRoomUI : ObserverPanel<LocalGameState>
{
public override void ObservedUpdated(LocalGameState observed)
{
if (observed.State == GameState.JoinMenu)
{
Show();
Locator.Get.Messenger.OnReceiveMessage(MessageType.QueryRooms, null);
}
else
{
Hide();
}
}
}
}

29
Assets/Scripts/UI/JoinMenuUI.cs


m_lobbyDataSelected = lobby.Data;
}
public void OnJoinCodeInputFieldChanged(string newCode) // TODO: Needs some new UI to show that an existing room is selected without being able to show its room code.
public void OnJoinCodeInputFieldChanged(string newCode)
m_lobbyDataSelected = new LobbyInfo(newCode);
m_lobbyDataSelected = new LobbyInfo(newCode.ToUpper());
}
public void OnJoinButtonPressed()

var lobbyData = codeLobby.Value;
if (!m_LobbyButtons.ContainsKey(roomCodeKey))
{
AddNewLobbyButton(roomCodeKey, lobbyData);
if (CanDisplay(lobbyData))
AddNewLobbyButton(roomCodeKey, lobbyData);
}
else
{
if (CanDisplay(lobbyData))
UpdateLobbyButton(roomCodeKey, lobbyData);
else
RemoveLobbyButton(lobbyData);
bool CanDisplay(LobbyData lobby)
{
return lobby.Data.State == LobbyState.Lobby && !lobby.Private;
}
/// Instaniates UI element and initializes the observer with the Data
/// Instantiates UI element and initializes the observer with the LobbyData
/// </summary>
void AddNewLobbyButton(string roomCode, LobbyData lobby)
{

m_LobbyData.Add(roomCode, lobby);
}
void UpdateLobbyButton(string roomCode, LobbyData lobby)
{
m_LobbyButtons[roomCode].UpdateLobby(lobby);
}
lobbyButton.GetComponent<LobbyDataObserver>().EndObserving();
m_LobbyButtons.Remove(lobbyID);
m_LobbyData.Remove(lobbyID);
Destroy(lobbyButton.gameObject);

5
Assets/Scripts/UI/LobbyButtonUI.cs


onLobbyPressed?.Invoke(m_DataObserver.observed);
}
public void UpdateLobby(LobbyData lobby)
{
m_DataObserver.observed.CopyObserved(lobby); // TODO: Seems very roundabout.
}
public void OnRoomUpdated(LobbyData data)
{
lobbyNameText.SetText(data.LobbyName);

4
Assets/Scripts/UI/UIPanelBase.cs


[SerializeField] // TODO: Why serialized? Just for testing?
bool showing;
// TODO: Initial state isn't captured. Consider reworking the UI so that visibility state is captured in data/code somewhere and the UI merely observes it.
public void Toggle()
{
if (showing)

showing = false;
m_onVisibilityChange?.Invoke(false);
}
}
}

2
Assets/Scripts/UI/CountdownUI.cs.meta


fileFormatVersion: 2
guid: f5dcc1cdbde23894ca455835bb749483
guid: 5b3b588e7ae40ec4ca35fdb9404513ab
MonoImporter:
externalObjects: {}
serializedVersion: 2

2
Assets/Scripts/UI/EndGameButtonUI.cs.meta


fileFormatVersion: 2
guid: a0bf9e938c02ca049b3213554aac1890
guid: 268bfa80f12de0345a051323f3279616
MonoImporter:
externalObjects: {}
serializedVersion: 2

4
Assets/Scripts/Utilities/Messenger.cs


ChangeLobbyUserState = 8,
HostInitReadyCheck = 9,
LocalUserReadyCheckResponse = 10,
UserSetEmote = 11
UserSetEmote = 11,
ToLobby = 12,
Client_EndReadyCountdownAt = 13,
}
/// <summary>

84
Assets/Scripts/Utilities/UpdateSlow.cs


public class UpdateSlow : MonoBehaviour, IUpdateSlow
{
[SerializeField]
private float m_updatePeriod = 1;
[Tooltip("Update interval. Note that room Get requests must occur at least 1 second apart, so this period should likely be greater than that.")]
private float m_updatePeriod = 1.5f;
[Tooltip("If a subscriber to slow update takes longer than this to execute, it will be unsubscribed.")]
[Tooltip("If a subscriber to slow update takes longer than this to execute, it can be automatically unsubscribed.")]
[SerializeField]
[Tooltip("We ordinarily automatically remove a subscriber that takes too long. Otherwise, we'll simply log.")]
private bool m_doNotRemoveIfTooLong = false;
private int m_nextActiveSubIndex = 0; // For staggering subscribers, to prevent spikes of lots of things triggering at once.
public void Awake()
{

/// <summary>Safe to call even if onUpdate was not previously Subscribed.</summary>
public void Unsubscribe(UpdateMethod onUpdate)
{
m_subscribers.Remove(onUpdate);
int index = m_subscribers.IndexOf(onUpdate);
if (index >= 0)
{
m_subscribers.Remove(onUpdate);
if (index < m_nextActiveSubIndex)
m_nextActiveSubIndex--;
}
if (m_subscribers.Count == 0)
return;
if (m_updateTimer > m_updatePeriod)
float effectivePeriod = m_updatePeriod / m_subscribers.Count;
while (m_updateTimer > effectivePeriod)
float actualUpdate = ((int)(m_updateTimer / m_updatePeriod)) * m_updatePeriod; // If periods would overlap, aggregate them together.
m_updateTimer -= actualUpdate;
OnUpdate(actualUpdate);
m_updateTimer -= effectivePeriod;
OnUpdate(effectivePeriod);
}
}

for (int sub = 0; sub < m_subscribers.Count; sub++)
{
UpdateMethod onUpdate = m_subscribers[sub];
if (onUpdate == null || onUpdate.Target == null) // In case something forgets to Unsubscribe when it dies.
{ Remove($"Did not Unsubscribe from UpdateSlow: {onUpdate.Target} : {onUpdate.Method}");
continue;
}
if (onUpdate.Method.ToString().Contains("<")) // Detect an anonymous or lambda or local method that cannot be Unsubscribed, by checking for a character that can't exist in a declared method name.
{ Remove($"Removed anonymous from UpdateSlow: {onUpdate.Target} : {onUpdate.Method}");
continue;
}
m_nextActiveSubIndex = System.Math.Max(0, System.Math.Min(m_subscribers.Count - 1, m_nextActiveSubIndex)); // Just a backup.
UpdateMethod onUpdate = m_subscribers[m_nextActiveSubIndex];
if (onUpdate == null || onUpdate.Target == null) // In case something forgets to Unsubscribe when it dies.
{ Remove(m_nextActiveSubIndex, $"Did not Unsubscribe from UpdateSlow: {onUpdate.Target} : {onUpdate.Method}");
return;
}
if (onUpdate.Method.ToString().Contains("<")) // Detect an anonymous or lambda or local method that cannot be Unsubscribed, by checking for a character that can't exist in a declared method name.
{ Remove(m_nextActiveSubIndex, $"Removed anonymous from UpdateSlow: {onUpdate.Target} : {onUpdate.Method}");
return;
}
stopwatch.Restart();
onUpdate?.Invoke(dt);
stopwatch.Stop();
if (stopwatch.ElapsedMilliseconds > m_durationToleranceMs)
Remove($"UpdateSlow subscriber took too long, removing: {onUpdate.Target} : {onUpdate.Method}");
void Remove(string msg)
stopwatch.Restart();
onUpdate?.Invoke(dt);
stopwatch.Stop();
if (stopwatch.ElapsedMilliseconds > m_durationToleranceMs)
{
if (!m_doNotRemoveIfTooLong)
Remove(m_nextActiveSubIndex, $"UpdateSlow subscriber took too long, removing: {onUpdate.Target} : {onUpdate.Method}");
else
m_subscribers.RemoveAt(sub);
sub--;
Debug.LogError(msg);
Debug.LogWarning($"UpdateSlow subscriber took too long: {onUpdate.Target} : {onUpdate.Method}");
Increment();
}
else
Increment();
void Remove(int index, string msg)
{
m_subscribers.RemoveAt(index);
m_nextActiveSubIndex--;
Debug.LogError(msg);
Increment();
}
void Increment()
{
m_nextActiveSubIndex++;
if (m_nextActiveSubIndex >= m_subscribers.Count)
m_nextActiveSubIndex = 0;
}
}

24
Packages/manifest.json


{
"dependencies": {
"com.unity.2d.animation": "6.0.1",
"com.unity.2d.animation": "6.0.3",
"com.unity.2d.psdimporter": "5.0.1",
"com.unity.2d.psdimporter": "6.0.0-pre.2",
"com.unity.2d.spriteshape": "6.0.0",
"com.unity.2d.spriteshape": "7.0.0-pre.2",
"com.unity.collab-proxy": "1.3.9",
"com.unity.ide.rider": "3.0.5",
"com.unity.ide.visualstudio": "2.0.7",
"com.unity.collab-proxy": "1.5.7",
"com.unity.ide.rider": "3.0.7",
"com.unity.ide.visualstudio": "2.0.9",
"com.unity.services.authentication": "0.3.0-preview",
"com.unity.services.authentication": "0.5.0-preview",
"com.unity.services.relay": "0.0.1-preview.3",
"com.unity.services.rooms": "0.1.3",
"com.unity.services.relay": "0.0.1-preview.5",
"com.unity.services.rooms": "0.1.5",
"com.unity.test-framework": "1.1.24",
"com.unity.textmeshpro": "3.0.4",
"com.unity.timeline": "1.6.0-pre.3",
"com.unity.test-framework": "1.1.26",
"com.unity.textmeshpro": "3.0.6",
"com.unity.timeline": "1.6.0-pre.5",
"com.unity.toolchain.win-x86_64-linux-x86_64": "0.1.20-preview",
"com.unity.ugui": "1.0.0",
"com.unity.modules.ai": "1.0.0",

79
Packages/packages-lock.json


{
"dependencies": {
"com.unity.2d.animation": {
"version": "6.0.1",
"version": "6.0.3",
"depth": 0,
"source": "registry",
"dependencies": {

"url": "https://packages-v2-staging.unity.com"
},
"com.unity.2d.common": {
"version": "5.0.0",
"version": "6.0.0-pre.2",
"com.unity.modules.uielements": "1.0.0"
"com.unity.mathematics": "1.1.0",
"com.unity.modules.uielements": "1.0.0",
"com.unity.burst": "1.5.1"
},
"url": "https://packages-v2-staging.unity.com"
},

"url": "https://packages-v2-staging.unity.com"
},
"com.unity.2d.psdimporter": {
"version": "5.0.1",
"version": "6.0.0-pre.2",
"com.unity.2d.common": "5.0.0",
"com.unity.2d.common": "6.0.0-pre.2",
"com.unity.2d.sprite": "1.0.0"
},
"url": "https://packages-v2-staging.unity.com"

"dependencies": {}
},
"com.unity.2d.spriteshape": {
"version": "6.0.0",
"version": "7.0.0-pre.2",
"com.unity.2d.common": "5.0.0",
"com.unity.2d.common": "6.0.0-pre.2",
"com.unity.2d.path": "5.0.0",
"com.unity.modules.physics2d": "1.0.0"
},

"source": "builtin",
"dependencies": {}
},
"com.unity.burst": {
"version": "1.6.0-pre.2",
"depth": 2,
"source": "registry",
"dependencies": {
"com.unity.mathematics": "1.2.1"
},
"url": "https://packages-v2-staging.unity.com"
},
"version": "1.3.9",
"version": "1.5.7",
"dependencies": {},
"dependencies": {
"com.unity.nuget.newtonsoft-json": "2.0.0"
},
"url": "https://packages-v2-staging.unity.com"
},
"com.unity.ext.nunit": {

"url": "https://packages-v2-staging.unity.com"
},
"com.unity.ide.rider": {
"version": "3.0.5",
"version": "3.0.7",
"dependencies": {},
"dependencies": {
"com.unity.ext.nunit": "1.0.6"
},
"version": "2.0.7",
"version": "2.0.9",
"depth": 0,
"source": "registry",
"dependencies": {

"url": "https://packages-v2-staging.unity.com"
},
"com.unity.services.authentication": {
"version": "0.3.0-preview",
"version": "0.5.0-preview",
"nuget.moq": "1.0.0",
"com.unity.services.core": "0.1.0-preview",
"com.unity.services.core": "1.1.0-pre.2",
"version": "0.3.0-preview",
"depth": 0,
"version": "1.1.0-pre.2",
"depth": 1,
"nuget.moq": "1.0.0",
"com.unity.modules.unitywebrequest": "1.0.0",
"com.unity.nuget.newtonsoft-json": "2.0.0"
},

"version": "0.0.1-preview.3",
"version": "0.0.1-preview.5",
"com.unity.services.core": "0.2.0-preview",
"com.unity.services.core": "1.1.0-pre.2",
"com.unity.modules.unitywebrequest": "1.0.0",
"com.unity.modules.unitywebrequestassetbundle": "1.0.0",
"com.unity.modules.unitywebrequestaudio": "1.0.0",

"url": "https://artifactory.prd.it.unity3d.com/artifactory/api/npm/upm-candidates"
},
"com.unity.services.rooms": {
"version": "0.1.3",
"version": "0.1.5",
"com.unity.services.core": "0.2.0-preview",
"com.unity.services.core": "1.1.0-pre.2",
"com.unity.modules.unitywebrequest": "1.0.0",
"com.unity.modules.unitywebrequestassetbundle": "1.0.0",
"com.unity.modules.unitywebrequestaudio": "1.0.0",

"url": "https://artifactory.prd.it.unity3d.com/artifactory/api/npm/upm-candidates"
},
"com.unity.test-framework": {
"version": "1.1.24",
"version": "1.1.26",
"depth": 0,
"source": "registry",
"dependencies": {

"url": "https://packages-v2-staging.unity.com"
},
"com.unity.textmeshpro": {
"version": "3.0.4",
"version": "3.0.6",
"depth": 0,
"source": "registry",
"dependencies": {

},
"com.unity.timeline": {
"version": "1.6.0-pre.3",
"version": "1.6.0-pre.5",
"depth": 0,
"source": "registry",
"dependencies": {

"com.unity.modules.ui": "1.0.0",
"com.unity.modules.imgui": "1.0.0"
}
},
"nuget.castle-core": {
"version": "1.0.1",
"depth": 2,
"source": "registry",
"dependencies": {},
"url": "https://packages-v2-staging.unity.com"
},
"nuget.moq": {
"version": "1.0.0",
"depth": 1,
"source": "registry",
"dependencies": {
"nuget.castle-core": "1.0.1"
},
"url": "https://packages-v2-staging.unity.com"
},
"com.unity.modules.ai": {
"version": "1.0.0",

11
ProjectSettings/ProjectSettings.asset


webGLLinkerTarget: 1
webGLThreadsSupport: 0
webGLDecompressionFallback: 0
scriptingDefineSymbols:
1: AUTHENTICATION_TESTING_STAGING_UAS
scriptingDefineSymbols: {}
additionalCompilerArguments: {}
platformArchitecture: {}
scriptingBackend: {}

XboxOneOverrideIdentityPublisher:
vrEditorSettings: {}
cloudServicesEnabled:
Analytics: 0
Analytics: 1
Build: 0
Collab: 0
Game Performance: 0

m_VersionName:
apiCompatibilityLevel: 6
activeInputHandler: 0
cloudProjectId: d8db80a5-219b-481e-9d1a-d0537563ead1
cloudProjectId: 0bf0426b-e1fd-4251-82d0-3eea033ef1ad
projectName: com.unity.services.samples.lobby-rooms-staging
organizationId: natebuckunity
projectName: com.unity.services.samples.lobby-rooms
organizationId: operate-samples
cloudEnabled: 0
legacyClampBlendShapeWeights: 0
virtualTexturingSupportEnabled: 0

4
ProjectSettings/ProjectVersion.txt


m_EditorVersion: 2021.2.0a15
m_EditorVersionWithRevision: 2021.2.0a15 (37767e16dc73)
m_EditorVersion: 2021.2.0b1
m_EditorVersionWithRevision: 2021.2.0b1 (b0978dae4864)

4
ProjectSettings/UnityConnectSettings.asset


UnityConnectSettings:
m_ObjectHideFlags: 0
serializedVersion: 1
m_Enabled: 0
m_Enabled: 1
m_TestMode: 0
m_EventOldUrl: https://api.uca.cloud.unity3d.com/v1/events
m_EventUrl: https://cdp.cloud.unity3d.com/v1/events

m_Enabled: 0
m_TestMode: 0
UnityAnalyticsSettings:
m_Enabled: 0
m_Enabled: 1
m_TestMode: 0
m_InitializeOnStartup: 1
UnityAdsSettings:

67
.gitignore


# This .gitignore file should be placed at the root of your Unity project directory
#
# Get latest from https://github.com/github/gitignore/blob/master/Unity.gitignore
#
[Ll]ibrary/
[Tt]emp/
[Oo]bj/
[Bb]uild/
[Bb]uilds/
[Ll]ogs/
[Mm]emoryCaptures/
# Never ignore Asset meta data
!/[Aa]ssets/**/*.meta
# Uncomment this line if you wish to ignore the asset store tools plugin
# /[Aa]ssets/AssetStoreTools*
# Autogenerated Jetbrains Rider plugin
[Aa]ssets/Plugins/Editor/JetBrains*
# Visual Studio cache directory
.vs/
# Gradle cache directory
.gradle/
# Autogenerated VS/MD/Consulo solution and project files
ExportedObj/
.consulo/
*.csproj
*.unityproj
*.sln
*.suo
*.tmp
*.user
*.userprefs
*.pidb
*.booproj
*.svd
*.pdb
*.mdb
*.opendb
*.VC.db
# Unity3D generated meta files
*.pidb.meta
*.pdb.meta
*.mdb.meta
# Unity3D generated file on crash reports
sysinfo.txt
# Builds
*.apk
*.unitypackage
#Maya crap
.mayaSwatches
# Crashlytics generated file
crashlytics-build.properties
.plastic
.plastic/
.idea
.idea/

8
Assets/Art.meta


fileFormatVersion: 2
guid: 123bc9f9b2aefd849884af50d9922749
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

273
Assets/Prefabs/UI/CountDownUI.prefab


%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!1 &5694388898566309151
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 2473738857440996537}
- component: {fileID: 9125082141416656856}
- component: {fileID: 288221731430065532}
- component: {fileID: 1604604243888226905}
- component: {fileID: 1102405501498744344}
- component: {fileID: 3702758058023689559}
m_Layer: 5
m_Name: CountDownUI
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &2473738857440996537
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5694388898566309151}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children:
- {fileID: 2508362878409625140}
m_Father: {fileID: 0}
m_RootOrder: 0
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 1, y: 1}
m_AnchoredPosition: {x: 0, y: -77.436}
m_SizeDelta: {x: -50, y: -404.7342}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &9125082141416656856
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5694388898566309151}
m_CullTransparentMesh: 1
--- !u!114 &288221731430065532
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5694388898566309151}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 5b3b588e7ae40ec4ca35fdb9404513ab, type: 3}
m_Name:
m_EditorClassIdentifier:
m_onVisibilityChange:
m_PersistentCalls:
m_Calls: []
showing: 0
m_CountDownText: {fileID: 6871324529924300226}
--- !u!114 &1604604243888226905
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5694388898566309151}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: f38cf340acfcd4c64a6968b7386ad570, type: 3}
m_Name:
m_EditorClassIdentifier:
m_onVisibilityChange:
m_PersistentCalls:
m_Calls: []
showing: 0
m_ShowThisWhen: 2
--- !u!114 &1102405501498744344
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5694388898566309151}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 70dfc2fde0a9ef04eaff29a138f0bf45, type: 3}
m_Name:
m_EditorClassIdentifier:
OnObservedUpdated:
m_PersistentCalls:
m_Calls:
- m_Target: {fileID: 288221731430065532}
m_TargetAssemblyTypeName: CountdownUI, LobbyRooms
m_MethodName: ObservedUpdated
m_Mode: 0
m_Arguments:
m_ObjectArgument: {fileID: 0}
m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine
m_IntArgument: 0
m_FloatArgument: 0
m_StringArgument:
m_BoolArgument: 0
m_CallState: 2
- m_Target: {fileID: 1604604243888226905}
m_TargetAssemblyTypeName: LobbyRooms.UI.LobbyStateVisibilityUI, LobbyRooms
m_MethodName: ObservedUpdated
m_Mode: 0
m_Arguments:
m_ObjectArgument: {fileID: 0}
m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine
m_IntArgument: 0
m_FloatArgument: 0
m_StringArgument:
m_BoolArgument: 0
m_CallState: 2
observeOnStart: 0
--- !u!225 &3702758058023689559
CanvasGroup:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5694388898566309151}
m_Enabled: 1
m_Alpha: 1
m_Interactable: 1
m_BlocksRaycasts: 1
m_IgnoreParentGroups: 0
--- !u!1 &6120000553027287259
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 2508362878409625140}
- component: {fileID: 3642688559417843241}
- component: {fileID: 6871324529924300226}
m_Layer: 5
m_Name: CountdownText
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &2508362878409625140
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6120000553027287259}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 2473738857440996537}
m_RootOrder: 0
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 1, y: 1}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 0, y: 0}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &3642688559417843241
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6120000553027287259}
m_CullTransparentMesh: 1
--- !u!114 &6871324529924300226
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6120000553027287259}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 0}
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_text: 'Starting in:'
m_isRightToLeft: 0
m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
m_fontSharedMaterials: []
m_fontMaterial: {fileID: 0}
m_fontMaterials: []
m_fontColor32:
serializedVersion: 2
rgba: 4294967295
m_fontColor: {r: 1, g: 1, b: 1, a: 1}
m_enableVertexGradient: 0
m_colorMode: 3
m_fontColorGradient:
topLeft: {r: 1, g: 1, b: 1, a: 1}
topRight: {r: 1, g: 1, b: 1, a: 1}
bottomLeft: {r: 1, g: 1, b: 1, a: 1}
bottomRight: {r: 1, g: 1, b: 1, a: 1}
m_fontColorGradientPreset: {fileID: 0}
m_spriteAsset: {fileID: 0}
m_tintAllSprites: 0
m_StyleSheet: {fileID: 0}
m_TextStyleHashCode: -1183493901
m_overrideHtmlColors: 0
m_faceColor:
serializedVersion: 2
rgba: 4294967295
m_fontSize: 21
m_fontSizeBase: 36
m_fontWeight: 400
m_enableAutoSizing: 1
m_fontSizeMin: 18
m_fontSizeMax: 21
m_fontStyle: 0
m_HorizontalAlignment: 1
m_VerticalAlignment: 512
m_textAlignment: 65535
m_characterSpacing: 0
m_wordSpacing: 0
m_lineSpacing: 0
m_lineSpacingMax: 0
m_paragraphSpacing: 0
m_charWidthMaxAdj: 0
m_enableWordWrapping: 1
m_wordWrappingRatios: 0.4
m_overflowMode: 0
m_linkedTextComponent: {fileID: 0}
parentLinkedComponent: {fileID: 0}
m_enableKerning: 1
m_enableExtraPadding: 0
checkPaddingRequired: 0
m_isRichText: 1
m_parseCtrlCharacters: 1
m_isOrthographic: 1
m_isCullingEnabled: 0
m_horizontalMapping: 0
m_verticalMapping: 0
m_uvLineOffset: 0
m_geometrySortingOrder: 0
m_IsTextObjectScaleStatic: 0
m_VertexBufferAutoSizeReduction: 0
m_useMaxVisibleDescender: 1
m_pageToDisplay: 1
m_margin: {x: 5, y: 5, z: 5, w: 5}
m_isUsingLegacyAnimationComponent: 0
m_isVolumetricText: 0
m_hasFontAssetChanged: 0
m_baseMaterial: {fileID: 0}
m_maskOffset: {x: 0, y: 0, z: 0, w: 0}

7
Assets/Prefabs/UI/CountDownUI.prefab.meta


fileFormatVersion: 2
guid: f90e4035352c7ce40b68e50109a9bb4f
PrefabImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

1001
Assets/Prefabs/UI/LobbyUserList.prefab
文件差异内容过多而无法显示
查看文件

568
Assets/Prefabs/UI/SpinnerUI.prefab


%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!1 &1256834224708745402
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 8845592316474837655}
- component: {fileID: 1432688179978162209}
- component: {fileID: 7859013680193933450}
- component: {fileID: 4194466567228727858}
- component: {fileID: 8041986936720407558}
m_Layer: 5
m_Name: ErrorText
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &8845592316474837655
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1256834224708745402}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 8141644855275361747}
m_RootOrder: 1
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0.5, y: 0.5}
m_AnchorMax: {x: 0.5, y: 0.5}
m_AnchoredPosition: {x: 0, y: -75}
m_SizeDelta: {x: 300, y: 50}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &1432688179978162209
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1256834224708745402}
m_CullTransparentMesh: 1
--- !u!114 &7859013680193933450
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1256834224708745402}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 0}
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_text: 'Error:'
m_isRightToLeft: 0
m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
m_fontSharedMaterials: []
m_fontMaterial: {fileID: 0}
m_fontMaterials: []
m_fontColor32:
serializedVersion: 2
rgba: 4282729983
m_fontColor: {r: 1, g: 0.2688679, b: 0.2688679, a: 1}
m_enableVertexGradient: 0
m_colorMode: 3
m_fontColorGradient:
topLeft: {r: 1, g: 1, b: 1, a: 1}
topRight: {r: 1, g: 1, b: 1, a: 1}
bottomLeft: {r: 1, g: 1, b: 1, a: 1}
bottomRight: {r: 1, g: 1, b: 1, a: 1}
m_fontColorGradientPreset: {fileID: 0}
m_spriteAsset: {fileID: 0}
m_tintAllSprites: 0
m_StyleSheet: {fileID: 0}
m_TextStyleHashCode: -1183493901
m_overrideHtmlColors: 0
m_faceColor:
serializedVersion: 2
rgba: 4294967295
m_fontSize: 22
m_fontSizeBase: 36
m_fontWeight: 400
m_enableAutoSizing: 1
m_fontSizeMin: 12
m_fontSizeMax: 22
m_fontStyle: 0
m_HorizontalAlignment: 2
m_VerticalAlignment: 256
m_textAlignment: 65535
m_characterSpacing: 0
m_wordSpacing: 0
m_lineSpacing: 0
m_lineSpacingMax: 0
m_paragraphSpacing: 0
m_charWidthMaxAdj: 0
m_enableWordWrapping: 1
m_wordWrappingRatios: 0.4
m_overflowMode: 0
m_linkedTextComponent: {fileID: 0}
parentLinkedComponent: {fileID: 0}
m_enableKerning: 1
m_enableExtraPadding: 0
checkPaddingRequired: 0
m_isRichText: 1
m_parseCtrlCharacters: 1
m_isOrthographic: 1
m_isCullingEnabled: 0
m_horizontalMapping: 0
m_verticalMapping: 0
m_uvLineOffset: 0
m_geometrySortingOrder: 0
m_IsTextObjectScaleStatic: 0
m_VertexBufferAutoSizeReduction: 0
m_useMaxVisibleDescender: 1
m_pageToDisplay: 1
m_margin: {x: 0, y: 0, z: 0, w: 0}
m_isUsingLegacyAnimationComponent: 0
m_isVolumetricText: 0
m_hasFontAssetChanged: 0
m_baseMaterial: {fileID: 0}
m_maskOffset: {x: 0, y: 0, z: 0, w: 0}
--- !u!225 &4194466567228727858
CanvasGroup:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1256834224708745402}
m_Enabled: 1
m_Alpha: 0
m_Interactable: 0
m_BlocksRaycasts: 0
m_IgnoreParentGroups: 0
--- !u!114 &8041986936720407558
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1256834224708745402}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: ab355d5994635724dbde297a055fb586, type: 3}
m_Name:
m_EditorClassIdentifier:
m_onVisibilityChange:
m_PersistentCalls:
m_Calls: []
showing: 0
--- !u!1 &3885698492068079262
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 2952266133262597715}
- component: {fileID: 6343008175747624988}
- component: {fileID: 3328931846061827219}
- component: {fileID: 7708916085883345062}
- component: {fileID: 50617661778815274}
m_Layer: 5
m_Name: SpinnerImage
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &2952266133262597715
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3885698492068079262}
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 8141644855275361747}
m_RootOrder: 0
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0.5, y: 0.5}
m_AnchorMax: {x: 0.5, y: 0.5}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 100, y: 100}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &6343008175747624988
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3885698492068079262}
m_CullTransparentMesh: 1
--- !u!114 &3328931846061827219
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3885698492068079262}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 0}
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_Sprite: {fileID: 21300000, guid: 7eb43e8205c10c846b4243bb963f4aa4, type: 3}
m_Type: 0
m_PreserveAspect: 0
m_FillCenter: 1
m_FillMethod: 4
m_FillAmount: 1
m_FillClockwise: 1
m_FillOrigin: 0
m_UseSpriteMesh: 0
m_PixelsPerUnitMultiplier: 1
--- !u!225 &7708916085883345062
CanvasGroup:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3885698492068079262}
m_Enabled: 1
m_Alpha: 1
m_Interactable: 1
m_BlocksRaycasts: 1
m_IgnoreParentGroups: 0
--- !u!114 &50617661778815274
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3885698492068079262}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: ab355d5994635724dbde297a055fb586, type: 3}
m_Name:
m_EditorClassIdentifier:
m_onVisibilityChange:
m_PersistentCalls:
m_Calls: []
showing: 0
--- !u!1 &5113050813143078450
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 3762085718257779991}
- component: {fileID: 3237472603761236039}
- component: {fileID: 4465921850208724247}
- component: {fileID: 2807560142073425131}
- component: {fileID: 1576294672583716881}
m_Layer: 5
m_Name: EmptyText
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &3762085718257779991
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5113050813143078450}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 8141644855275361747}
m_RootOrder: 2
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0.5, y: 0.5}
m_AnchorMax: {x: 0.5, y: 0.5}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 400, y: 50}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &3237472603761236039
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5113050813143078450}
m_CullTransparentMesh: 1
--- !u!114 &4465921850208724247
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5113050813143078450}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 0}
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_text: No Servers Found.
m_isRightToLeft: 0
m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
m_fontSharedMaterials: []
m_fontMaterial: {fileID: 0}
m_fontMaterials: []
m_fontColor32:
serializedVersion: 2
rgba: 4280558628
m_fontColor: {r: 0.14150941, g: 0.14150941, b: 0.14150941, a: 1}
m_enableVertexGradient: 0
m_colorMode: 3
m_fontColorGradient:
topLeft: {r: 1, g: 1, b: 1, a: 1}
topRight: {r: 1, g: 1, b: 1, a: 1}
bottomLeft: {r: 1, g: 1, b: 1, a: 1}
bottomRight: {r: 1, g: 1, b: 1, a: 1}
m_fontColorGradientPreset: {fileID: 0}
m_spriteAsset: {fileID: 0}
m_tintAllSprites: 0
m_StyleSheet: {fileID: 0}
m_TextStyleHashCode: -1183493901
m_overrideHtmlColors: 0
m_faceColor:
serializedVersion: 2
rgba: 4294967295
m_fontSize: 22
m_fontSizeBase: 36
m_fontWeight: 400
m_enableAutoSizing: 1
m_fontSizeMin: 12
m_fontSizeMax: 22
m_fontStyle: 0
m_HorizontalAlignment: 2
m_VerticalAlignment: 512
m_textAlignment: 65535
m_characterSpacing: 0
m_wordSpacing: 0
m_lineSpacing: 0
m_lineSpacingMax: 0
m_paragraphSpacing: 0
m_charWidthMaxAdj: 0
m_enableWordWrapping: 1
m_wordWrappingRatios: 0.4
m_overflowMode: 0
m_linkedTextComponent: {fileID: 0}
parentLinkedComponent: {fileID: 0}
m_enableKerning: 1
m_enableExtraPadding: 0
checkPaddingRequired: 0
m_isRichText: 1
m_parseCtrlCharacters: 1
m_isOrthographic: 1
m_isCullingEnabled: 0
m_horizontalMapping: 0
m_verticalMapping: 0
m_uvLineOffset: 0
m_geometrySortingOrder: 0
m_IsTextObjectScaleStatic: 0
m_VertexBufferAutoSizeReduction: 0
m_useMaxVisibleDescender: 1
m_pageToDisplay: 1
m_margin: {x: 0, y: 0, z: 0, w: 0}
m_isUsingLegacyAnimationComponent: 0
m_isVolumetricText: 0
m_hasFontAssetChanged: 0
m_baseMaterial: {fileID: 0}
m_maskOffset: {x: 0, y: 0, z: 0, w: 0}
--- !u!225 &2807560142073425131
CanvasGroup:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5113050813143078450}
m_Enabled: 1
m_Alpha: 0
m_Interactable: 0
m_BlocksRaycasts: 0
m_IgnoreParentGroups: 0
--- !u!114 &1576294672583716881
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5113050813143078450}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: ab355d5994635724dbde297a055fb586, type: 3}
m_Name:
m_EditorClassIdentifier:
m_onVisibilityChange:
m_PersistentCalls:
m_Calls: []
showing: 0
--- !u!1 &7144088886657378797
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 8141644855275361747}
- component: {fileID: 8024795096463497524}
- component: {fileID: 6317050540274997421}
- component: {fileID: 2592976293271768794}
- component: {fileID: 7469848848124085693}
- component: {fileID: 3773418773225383442}
m_Layer: 5
m_Name: SpinnerUI
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &8141644855275361747
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 7144088886657378797}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children:
- {fileID: 2952266133262597715}
- {fileID: 8845592316474837655}
- {fileID: 3762085718257779991}
m_Father: {fileID: 0}
m_RootOrder: 0
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0.5, y: 0.5}
m_AnchorMax: {x: 0.5, y: 0.5}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 100, y: 100}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &8024795096463497524
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 7144088886657378797}
m_CullTransparentMesh: 1
--- !u!114 &6317050540274997421
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 7144088886657378797}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: e4af858941d9d1f418a84e8f0ff6085c, type: 3}
m_Name:
m_EditorClassIdentifier:
m_onVisibilityChange:
m_PersistentCalls:
m_Calls: []
showing: 0
errorText: {fileID: 7859013680193933450}
spinnerImage: {fileID: 50617661778815274}
noServerText: {fileID: 1576294672583716881}
errorTextVisibility: {fileID: 8041986936720407558}
--- !u!114 &2592976293271768794
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 7144088886657378797}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: edfa4d53eaae84c43ba581088940700c, type: 3}
m_Name:
m_EditorClassIdentifier:
OnObservedUpdated:
m_PersistentCalls:
m_Calls:
- m_Target: {fileID: 6317050540274997421}
m_TargetAssemblyTypeName: LobbyRooms.UI.SpinnerUI, Assembly-CSharp
m_MethodName: ObservedUpdated
m_Mode: 0
m_Arguments:
m_ObjectArgument: {fileID: 0}
m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine
m_IntArgument: 0
m_FloatArgument: 0
m_StringArgument:
m_BoolArgument: 0
m_CallState: 2
--- !u!95 &7469848848124085693
Animator:
serializedVersion: 3
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 7144088886657378797}
m_Enabled: 1
m_Avatar: {fileID: 0}
m_Controller: {fileID: 9100000, guid: 12ca31314ac02d24c9fac9beff769388, type: 2}
m_CullingMode: 0
m_UpdateMode: 0
m_ApplyRootMotion: 0
m_LinearVelocityBlending: 0
m_WarningMessage:
m_HasTransformHierarchy: 1
m_AllowConstantClipSamplingOptimization: 1
m_KeepAnimatorControllerStateOnDisable: 0
--- !u!225 &3773418773225383442
CanvasGroup:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 7144088886657378797}
m_Enabled: 1
m_Alpha: 1
m_Interactable: 1
m_BlocksRaycasts: 1
m_IgnoreParentGroups: 0

7
Assets/Prefabs/UI/SpinnerUI.prefab.meta


fileFormatVersion: 2
guid: c9b04951bd45e154b8096955d9bc8a0b
PrefabImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

19
Assets/Scripts/UI/CountdownUI.cs


using System;
using System.Collections;
using LobbyRooms;
using LobbyRooms.UI;
using TMPro;
using UnityEngine;
public class CountdownUI : ObserverPanel<LobbyData>
{
[SerializeField]
TMP_Text m_CountDownText;
public override void ObservedUpdated(LobbyData observed)
{
if (observed.CountDownTime <= 0)
return;
m_CountDownText.SetText($"Starting in: {observed.CountDownTime}");
}
}

15
Assets/Scripts/UI/EndGameButtonUI.cs


using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Utilities;
namespace LobbyRooms.UI
{
public class EndGameButtonUI : MonoBehaviour
{
public void EndServer()
{
Locator.Get.Messenger.OnReceiveMessage(MessageType.ToLobby, null);
}
}
}

14
Assets/Scripts/UI/ExitButtonUI.cs


using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace LobbyRooms.UI
{
public class ExitButtonUI : MonoBehaviour
{
public void OnExitButton()
{
Application.Quit();
}
}
}

11
Assets/Scripts/UI/ExitButtonUI.cs.meta


fileFormatVersion: 2
guid: 7a8d936c1e569c84ab12655041cb57ba
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

19
Assets/Scripts/UI/LobbyStateVisibilityUI.cs


using UnityEngine;
namespace LobbyRooms.UI
{
public class LobbyStateVisibilityUI : ObserverPanel<LobbyData>
{
[SerializeField]
private LobbyState m_ShowThisWhen;
public override void ObservedUpdated(LobbyData observed)
{
if (m_ShowThisWhen.HasFlag(observed.State))
Show();
else
Hide();
}
}
}

11
Assets/Scripts/UI/LobbyStateVisibilityUI.cs.meta


fileFormatVersion: 2
guid: f38cf340acfcd4c64a6968b7386ad570
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

70
Assets/Scripts/UI/LobbyUserCardUI.cs


using Player;
using TMPro;
using UnityEngine;
namespace LobbyRooms.UI
{
/// <summary>
/// Shows the player info in-lobby and game
/// </summary>
[RequireComponent(typeof(LobbyUserObserver))]
public class LobbyUserCardUI : ObserverPanel<LobbyUser>
{
[SerializeField]
TMP_Text m_DisplayNameText;
[SerializeField]
TMP_Text m_StatusText;
[SerializeField]
TMP_Text m_EmoteText;
public bool IsAssigned
{
get { return UserId != null; }
}
public string UserId { get; private set; }
private LobbyUserObserver m_observer;
public void SetUser(LobbyUser myLobbyUser)
{
Show();
if (m_observer == null)
m_observer = GetComponent<LobbyUserObserver>();
m_observer.BeginObserving(myLobbyUser);
UserId = myLobbyUser.ID;
}
public void OnUserLeft()
{
UserId = null;
Hide();
m_observer.EndObserving();
}
public override void ObservedUpdated(LobbyUser observed)
{
m_DisplayNameText.SetText(observed.DisplayName);
m_StatusText.SetText(SetStatusFancy(observed.UserStatus));
m_EmoteText.SetText(observed.Emote);
}
string SetStatusFancy(UserStatus status)
{
switch (status)
{
case UserStatus.Lobby:
return "<color=#56B4E9>Lobby.</color>"; // Light Blue
case UserStatus.Ready:
return "<color=#009E73>Ready!</color>"; // Light Mint
case UserStatus.Connecting:
return "<color=#F0E442>Connecting.</color>"; // Bright Yellow
case UserStatus.Connected:
return "<color=#005500>Connected.</color>"; //Orange
default:
return "<color=#56B4E9>In Lobby.</color>";
}
}
}
}

65
Assets/Scripts/UI/LobbyUsersUI.cs


using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Serialization;
namespace LobbyRooms.UI
{
/// <summary>
/// Watches for changes in the Lobby's player List
/// </summary>
[RequireComponent(typeof(LobbyDataObserver))]
public class LobbyUsersUI : ObserverPanel<LobbyData>
{
[SerializeField]
List<LobbyUserCardUI> m_PlayerCardSlots = new List<LobbyUserCardUI>();
List<string> m_CurrentUsers = new List<string>(); // Just for keeping track more easily of which users are already displayed.
/// <summary>
/// When the observed data updates, we need to detect changes to the list of players.
/// </summary>
public override void ObservedUpdated(LobbyData observed)
{
// if (observed.PlayerCount == m_CurrentUsers.Count) // TODO: Not a 100% accurate shorthand.
// return;
for (int id = m_CurrentUsers.Count - 1; id >= 0; id--) // We might remove users if they aren't in the new data, so iterate backwards.
{
string userId = m_CurrentUsers[id];
if (!observed.LobbyUsers.ContainsKey(userId))
{
foreach (var card in m_PlayerCardSlots)
{
if (card.UserId == userId)
{
card.OnUserLeft();
OnUserLeft(userId);
}
}
}
}
foreach (var lobbyUserKvp in observed.LobbyUsers) // If there are new players, we need to hook them into the UI.
{
if (m_CurrentUsers.Contains(lobbyUserKvp.Key))
continue;
m_CurrentUsers.Add(lobbyUserKvp.Key);
foreach (var pcu in m_PlayerCardSlots)
{
if (pcu.IsAssigned)
continue;
pcu.SetUser(lobbyUserKvp.Value);
break;
}
}
}
void OnUserLeft(string userID)
{
if (!m_CurrentUsers.Contains(userID))
return;
m_CurrentUsers.Remove(userID);
}
}
}

23
Assets/Scripts/UI/ReadyCheckUI.cs


using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Utilities;
namespace LobbyRooms.UI
{
public class ReadyCheckUI : MonoBehaviour
{
public void OnReadyButton()
{
ChangeState(UserStatus.Ready);
}
public void OnCancelButton()
{
ChangeState(UserStatus.Lobby);
}
private void ChangeState(UserStatus status)
{
Locator.Get.Messenger.OnReceiveMessage(MessageType.ChangeLobbyUserState, status);
}
}
}

52
Assets/Scripts/UI/SpinnerUI.cs


using System.Text;
using TMPro;
using UnityEngine;
using UnityEngine.Serialization;
namespace LobbyRooms.UI
{
public class SpinnerUI : ObserverPanel<LobbyServiceData>
{
public TMP_Text errorText;
public UIPanelBase spinnerImage;
public UIPanelBase noServerText;
public UIPanelBase errorTextVisibility;
public override void ObservedUpdated(LobbyServiceData observed)
{
if (observed.State == LobbyServiceState.Fetching)
{
Show();
spinnerImage.Show();
noServerText.Hide();
errorTextVisibility.Hide();
}
else if (observed.State == LobbyServiceState.Error)
{
spinnerImage.Hide();
errorTextVisibility.Show();
var errorString = new StringBuilder();
errorString.Append("Error");
var codeString = ": " + observed.lastErrorCode;
if (observed.lastErrorCode < 1)
codeString = ".";
errorString.Append(codeString);
errorText.SetText(errorString.ToString());
}
else if (observed.State == LobbyServiceState.Fetched)
{
if (observed.CurrentLobbies.Count < 1)
{
noServerText.Show();
}
else
{
noServerText.Hide();
}
spinnerImage.Hide();
}
}
}
}

11
Assets/Scripts/UI/SpinnerUI.cs.meta


fileFormatVersion: 2
guid: e4af858941d9d1f418a84e8f0ff6085c
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

15
Assets/Scripts/UI/StartLobbyButton.cs


using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Utilities;
namespace LobbyRooms
{
public class StartLobbyButton : MonoBehaviour
{
public void ToJoinMenu()
{
Locator.Get.Messenger.OnReceiveMessage(MessageType.ChangeGameState, GameState.JoinMenu);
}
}
}

11
Assets/Scripts/UI/StartLobbyButton.cs.meta


fileFormatVersion: 2
guid: 507533c9939ee6f4abe2b70c9c1eae43
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

73
Assets/Scripts/Utilities/NameGenerator.cs


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Utilities
{
/// <summary>
/// Just for fun, give a cute default name if no name is provided.
/// </summary>
public static class NameGenerator
{
public static string GetName(string userId)
{
int seed = userId.GetHashCode();
seed *= Math.Sign(seed);
StringBuilder nameOutput = new StringBuilder();
#region Word part
int word = seed % 22;
if (word == 0) // Note that some more data-driven approach would be better.
nameOutput.Append("Ant");
else if (word == 1)
nameOutput.Append("Bear");
else if (word == 2)
nameOutput.Append("Cow");
else if (word == 3)
nameOutput.Append("Dog");
else if (word == 4)
nameOutput.Append("Eel");
else if (word == 5)
nameOutput.Append("Frog");
else if (word == 6)
nameOutput.Append("Gopher");
else if (word == 7)
nameOutput.Append("Heron");
else if (word == 8)
nameOutput.Append("Ibex");
else if (word == 9)
nameOutput.Append("Jerboa");
else if (word == 10)
nameOutput.Append("Koala");
else if (word == 11)
nameOutput.Append("Llama");
else if (word == 12)
nameOutput.Append("Moth");
else if (word == 13)
nameOutput.Append("Newt");
else if (word == 14)
nameOutput.Append("Owl");
else if (word == 15)
nameOutput.Append("Puffin");
else if (word == 16)
nameOutput.Append("Raven");
else if (word == 17)
nameOutput.Append("Snake");
else if (word == 18)
nameOutput.Append("Trout");
else if (word == 19)
nameOutput.Append("Vulture");
else if (word == 20)
nameOutput.Append("Wolf");
else
nameOutput.Append("Zebra");
#endregion
int number = seed % 1000;
nameOutput.Append(number.ToString("000"));
return nameOutput.ToString();
}
}
}

11
Assets/Scripts/Utilities/NameGenerator.cs.meta


fileFormatVersion: 2
guid: 064df57c398256e4e8fbd3c43df26118
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

8
Assets/StreamingAssets.meta


fileFormatVersion: 2
guid: 93006e6c7cc88684f968141b0e6c16c7
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

16
ProjectSettings/BurstAotSettings_StandaloneWindows.json


{
"MonoBehaviour": {
"Version": 3,
"EnableBurstCompilation": true,
"EnableOptimisations": true,
"EnableSafetyChecks": false,
"EnableDebugInAllBuilds": false,
"UsePlatformSDKLinker": false,
"CpuMinTargetX32": 0,
"CpuMaxTargetX32": 0,
"CpuMinTargetX64": 0,
"CpuMaxTargetX64": 0,
"CpuTargetsX32": 6,
"CpuTargetsX64": 72
}
}

6
ProjectSettings/CommonBurstAotSettings.json


{
"MonoBehaviour": {
"Version": 3,
"DisabledWarnings": ""
}
}

35
ProjectSettings/MemorySettings.asset


%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!387306366 &1
MemorySettings:
m_ObjectHideFlags: 0
m_EditorMemorySettings:
m_MainAllocatorBlockSize: -1
m_ThreadAllocatorBlockSize: -1
m_MainGfxBlockSize: -1
m_ThreadGfxBlockSize: -1
m_CacheBlockSize: -1
m_TypetreeBlockSize: -1
m_ProfilerBlockSize: -1
m_ProfilerEditorBlockSize: -1
m_BucketAllocatorGranularity: -1
m_BucketAllocatorBucketsCount: -1
m_BucketAllocatorBlockSize: -1
m_BucketAllocatorBlockCount: -1
m_ProfilerBucketAllocatorGranularity: -1
m_ProfilerBucketAllocatorBucketsCount: -1
m_ProfilerBucketAllocatorBlockSize: -1
m_ProfilerBucketAllocatorBlockCount: -1
m_TempAllocatorSizeMain: -1
m_JobTempAllocatorBlockSize: -1
m_BackgroundJobTempAllocatorBlockSize: -1
m_JobTempAllocatorReducedBlockSize: -1
m_TempAllocatorSizeGIBakingWorker: -1
m_TempAllocatorSizeNavMeshWorker: -1
m_TempAllocatorSizeAudioWorker: -1
m_TempAllocatorSizeCloudWorker: -1
m_TempAllocatorSizeGfx: -1
m_TempAllocatorSizeJobWorker: -1
m_TempAllocatorSizeBackgroundWorker: -1
m_TempAllocatorSizePreloadManager: -1
m_PlatformMemorySettings: {}

0
ProjectSettings/boot.config

8
Assets/Art/Spinner.meta


fileFormatVersion: 2
guid: b58b3305a26c4764591529bfe1f064c3
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

40
Assets/Art/Spinner/Spinner.png

之前 之后
宽度: 300  |  高度: 300  |  大小: 7.2 KiB

97
Assets/Art/Spinner/Spinner.png.meta


fileFormatVersion: 2
guid: 7eb43e8205c10c846b4243bb963f4aa4
TextureImporter:
internalIDToNameTable: []
externalObjects: {}
serializedVersion: 11
mipmaps:
mipMapMode: 0
enableMipMap: 0
sRGBTexture: 1
linearTexture: 0
fadeOut: 0
borderMipMap: 0
mipMapsPreserveCoverage: 0
alphaTestReferenceValue: 0.5
mipMapFadeDistanceStart: 1
mipMapFadeDistanceEnd: 3
bumpmap:
convertToNormalMap: 0
externalNormalMap: 0
heightScale: 0.25
normalMapFilter: 0
isReadable: 0
streamingMipmaps: 0
streamingMipmapsPriority: 0
vTOnly: 0
grayScaleToAlpha: 0
generateCubemap: 6
cubemapConvolution: 0
seamlessCubemap: 0
textureFormat: 1
maxTextureSize: 2048
textureSettings:
serializedVersion: 2
filterMode: 1
aniso: 1
mipBias: 0
wrapU: 1
wrapV: 1
wrapW: 1
nPOTScale: 0
lightmap: 0
compressionQuality: 50
spriteMode: 1
spriteExtrude: 1
spriteMeshType: 1
alignment: 0
spritePivot: {x: 0.5, y: 0.5}
spritePixelsToUnits: 100
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
spriteGenerateFallbackPhysicsShape: 1
alphaUsage: 1
alphaIsTransparency: 1
spriteTessellationDetail: -1
textureType: 8
textureShape: 1
singleChannelComponent: 0
flipbookRows: 1
flipbookColumns: 1
maxTextureSizeSet: 0
compressionQualitySet: 0
textureFormatSet: 0
ignorePngGamma: 0
applyGammaDecoding: 0
platformSettings:
- serializedVersion: 3
buildTarget: DefaultTexturePlatform
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
spriteSheet:
serializedVersion: 2
sprites: []
outline: []
physicsShape: []
bones: []
spriteID: 5e97eb03825dee720800000000000000
internalID: 0
vertices: []
indices:
edges: []
weights: []
secondaryTextures: []
nameFileIdTable: {}
spritePackingTag:
pSDRemoveMatte: 0
pSDShowRemoveMatteOption: 0
userData:
assetBundleName:
assetBundleVariant:

306
Assets/Art/Spinner/SpinnerController.controller


%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!1102 &-8227511378914398008
AnimatorState:
serializedVersion: 6
m_ObjectHideFlags: 1
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: Pause
m_Speed: 1
m_CycleOffset: 0
m_Transitions:
- {fileID: -8120510241330444836}
m_StateMachineBehaviours: []
m_Position: {x: 50, y: 50, z: 0}
m_IKOnFeet: 0
m_WriteDefaultValues: 1
m_Mirror: 0
m_SpeedParameterActive: 0
m_MirrorParameterActive: 0
m_CycleOffsetParameterActive: 0
m_TimeParameterActive: 0
m_Motion: {fileID: 7400000, guid: fef7968afddaa344fb658282f7ec64b0, type: 2}
m_Tag:
m_SpeedParameter:
m_MirrorParameter:
m_CycleOffsetParameter:
m_TimeParameter:
--- !u!1101 &-8120510241330444836
AnimatorStateTransition:
m_ObjectHideFlags: 1
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name:
m_Conditions:
- m_ConditionMode: 1
m_ConditionEvent: Spinning
m_EventTreshold: 0
m_DstStateMachine: {fileID: 0}
m_DstState: {fileID: 8275329687920695311}
m_Solo: 0
m_Mute: 0
m_IsExit: 0
serializedVersion: 3
m_TransitionDuration: 0
m_TransitionOffset: 0
m_ExitTime: 0
m_HasExitTime: 1
m_HasFixedDuration: 1
m_InterruptionSource: 0
m_OrderedInterruption: 1
m_CanTransitionToSelf: 1
--- !u!1101 &-7244168724185863680
AnimatorStateTransition:
m_ObjectHideFlags: 1
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name:
m_Conditions:
- m_ConditionMode: 2
m_ConditionEvent: Spinning
m_EventTreshold: 0
m_DstStateMachine: {fileID: 0}
m_DstState: {fileID: -8227511378914398008}
m_Solo: 0
m_Mute: 0
m_IsExit: 0
serializedVersion: 3
m_TransitionDuration: 0
m_TransitionOffset: 0
m_ExitTime: 0
m_HasExitTime: 1
m_HasFixedDuration: 1
m_InterruptionSource: 0
m_OrderedInterruption: 1
m_CanTransitionToSelf: 1
--- !u!1101 &-6073023726327908739
AnimatorStateTransition:
m_ObjectHideFlags: 1
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name:
m_Conditions:
- m_ConditionMode: 1
m_ConditionEvent: Error
m_EventTreshold: 0
m_DstStateMachine: {fileID: 0}
m_DstState: {fileID: 2412120046085290492}
m_Solo: 0
m_Mute: 0
m_IsExit: 0
serializedVersion: 3
m_TransitionDuration: 0
m_TransitionOffset: 0
m_ExitTime: 0
m_HasExitTime: 1
m_HasFixedDuration: 1
m_InterruptionSource: 4
m_OrderedInterruption: 1
m_CanTransitionToSelf: 1
--- !u!1107 &-5797106235668173274
AnimatorStateMachine:
serializedVersion: 6
m_ObjectHideFlags: 1
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: ErrorLayer
m_ChildStates:
- serializedVersion: 1
m_State: {fileID: 2412120046085290492}
m_Position: {x: 450, y: 110, z: 0}
- serializedVersion: 1
m_State: {fileID: 1598352576774540682}
m_Position: {x: 450, y: 210, z: 0}
m_ChildStateMachines: []
m_AnyStateTransitions: []
m_EntryTransitions: []
m_StateMachineTransitions: {}
m_StateMachineBehaviours: []
m_AnyStatePosition: {x: 50, y: 20, z: 0}
m_EntryPosition: {x: 50, y: 120, z: 0}
m_ExitPosition: {x: 800, y: 120, z: 0}
m_ParentStateMachinePosition: {x: 800, y: 20, z: 0}
m_DefaultState: {fileID: 2412120046085290492}
--- !u!91 &9100000
AnimatorController:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: SpinnerController
serializedVersion: 5
m_AnimatorParameters:
- m_Name: Spinning
m_Type: 4
m_DefaultFloat: 0
m_DefaultInt: 0
m_DefaultBool: 1
m_Controller: {fileID: 0}
- m_Name: Error
m_Type: 4
m_DefaultFloat: 0
m_DefaultInt: 0
m_DefaultBool: 0
m_Controller: {fileID: 0}
m_AnimatorLayers:
- serializedVersion: 5
m_Name: Base Layer
m_StateMachine: {fileID: 274881663938255016}
m_Mask: {fileID: 0}
m_Motions: []
m_Behaviours: []
m_BlendingMode: 0
m_SyncedLayerIndex: -1
m_DefaultWeight: 0
m_IKPass: 0
m_SyncedLayerAffectsTiming: 0
m_Controller: {fileID: 9100000}
- serializedVersion: 5
m_Name: ErrorLayer
m_StateMachine: {fileID: -5797106235668173274}
m_Mask: {fileID: 0}
m_Motions: []
m_Behaviours: []
m_BlendingMode: 1
m_SyncedLayerIndex: -1
m_DefaultWeight: 1
m_IKPass: 0
m_SyncedLayerAffectsTiming: 0
m_Controller: {fileID: 9100000}
--- !u!1107 &274881663938255016
AnimatorStateMachine:
serializedVersion: 6
m_ObjectHideFlags: 1
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: Base Layer
m_ChildStates:
- serializedVersion: 1
m_State: {fileID: 8275329687920695311}
m_Position: {x: 400, y: 120, z: 0}
- serializedVersion: 1
m_State: {fileID: -8227511378914398008}
m_Position: {x: 400, y: 210, z: 0}
m_ChildStateMachines: []
m_AnyStateTransitions: []
m_EntryTransitions: []
m_StateMachineTransitions: {}
m_StateMachineBehaviours: []
m_AnyStatePosition: {x: 50, y: 20, z: 0}
m_EntryPosition: {x: 50, y: 120, z: 0}
m_ExitPosition: {x: 800, y: 120, z: 0}
m_ParentStateMachinePosition: {x: 800, y: 20, z: 0}
m_DefaultState: {fileID: 8275329687920695311}
--- !u!1102 &1598352576774540682
AnimatorState:
serializedVersion: 6
m_ObjectHideFlags: 1
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: SpinnerStatic
m_Speed: 1
m_CycleOffset: 0
m_Transitions:
- {fileID: -6073023726327908739}
m_StateMachineBehaviours: []
m_Position: {x: 50, y: 50, z: 0}
m_IKOnFeet: 0
m_WriteDefaultValues: 1
m_Mirror: 0
m_SpeedParameterActive: 0
m_MirrorParameterActive: 0
m_CycleOffsetParameterActive: 0
m_TimeParameterActive: 0
m_Motion: {fileID: 7400000, guid: fef7968afddaa344fb658282f7ec64b0, type: 2}
m_Tag:
m_SpeedParameter:
m_MirrorParameter:
m_CycleOffsetParameter:
m_TimeParameter:
--- !u!1102 &2412120046085290492
AnimatorState:
serializedVersion: 6
m_ObjectHideFlags: 1
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: SpinnerError
m_Speed: 1
m_CycleOffset: 0
m_Transitions:
- {fileID: 2963536771589793208}
m_StateMachineBehaviours: []
m_Position: {x: 50, y: 50, z: 0}
m_IKOnFeet: 0
m_WriteDefaultValues: 1
m_Mirror: 0
m_SpeedParameterActive: 0
m_MirrorParameterActive: 0
m_CycleOffsetParameterActive: 0
m_TimeParameterActive: 0
m_Motion: {fileID: 7400000, guid: 8aac3971e57c2a94f8d287084b3b0565, type: 2}
m_Tag:
m_SpeedParameter:
m_MirrorParameter:
m_CycleOffsetParameter:
m_TimeParameter:
--- !u!1101 &2963536771589793208
AnimatorStateTransition:
m_ObjectHideFlags: 1
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name:
m_Conditions:
- m_ConditionMode: 2
m_ConditionEvent: Error
m_EventTreshold: 0
m_DstStateMachine: {fileID: 0}
m_DstState: {fileID: 1598352576774540682}
m_Solo: 0
m_Mute: 0
m_IsExit: 0
serializedVersion: 3
m_TransitionDuration: 0.01
m_TransitionOffset: 0
m_ExitTime: 0.1
m_HasExitTime: 0
m_HasFixedDuration: 0
m_InterruptionSource: 3
m_OrderedInterruption: 1
m_CanTransitionToSelf: 1
--- !u!1102 &8275329687920695311
AnimatorState:
serializedVersion: 6
m_ObjectHideFlags: 1
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: SpinnerUISpin
m_Speed: 1
m_CycleOffset: 0
m_Transitions:
- {fileID: -7244168724185863680}
m_StateMachineBehaviours: []
m_Position: {x: 50, y: 50, z: 0}
m_IKOnFeet: 0
m_WriteDefaultValues: 1
m_Mirror: 0
m_SpeedParameterActive: 0
m_MirrorParameterActive: 0
m_CycleOffsetParameterActive: 0
m_TimeParameterActive: 0
m_Motion: {fileID: 7400000, guid: 19f04425ed653504ebb780d2372dd9ba, type: 2}
m_Tag:
m_SpeedParameter:
m_MirrorParameter:
m_CycleOffsetParameter:
m_TimeParameter:

8
Assets/Art/Spinner/SpinnerController.controller.meta


fileFormatVersion: 2
guid: 12ca31314ac02d24c9fac9beff769388
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 9100000
userData:
assetBundleName:
assetBundleVariant:

215
Assets/Art/Spinner/SpinnerError.anim


%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!74 &7400000
AnimationClip:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: SpinnerError
serializedVersion: 6
m_Legacy: 0
m_Compressed: 0
m_UseHighQualityCurve: 1
m_RotationCurves: []
m_CompressedRotationCurves: []
m_EulerCurves: []
m_PositionCurves: []
m_ScaleCurves: []
m_FloatCurves:
- curve:
serializedVersion: 2
m_Curve:
- serializedVersion: 3
time: 0
value: 0
inSlope: 0
outSlope: 0
tangentMode: 136
weightedMode: 0
inWeight: 0.33333334
outWeight: 0.33333334
- serializedVersion: 3
time: 0.16666667
value: 37
inSlope: 258.4
outSlope: 258.4
tangentMode: 136
weightedMode: 0
inWeight: 0.33333334
outWeight: 0.33333334
- serializedVersion: 3
time: 0.5
value: 129.2
inSlope: 0
outSlope: 0
tangentMode: 136
weightedMode: 0
inWeight: 0.33333334
outWeight: 0.33333334
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
attribute: m_AnchoredPosition.x
path: SpinnerImage
classID: 224
script: {fileID: 0}
- curve:
serializedVersion: 2
m_Curve:
- serializedVersion: 3
time: 0
value: 0
inSlope: 0
outSlope: 0
tangentMode: 136
weightedMode: 0
inWeight: 0.33333334
outWeight: 0.33333334
- serializedVersion: 3
time: 0.16666667
value: 63.8
inSlope: 0
outSlope: 0
tangentMode: 136
weightedMode: 0
inWeight: 0.33333334
outWeight: 0.33333334
- serializedVersion: 3
time: 0.5
value: -287
inSlope: 0
outSlope: 0
tangentMode: 136
weightedMode: 0
inWeight: 0.33333334
outWeight: 0.33333334
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
attribute: m_AnchoredPosition.y
path: SpinnerImage
classID: 224
script: {fileID: 0}
m_PPtrCurves: []
m_SampleRate: 60
m_WrapMode: 0
m_Bounds:
m_Center: {x: 0, y: 0, z: 0}
m_Extent: {x: 0, y: 0, z: 0}
m_ClipBindingConstant:
genericBindings:
- serializedVersion: 2
path: 4019898539
attribute: 1460864421
script: {fileID: 0}
typeID: 224
customType: 28
isPPtrCurve: 0
- serializedVersion: 2
path: 4019898539
attribute: 538195251
script: {fileID: 0}
typeID: 224
customType: 28
isPPtrCurve: 0
pptrCurveMapping: []
m_AnimationClipSettings:
serializedVersion: 2
m_AdditiveReferencePoseClip: {fileID: 0}
m_AdditiveReferencePoseTime: 0
m_StartTime: 0
m_StopTime: 0.5
m_OrientationOffsetY: 0
m_Level: 0
m_CycleOffset: 0
m_HasAdditiveReferencePose: 0
m_LoopTime: 1
m_LoopBlend: 0
m_LoopBlendOrientation: 0
m_LoopBlendPositionY: 0
m_LoopBlendPositionXZ: 0
m_KeepOriginalOrientation: 0
m_KeepOriginalPositionY: 1
m_KeepOriginalPositionXZ: 0
m_HeightFromFeet: 0
m_Mirror: 0
m_EditorCurves:
- curve:
serializedVersion: 2
m_Curve:
- serializedVersion: 3
time: 0
value: 0
inSlope: 0
outSlope: 0
tangentMode: 136
weightedMode: 0
inWeight: 0.33333334
outWeight: 0.33333334
- serializedVersion: 3
time: 0.16666667
value: 37
inSlope: 258.4
outSlope: 258.4
tangentMode: 136
weightedMode: 0
inWeight: 0.33333334
outWeight: 0.33333334
- serializedVersion: 3
time: 0.5
value: 129.2
inSlope: 0
outSlope: 0
tangentMode: 136
weightedMode: 0
inWeight: 0.33333334
outWeight: 0.33333334
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
attribute: m_AnchoredPosition.x
path: SpinnerImage
classID: 224
script: {fileID: 0}
- curve:
serializedVersion: 2
m_Curve:
- serializedVersion: 3
time: 0
value: 0
inSlope: 0
outSlope: 0
tangentMode: 136
weightedMode: 0
inWeight: 0.33333334
outWeight: 0.33333334
- serializedVersion: 3
time: 0.16666667
value: 63.8
inSlope: 0
outSlope: 0
tangentMode: 136
weightedMode: 0
inWeight: 0.33333334
outWeight: 0.33333334
- serializedVersion: 3
time: 0.5
value: -287
inSlope: 0
outSlope: 0
tangentMode: 136
weightedMode: 0
inWeight: 0.33333334
outWeight: 0.33333334
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
attribute: m_AnchoredPosition.y
path: SpinnerImage
classID: 224
script: {fileID: 0}
m_EulerEditorCurves: []
m_HasGenericRootTransform: 0
m_HasMotionFloatCurves: 0
m_Events: []

8
Assets/Art/Spinner/SpinnerError.anim.meta


fileFormatVersion: 2
guid: 8aac3971e57c2a94f8d287084b3b0565
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 7400000
userData:
assetBundleName:
assetBundleVariant:

143
Assets/Art/Spinner/SpinnerStatic.anim


%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!74 &7400000
AnimationClip:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: SpinnerStatic
serializedVersion: 6
m_Legacy: 0
m_Compressed: 0
m_UseHighQualityCurve: 1
m_RotationCurves: []
m_CompressedRotationCurves: []
m_EulerCurves: []
m_PositionCurves: []
m_ScaleCurves: []
m_FloatCurves:
- curve:
serializedVersion: 2
m_Curve:
- serializedVersion: 3
time: 0
value: 0
inSlope: 0
outSlope: 0
tangentMode: 136
weightedMode: 0
inWeight: 0
outWeight: 0
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
attribute: m_AnchoredPosition.x
path: SpinnerImage
classID: 224
script: {fileID: 0}
- curve:
serializedVersion: 2
m_Curve:
- serializedVersion: 3
time: 0
value: 0
inSlope: 0
outSlope: 0
tangentMode: 136
weightedMode: 0
inWeight: 0
outWeight: 0
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
attribute: m_AnchoredPosition.y
path: SpinnerImage
classID: 224
script: {fileID: 0}
m_PPtrCurves: []
m_SampleRate: 60
m_WrapMode: 0
m_Bounds:
m_Center: {x: 0, y: 0, z: 0}
m_Extent: {x: 0, y: 0, z: 0}
m_ClipBindingConstant:
genericBindings:
- serializedVersion: 2
path: 4019898539
attribute: 1460864421
script: {fileID: 0}
typeID: 224
customType: 28
isPPtrCurve: 0
- serializedVersion: 2
path: 4019898539
attribute: 538195251
script: {fileID: 0}
typeID: 224
customType: 28
isPPtrCurve: 0
pptrCurveMapping: []
m_AnimationClipSettings:
serializedVersion: 2
m_AdditiveReferencePoseClip: {fileID: 0}
m_AdditiveReferencePoseTime: 0
m_StartTime: 0
m_StopTime: 0
m_OrientationOffsetY: 0
m_Level: 0
m_CycleOffset: 0
m_HasAdditiveReferencePose: 0
m_LoopTime: 1
m_LoopBlend: 0
m_LoopBlendOrientation: 0
m_LoopBlendPositionY: 0
m_LoopBlendPositionXZ: 0
m_KeepOriginalOrientation: 0
m_KeepOriginalPositionY: 1
m_KeepOriginalPositionXZ: 0
m_HeightFromFeet: 0
m_Mirror: 0
m_EditorCurves:
- curve:
serializedVersion: 2
m_Curve:
- serializedVersion: 3
time: 0
value: 0
inSlope: 0
outSlope: 0
tangentMode: 136
weightedMode: 0
inWeight: 0
outWeight: 0
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
attribute: m_AnchoredPosition.x
path: SpinnerImage
classID: 224
script: {fileID: 0}
- curve:
serializedVersion: 2
m_Curve:
- serializedVersion: 3
time: 0
value: 0
inSlope: 0
outSlope: 0
tangentMode: 136
weightedMode: 0
inWeight: 0
outWeight: 0
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
attribute: m_AnchoredPosition.y
path: SpinnerImage
classID: 224
script: {fileID: 0}
m_EulerEditorCurves: []
m_HasGenericRootTransform: 0
m_HasMotionFloatCurves: 0
m_Events: []

8
Assets/Art/Spinner/SpinnerStatic.anim.meta


fileFormatVersion: 2
guid: fef7968afddaa344fb658282f7ec64b0
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 7400000
userData:
assetBundleName:
assetBundleVariant:

199
Assets/Art/Spinner/SpinnerUISpin.anim


%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!74 &7400000
AnimationClip:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: SpinnerUISpin
serializedVersion: 6
m_Legacy: 0
m_Compressed: 0
m_UseHighQualityCurve: 1
m_RotationCurves: []
m_CompressedRotationCurves: []
m_EulerCurves:
- curve:
serializedVersion: 2
m_Curve:
- serializedVersion: 3
time: 0
value: {x: 0, y: 0, z: 0}
inSlope: {x: 0, y: 0, z: 0}
outSlope: {x: 0, y: 0, z: -360}
tangentMode: 0
weightedMode: 0
inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334}
outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334}
- serializedVersion: 3
time: 1
value: {x: 0, y: 0, z: -360}
inSlope: {x: 0, y: 0, z: -360}
outSlope: {x: 0, y: 0, z: 0}
tangentMode: 0
weightedMode: 0
inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334}
outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334}
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
path: SpinnerImage
m_PositionCurves: []
m_ScaleCurves: []
m_FloatCurves: []
m_PPtrCurves: []
m_SampleRate: 60
m_WrapMode: 0
m_Bounds:
m_Center: {x: 0, y: 0, z: 0}
m_Extent: {x: 0, y: 0, z: 0}
m_ClipBindingConstant:
genericBindings:
- serializedVersion: 2
path: 4019898539
attribute: 4
script: {fileID: 0}
typeID: 4
customType: 4
isPPtrCurve: 0
pptrCurveMapping: []
m_AnimationClipSettings:
serializedVersion: 2
m_AdditiveReferencePoseClip: {fileID: 0}
m_AdditiveReferencePoseTime: 0
m_StartTime: 0
m_StopTime: 1
m_OrientationOffsetY: 0
m_Level: 0
m_CycleOffset: 0
m_HasAdditiveReferencePose: 0
m_LoopTime: 1
m_LoopBlend: 0
m_LoopBlendOrientation: 0
m_LoopBlendPositionY: 0
m_LoopBlendPositionXZ: 0
m_KeepOriginalOrientation: 0
m_KeepOriginalPositionY: 1
m_KeepOriginalPositionXZ: 0
m_HeightFromFeet: 0
m_Mirror: 0
m_EditorCurves:
- curve:
serializedVersion: 2
m_Curve:
- serializedVersion: 3
time: 0
value: 0
inSlope: 0
outSlope: 0
tangentMode: 136
weightedMode: 0
inWeight: 0.33333334
outWeight: 0.33333334
- serializedVersion: 3
time: 1
value: 0
inSlope: 0
outSlope: 0
tangentMode: 136
weightedMode: 0
inWeight: 0.33333334
outWeight: 0.33333334
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
attribute: localEulerAnglesRaw.x
path: SpinnerImage
classID: 224
script: {fileID: 0}
- curve:
serializedVersion: 2
m_Curve:
- serializedVersion: 3
time: 0
value: 0
inSlope: 0
outSlope: 0
tangentMode: 136
weightedMode: 0
inWeight: 0.33333334
outWeight: 0.33333334
- serializedVersion: 3
time: 1
value: 0
inSlope: 0
outSlope: 0
tangentMode: 136
weightedMode: 0
inWeight: 0.33333334
outWeight: 0.33333334
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
attribute: localEulerAnglesRaw.y
path: SpinnerImage
classID: 224
script: {fileID: 0}
- curve:
serializedVersion: 2
m_Curve:
- serializedVersion: 3
time: 0
value: 0
inSlope: 0
outSlope: -360
tangentMode: 69
weightedMode: 0
inWeight: 0.33333334
outWeight: 0.33333334
- serializedVersion: 3
time: 1
value: -360
inSlope: -360
outSlope: 0
tangentMode: 69
weightedMode: 0
inWeight: 0.33333334
outWeight: 0.33333334
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
attribute: localEulerAnglesRaw.z
path: SpinnerImage
classID: 224
script: {fileID: 0}
m_EulerEditorCurves:
- curve:
serializedVersion: 2
m_Curve: []
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
attribute: m_LocalEulerAngles.x
path: SpinnerImage
classID: 224
script: {fileID: 0}
- curve:
serializedVersion: 2
m_Curve: []
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
attribute: m_LocalEulerAngles.y
path: SpinnerImage
classID: 224
script: {fileID: 0}
- curve:
serializedVersion: 2
m_Curve: []
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
attribute: m_LocalEulerAngles.z
path: SpinnerImage
classID: 224
script: {fileID: 0}
m_HasGenericRootTransform: 0
m_HasMotionFloatCurves: 0
m_Events: []

8
Assets/Art/Spinner/SpinnerUISpin.anim.meta


fileFormatVersion: 2
guid: 19f04425ed653504ebb780d2372dd9ba
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 7400000
userData:
assetBundleName:
assetBundleVariant:

1001
Assets/Prefabs/UI/PlayerList.prefab
文件差异内容过多而无法显示
查看文件

15
Assets/Scripts/UI/HostReadyCheckUI.cs


using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Utilities;
namespace LobbyRooms.UI
{
public class HostReadyCheckUI : MonoBehaviour
{
public void InitReadyCheck(bool init)
{
Locator.Get.Messenger.OnReceiveMessage(MessageType.HostInitReadyCheck, init);
}
}
}

18
Assets/Scripts/UI/LobbyUserInteractionUI.cs


using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Utilities;
namespace LobbyRooms.UI
{
public class LobbyUserInteractionUI : UIPanelBase
{
public void HostInitReadyCheck()
{
Locator.Get.Messenger.OnReceiveMessage(MessageType.HostInitReadyCheck, null);
}
}
}

72
Assets/Scripts/UI/PlayerCardUI.cs


using Player;
using TMPro;
using UnityEngine;
namespace LobbyRooms.UI
{
/// <summary>
/// Shows the player info in-lobby and game
/// </summary>
[RequireComponent(typeof(LobbyUserObserver))]
public class PlayerCardUI : ObserverPanel<LobbyUser>
{
[SerializeField]
TMP_Text m_DisplayNameText;
[SerializeField]
TMP_Text m_StatusText;
[SerializeField]
TMP_Text m_EmoteText;
public bool IsAssigned { get { return UserId != null; } }
public string UserId { get; private set; }
public void SetUser(LobbyUser myLobbyUser)
{
Show();
myLobbyUser.onDestroyed += OnUserLeft;
GetComponent<LobbyUserObserver>().BeginObserving(myLobbyUser);
UserId = myLobbyUser.ID;
}
public void OnUserLeft(LobbyUser user)
{
OnUserLeft(user?.ID);
}
public void OnUserLeft(string userId)
{
if (userId == UserId)
{
UserId = null;
Hide();
}
}
public override void ObservedUpdated(LobbyUser observed)
{
m_DisplayNameText.SetText(observed.DisplayName);
m_StatusText.SetText(SetStatusFancy(observed.UserStatus));
m_EmoteText.SetText(observed.Emote);
}
string SetStatusFancy(UserStatus status)
{
switch (status)
{
case UserStatus.Lobby:
return "<color=#56B4E9>Lobby.</color>"; // Light Blue
case UserStatus.ReadyCheck:
return "<color=#E69F00>Ready?</color>"; //Light Orange
case UserStatus.Ready:
return "<color=#009E73>Ready!</color>"; // Light Mint
case UserStatus.Connecting:
return "<color=#F0E442>Connecting.</color>"; // Bright Yellow
case UserStatus.Connected:
return "<color=#005500>Connected.</color>"; //Orange
default:
return "<color=#56B4E9>In Lobby.</color>";
}
}
}
}

69
Assets/Scripts/UI/RoomPlayersUI.cs


using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Serialization;
namespace LobbyRooms.UI
{
/// <summary>
/// Watches for changes in the Lobby's player List
/// </summary>
[RequireComponent(typeof(LobbyDataObserver))]
public class RoomPlayersUI : ObserverPanel<LobbyData>
{
[SerializeField]
List<PlayerCardUI> m_PlayerCardSlots = new List<PlayerCardUI>();
List<string> m_CurrentUsers = new List<string>(); // Just for keeping track more easily of which users are already displayed.
/// <summary>
/// When the observed data updates, we need to detect changes to the list of players.
/// </summary>
public override void ObservedUpdated(LobbyData observed)
{
// if (observed.PlayerCount == m_CurrentUsers.Count) // TODO: Not a 100% accurate shorthand.
// return;
for (int id = m_CurrentUsers.Count - 1; id >= 0; id--) // We might remove users if they aren't in the new data, so iterate backwards.
{
string userId = m_CurrentUsers[id];
if (!observed.LobbyUsers.ContainsKey(userId))
{ foreach (var card in m_PlayerCardSlots)
{ if (card.UserId == userId)
{
card.OnUserLeft(userId);
OnPlayerLeft(userId);
}
}
}
}
foreach (var lobbyUserKvp in observed.LobbyUsers) // If there are new players, we need to hook them into the UI.
{
if (m_CurrentUsers.Contains(lobbyUserKvp.Key))
continue;
m_CurrentUsers.Add(lobbyUserKvp.Key);
foreach (var pcu in m_PlayerCardSlots)
{
if (pcu.IsAssigned)
continue;
var lobbyUser = lobbyUserKvp.Value;
lobbyUser.onDestroyed += OnPlayerLeft; // TODO: Where do we unsubscribe?
pcu.SetUser(lobbyUserKvp.Value);
break;
}
}
}
void OnPlayerLeft(LobbyUser left)
{
OnPlayerLeft(left.ID);
}
void OnPlayerLeft(string playerId) // TODO: We seem to waffle between player and user.
{
if (!m_CurrentUsers.Contains(playerId))
return;
m_CurrentUsers.Remove(playerId);
}
}
}

15
Assets/Scripts/UI/UserReadyCheckUI.cs


using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Utilities;
namespace LobbyRooms.UI
{
public class UserReadyCheckUI : MonoBehaviour
{
public void Ready(bool isReady)
{
Locator.Get.Messenger.OnReceiveMessage(MessageType.LocalUserReadyCheckResponse, isReady);
}
}
}

/Assets/Prefabs/UI/PlayerCardPanel.prefab.meta → /Assets/Prefabs/UI/UserCardPanel.prefab.meta

/Assets/Prefabs/UI/PlayerList.prefab.meta → /Assets/Prefabs/UI/LobbyUserList.prefab.meta

/Assets/Prefabs/UI/PlayerCardPanel.prefab → /Assets/Prefabs/UI/UserCardPanel.prefab

/Assets/Scripts/UI/HostReadyCheckUI.cs.meta → /Assets/Scripts/UI/ReadyCheckUI.cs.meta

/Assets/Scripts/UI/PlayerCardUI.cs.meta → /Assets/Scripts/UI/LobbyUserCardUI.cs.meta

/Assets/Scripts/UI/RoomPlayersUI.cs.meta → /Assets/Scripts/UI/LobbyUsersUI.cs.meta

/Assets/Scripts/UI/LobbyUserInteractionUI.cs.meta → /Assets/Scripts/UI/CountdownUI.cs.meta

/Assets/Scripts/UI/UserReadyCheckUI.cs.meta → /Assets/Scripts/UI/EndGameButtonUI.cs.meta

正在加载...
取消
保存