feat: voting time is reduced if everyone has voted + pictures of a room are deleted at the end

This commit is contained in:
Fangh 2024-02-01 22:38:34 +01:00
parent 379abeccc8
commit b03704c971
6 changed files with 451 additions and 155 deletions

View File

@ -1601,7 +1601,6 @@ GameObject:
- component: {fileID: 351375052} - component: {fileID: 351375052}
- component: {fileID: 351375055} - component: {fileID: 351375055}
- component: {fileID: 351375054} - component: {fileID: 351375054}
- component: {fileID: 351375053}
m_Layer: 5 m_Layer: 5
m_Name: Title2 m_Name: Title2
m_TagString: Untagged m_TagString: Untagged
@ -1629,19 +1628,6 @@ RectTransform:
m_AnchoredPosition: {x: 0, y: -50} m_AnchoredPosition: {x: 0, y: -50}
m_SizeDelta: {x: 0, y: 320.82227} m_SizeDelta: {x: 0, y: 320.82227}
m_Pivot: {x: 0.5, y: 1} m_Pivot: {x: 0.5, y: 1}
--- !u!114 &351375053
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 351375051}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 94922ac68f10744df9dab89b5202ac76, type: 3}
m_Name:
m_EditorClassIdentifier:
textList: {fileID: 11400000, guid: 5b22791c486a626428ab508347ebb36e, type: 2}
--- !u!114 &351375054 --- !u!114 &351375054
MonoBehaviour: MonoBehaviour:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0
@ -1865,6 +1851,7 @@ GameObject:
- component: {fileID: 375256412} - component: {fileID: 375256412}
- component: {fileID: 375256415} - component: {fileID: 375256415}
- component: {fileID: 375256416} - component: {fileID: 375256416}
- component: {fileID: 375256417}
m_Layer: 0 m_Layer: 0
m_Name: '[Managers]' m_Name: '[Managers]'
m_TagString: Untagged m_TagString: Untagged
@ -1976,6 +1963,19 @@ MonoBehaviour:
<id>k__BackingField: <id>k__BackingField:
<fr>k__BackingField: <fr>k__BackingField:
<en>k__BackingField: <en>k__BackingField:
--- !u!114 &375256417
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 375256411}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 3b41deef4ebd372d5a18eabdb00cfbb4, type: 3}
m_Name:
m_EditorClassIdentifier:
cameraManager: {fileID: 0}
--- !u!1 &411140634 --- !u!1 &411140634
GameObject: GameObject:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0
@ -2291,8 +2291,8 @@ RectTransform:
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0} m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 1, y: 0} m_AnchorMax: {x: 1, y: 0}
m_AnchoredPosition: {x: 0, y: 40} m_AnchoredPosition: {x: 92.49994, y: 40}
m_SizeDelta: {x: -80.00009, y: 642.6719} m_SizeDelta: {x: -265.00012, y: 642.6719}
m_Pivot: {x: 0.5, y: 0} m_Pivot: {x: 0.5, y: 0}
--- !u!114 &496891793 --- !u!114 &496891793
MonoBehaviour: MonoBehaviour:
@ -2311,7 +2311,7 @@ MonoBehaviour:
m_Right: 0 m_Right: 0
m_Top: 0 m_Top: 0
m_Bottom: 0 m_Bottom: 0
m_ChildAlignment: 5 m_ChildAlignment: 3
m_StartCorner: 0 m_StartCorner: 0
m_StartAxis: 0 m_StartAxis: 0
m_CellSize: {x: 300, y: 200} m_CellSize: {x: 300, y: 200}
@ -2520,6 +2520,15 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: ae520d9a7647819498ae6228ced27630, type: 3} m_Script: {fileID: 11500000, guid: ae520d9a7647819498ae6228ced27630, type: 3}
m_Name: m_Name:
m_EditorClassIdentifier: m_EditorClassIdentifier:
playerStickers:
- {fileID: 1230545932}
- {fileID: 2120840640}
- {fileID: 1721928059}
- {fileID: 1602600781}
- {fileID: 2038769041}
- {fileID: 1059129458}
- {fileID: 1610615897}
- {fileID: 2004328314}
--- !u!1 &593191224 --- !u!1 &593191224
GameObject: GameObject:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0
@ -3507,7 +3516,7 @@ PrefabInstance:
objectReference: {fileID: 0} objectReference: {fileID: 0}
- target: {fileID: 943229596838791819, guid: 69942fa558cf34dfc91982c6bccef840, type: 3} - target: {fileID: 943229596838791819, guid: 69942fa558cf34dfc91982c6bccef840, type: 3}
propertyPath: m_AnchoredPosition.x propertyPath: m_AnchoredPosition.x
value: 1239.9999 value: 1050
objectReference: {fileID: 0} objectReference: {fileID: 0}
- target: {fileID: 943229596838791819, guid: 69942fa558cf34dfc91982c6bccef840, type: 3} - target: {fileID: 943229596838791819, guid: 69942fa558cf34dfc91982c6bccef840, type: 3}
propertyPath: m_AnchoredPosition.y propertyPath: m_AnchoredPosition.y
@ -3529,6 +3538,10 @@ PrefabInstance:
propertyPath: m_Name propertyPath: m_Name
value: PlayerSticker (6) value: PlayerSticker (6)
objectReference: {fileID: 0} objectReference: {fileID: 0}
- target: {fileID: 4312846972391547553, guid: 69942fa558cf34dfc91982c6bccef840, type: 3}
propertyPath: m_IsActive
value: 1
objectReference: {fileID: 0}
m_RemovedComponents: [] m_RemovedComponents: []
m_RemovedGameObjects: [] m_RemovedGameObjects: []
m_AddedGameObjects: m_AddedGameObjects:
@ -3862,7 +3875,7 @@ PrefabInstance:
objectReference: {fileID: 0} objectReference: {fileID: 0}
- target: {fileID: 943229596838791819, guid: 69942fa558cf34dfc91982c6bccef840, type: 3} - target: {fileID: 943229596838791819, guid: 69942fa558cf34dfc91982c6bccef840, type: 3}
propertyPath: m_AnchoredPosition.x propertyPath: m_AnchoredPosition.x
value: 1689.9999 value: 1500
objectReference: {fileID: 0} objectReference: {fileID: 0}
- target: {fileID: 943229596838791819, guid: 69942fa558cf34dfc91982c6bccef840, type: 3} - target: {fileID: 943229596838791819, guid: 69942fa558cf34dfc91982c6bccef840, type: 3}
propertyPath: m_AnchoredPosition.y propertyPath: m_AnchoredPosition.y
@ -3884,6 +3897,10 @@ PrefabInstance:
propertyPath: m_Name propertyPath: m_Name
value: PlayerSticker (3) value: PlayerSticker (3)
objectReference: {fileID: 0} objectReference: {fileID: 0}
- target: {fileID: 4312846972391547553, guid: 69942fa558cf34dfc91982c6bccef840, type: 3}
propertyPath: m_IsActive
value: 1
objectReference: {fileID: 0}
m_RemovedComponents: [] m_RemovedComponents: []
m_RemovedGameObjects: [] m_RemovedGameObjects: []
m_AddedGameObjects: m_AddedGameObjects:
@ -4043,7 +4060,7 @@ PrefabInstance:
objectReference: {fileID: 0} objectReference: {fileID: 0}
- target: {fileID: 943229596838791819, guid: 69942fa558cf34dfc91982c6bccef840, type: 3} - target: {fileID: 943229596838791819, guid: 69942fa558cf34dfc91982c6bccef840, type: 3}
propertyPath: m_AnchoredPosition.x propertyPath: m_AnchoredPosition.x
value: 339.99988 value: 150
objectReference: {fileID: 0} objectReference: {fileID: 0}
- target: {fileID: 943229596838791819, guid: 69942fa558cf34dfc91982c6bccef840, type: 3} - target: {fileID: 943229596838791819, guid: 69942fa558cf34dfc91982c6bccef840, type: 3}
propertyPath: m_AnchoredPosition.y propertyPath: m_AnchoredPosition.y
@ -4672,7 +4689,7 @@ PrefabInstance:
objectReference: {fileID: 0} objectReference: {fileID: 0}
- target: {fileID: 943229596838791819, guid: 69942fa558cf34dfc91982c6bccef840, type: 3} - target: {fileID: 943229596838791819, guid: 69942fa558cf34dfc91982c6bccef840, type: 3}
propertyPath: m_AnchoredPosition.x propertyPath: m_AnchoredPosition.x
value: 789.9999 value: 600
objectReference: {fileID: 0} objectReference: {fileID: 0}
- target: {fileID: 943229596838791819, guid: 69942fa558cf34dfc91982c6bccef840, type: 3} - target: {fileID: 943229596838791819, guid: 69942fa558cf34dfc91982c6bccef840, type: 3}
propertyPath: m_AnchoredPosition.y propertyPath: m_AnchoredPosition.y
@ -4694,6 +4711,10 @@ PrefabInstance:
propertyPath: m_Name propertyPath: m_Name
value: PlayerSticker (5) value: PlayerSticker (5)
objectReference: {fileID: 0} objectReference: {fileID: 0}
- target: {fileID: 4312846972391547553, guid: 69942fa558cf34dfc91982c6bccef840, type: 3}
propertyPath: m_IsActive
value: 1
objectReference: {fileID: 0}
m_RemovedComponents: [] m_RemovedComponents: []
m_RemovedGameObjects: [] m_RemovedGameObjects: []
m_AddedGameObjects: m_AddedGameObjects:
@ -4707,6 +4728,17 @@ RectTransform:
m_CorrespondingSourceObject: {fileID: 943229596838791819, guid: 69942fa558cf34dfc91982c6bccef840, type: 3} m_CorrespondingSourceObject: {fileID: 943229596838791819, guid: 69942fa558cf34dfc91982c6bccef840, type: 3}
m_PrefabInstance: {fileID: 1059129456} m_PrefabInstance: {fileID: 1059129456}
m_PrefabAsset: {fileID: 0} m_PrefabAsset: {fileID: 0}
--- !u!114 &1059129458 stripped
MonoBehaviour:
m_CorrespondingSourceObject: {fileID: 9117562908589005100, guid: 69942fa558cf34dfc91982c6bccef840, type: 3}
m_PrefabInstance: {fileID: 1059129456}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 63ba002d2116d4c54a8d55e905869d8f, type: 3}
m_Name:
m_EditorClassIdentifier:
--- !u!1001 &1097420890 --- !u!1001 &1097420890
PrefabInstance: PrefabInstance:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0
@ -5402,6 +5434,17 @@ CanvasRenderer:
m_PrefabAsset: {fileID: 0} m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1197279070} m_GameObject: {fileID: 1197279070}
m_CullTransparentMesh: 0 m_CullTransparentMesh: 0
--- !u!114 &1230545932 stripped
MonoBehaviour:
m_CorrespondingSourceObject: {fileID: 9117562908589005100, guid: 69942fa558cf34dfc91982c6bccef840, type: 3}
m_PrefabInstance: {fileID: 943114024}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 63ba002d2116d4c54a8d55e905869d8f, type: 3}
m_Name:
m_EditorClassIdentifier:
--- !u!1 &1236996026 --- !u!1 &1236996026
GameObject: GameObject:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0
@ -7504,7 +7547,7 @@ PrefabInstance:
objectReference: {fileID: 0} objectReference: {fileID: 0}
- target: {fileID: 943229596838791819, guid: 69942fa558cf34dfc91982c6bccef840, type: 3} - target: {fileID: 943229596838791819, guid: 69942fa558cf34dfc91982c6bccef840, type: 3}
propertyPath: m_AnchoredPosition.x propertyPath: m_AnchoredPosition.x
value: 1239.9999 value: 1050
objectReference: {fileID: 0} objectReference: {fileID: 0}
- target: {fileID: 943229596838791819, guid: 69942fa558cf34dfc91982c6bccef840, type: 3} - target: {fileID: 943229596838791819, guid: 69942fa558cf34dfc91982c6bccef840, type: 3}
propertyPath: m_AnchoredPosition.y propertyPath: m_AnchoredPosition.y
@ -7526,6 +7569,10 @@ PrefabInstance:
propertyPath: m_Name propertyPath: m_Name
value: PlayerSticker (2) value: PlayerSticker (2)
objectReference: {fileID: 0} objectReference: {fileID: 0}
- target: {fileID: 4312846972391547553, guid: 69942fa558cf34dfc91982c6bccef840, type: 3}
propertyPath: m_IsActive
value: 1
objectReference: {fileID: 0}
m_RemovedComponents: [] m_RemovedComponents: []
m_RemovedGameObjects: [] m_RemovedGameObjects: []
m_AddedGameObjects: m_AddedGameObjects:
@ -7539,6 +7586,28 @@ RectTransform:
m_CorrespondingSourceObject: {fileID: 943229596838791819, guid: 69942fa558cf34dfc91982c6bccef840, type: 3} m_CorrespondingSourceObject: {fileID: 943229596838791819, guid: 69942fa558cf34dfc91982c6bccef840, type: 3}
m_PrefabInstance: {fileID: 1595592696} m_PrefabInstance: {fileID: 1595592696}
m_PrefabAsset: {fileID: 0} m_PrefabAsset: {fileID: 0}
--- !u!114 &1602600781 stripped
MonoBehaviour:
m_CorrespondingSourceObject: {fileID: 9117562908589005100, guid: 69942fa558cf34dfc91982c6bccef840, type: 3}
m_PrefabInstance: {fileID: 851638680}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 63ba002d2116d4c54a8d55e905869d8f, type: 3}
m_Name:
m_EditorClassIdentifier:
--- !u!114 &1610615897 stripped
MonoBehaviour:
m_CorrespondingSourceObject: {fileID: 9117562908589005100, guid: 69942fa558cf34dfc91982c6bccef840, type: 3}
m_PrefabInstance: {fileID: 710475181}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 63ba002d2116d4c54a8d55e905869d8f, type: 3}
m_Name:
m_EditorClassIdentifier:
--- !u!1 &1660260833 --- !u!1 &1660260833
GameObject: GameObject:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0
@ -7868,6 +7937,17 @@ CanvasRenderer:
m_PrefabAsset: {fileID: 0} m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1681333512} m_GameObject: {fileID: 1681333512}
m_CullTransparentMesh: 1 m_CullTransparentMesh: 1
--- !u!114 &1721928059 stripped
MonoBehaviour:
m_CorrespondingSourceObject: {fileID: 9117562908589005100, guid: 69942fa558cf34dfc91982c6bccef840, type: 3}
m_PrefabInstance: {fileID: 1595592696}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 63ba002d2116d4c54a8d55e905869d8f, type: 3}
m_Name:
m_EditorClassIdentifier:
--- !u!1 &1730465902 --- !u!1 &1730465902
GameObject: GameObject:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0
@ -8136,7 +8216,7 @@ PrefabInstance:
objectReference: {fileID: 0} objectReference: {fileID: 0}
- target: {fileID: 943229596838791819, guid: 69942fa558cf34dfc91982c6bccef840, type: 3} - target: {fileID: 943229596838791819, guid: 69942fa558cf34dfc91982c6bccef840, type: 3}
propertyPath: m_AnchoredPosition.x propertyPath: m_AnchoredPosition.x
value: 789.9999 value: 600
objectReference: {fileID: 0} objectReference: {fileID: 0}
- target: {fileID: 943229596838791819, guid: 69942fa558cf34dfc91982c6bccef840, type: 3} - target: {fileID: 943229596838791819, guid: 69942fa558cf34dfc91982c6bccef840, type: 3}
propertyPath: m_AnchoredPosition.y propertyPath: m_AnchoredPosition.y
@ -9778,7 +9858,7 @@ PrefabInstance:
objectReference: {fileID: 0} objectReference: {fileID: 0}
- target: {fileID: 943229596838791819, guid: 69942fa558cf34dfc91982c6bccef840, type: 3} - target: {fileID: 943229596838791819, guid: 69942fa558cf34dfc91982c6bccef840, type: 3}
propertyPath: m_AnchoredPosition.x propertyPath: m_AnchoredPosition.x
value: 1689.9999 value: 1500
objectReference: {fileID: 0} objectReference: {fileID: 0}
- target: {fileID: 943229596838791819, guid: 69942fa558cf34dfc91982c6bccef840, type: 3} - target: {fileID: 943229596838791819, guid: 69942fa558cf34dfc91982c6bccef840, type: 3}
propertyPath: m_AnchoredPosition.y propertyPath: m_AnchoredPosition.y
@ -9800,6 +9880,10 @@ PrefabInstance:
propertyPath: m_Name propertyPath: m_Name
value: PlayerSticker (7) value: PlayerSticker (7)
objectReference: {fileID: 0} objectReference: {fileID: 0}
- target: {fileID: 4312846972391547553, guid: 69942fa558cf34dfc91982c6bccef840, type: 3}
propertyPath: m_IsActive
value: 1
objectReference: {fileID: 0}
m_RemovedComponents: [] m_RemovedComponents: []
m_RemovedGameObjects: [] m_RemovedGameObjects: []
m_AddedGameObjects: m_AddedGameObjects:
@ -9813,6 +9897,17 @@ RectTransform:
m_CorrespondingSourceObject: {fileID: 943229596838791819, guid: 69942fa558cf34dfc91982c6bccef840, type: 3} m_CorrespondingSourceObject: {fileID: 943229596838791819, guid: 69942fa558cf34dfc91982c6bccef840, type: 3}
m_PrefabInstance: {fileID: 2004328312} m_PrefabInstance: {fileID: 2004328312}
m_PrefabAsset: {fileID: 0} m_PrefabAsset: {fileID: 0}
--- !u!114 &2004328314 stripped
MonoBehaviour:
m_CorrespondingSourceObject: {fileID: 9117562908589005100, guid: 69942fa558cf34dfc91982c6bccef840, type: 3}
m_PrefabInstance: {fileID: 2004328312}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 63ba002d2116d4c54a8d55e905869d8f, type: 3}
m_Name:
m_EditorClassIdentifier:
--- !u!1 &2038490649 --- !u!1 &2038490649
GameObject: GameObject:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0
@ -9959,7 +10054,7 @@ PrefabInstance:
objectReference: {fileID: 0} objectReference: {fileID: 0}
- target: {fileID: 943229596838791819, guid: 69942fa558cf34dfc91982c6bccef840, type: 3} - target: {fileID: 943229596838791819, guid: 69942fa558cf34dfc91982c6bccef840, type: 3}
propertyPath: m_AnchoredPosition.x propertyPath: m_AnchoredPosition.x
value: 339.99988 value: 150
objectReference: {fileID: 0} objectReference: {fileID: 0}
- target: {fileID: 943229596838791819, guid: 69942fa558cf34dfc91982c6bccef840, type: 3} - target: {fileID: 943229596838791819, guid: 69942fa558cf34dfc91982c6bccef840, type: 3}
propertyPath: m_AnchoredPosition.y propertyPath: m_AnchoredPosition.y
@ -9981,6 +10076,10 @@ PrefabInstance:
propertyPath: m_Name propertyPath: m_Name
value: PlayerSticker (4) value: PlayerSticker (4)
objectReference: {fileID: 0} objectReference: {fileID: 0}
- target: {fileID: 4312846972391547553, guid: 69942fa558cf34dfc91982c6bccef840, type: 3}
propertyPath: m_IsActive
value: 1
objectReference: {fileID: 0}
m_RemovedComponents: [] m_RemovedComponents: []
m_RemovedGameObjects: [] m_RemovedGameObjects: []
m_AddedGameObjects: m_AddedGameObjects:
@ -9994,6 +10093,17 @@ RectTransform:
m_CorrespondingSourceObject: {fileID: 943229596838791819, guid: 69942fa558cf34dfc91982c6bccef840, type: 3} m_CorrespondingSourceObject: {fileID: 943229596838791819, guid: 69942fa558cf34dfc91982c6bccef840, type: 3}
m_PrefabInstance: {fileID: 2038769039} m_PrefabInstance: {fileID: 2038769039}
m_PrefabAsset: {fileID: 0} m_PrefabAsset: {fileID: 0}
--- !u!114 &2038769041 stripped
MonoBehaviour:
m_CorrespondingSourceObject: {fileID: 9117562908589005100, guid: 69942fa558cf34dfc91982c6bccef840, type: 3}
m_PrefabInstance: {fileID: 2038769039}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 63ba002d2116d4c54a8d55e905869d8f, type: 3}
m_Name:
m_EditorClassIdentifier:
--- !u!1 &2065109612 --- !u!1 &2065109612
GameObject: GameObject:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0
@ -10214,7 +10324,6 @@ GameObject:
- component: {fileID: 2088869501} - component: {fileID: 2088869501}
- component: {fileID: 2088869504} - component: {fileID: 2088869504}
- component: {fileID: 2088869503} - component: {fileID: 2088869503}
- component: {fileID: 2088869502}
m_Layer: 5 m_Layer: 5
m_Name: QuestionMark m_Name: QuestionMark
m_TagString: Untagged m_TagString: Untagged
@ -10241,19 +10350,6 @@ RectTransform:
m_AnchoredPosition: {x: -364, y: -228} m_AnchoredPosition: {x: -364, y: -228}
m_SizeDelta: {x: 100, y: 100} m_SizeDelta: {x: 100, y: 100}
m_Pivot: {x: 1, y: 0.5} m_Pivot: {x: 1, y: 0.5}
--- !u!114 &2088869502
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2088869500}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 94922ac68f10744df9dab89b5202ac76, type: 3}
m_Name:
m_EditorClassIdentifier:
textList: {fileID: 11400000, guid: 5b22791c486a626428ab508347ebb36e, type: 2}
--- !u!114 &2088869503 --- !u!114 &2088869503
MonoBehaviour: MonoBehaviour:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0
@ -10351,6 +10447,17 @@ CanvasRenderer:
m_PrefabAsset: {fileID: 0} m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2088869500} m_GameObject: {fileID: 2088869500}
m_CullTransparentMesh: 1 m_CullTransparentMesh: 1
--- !u!114 &2120840640 stripped
MonoBehaviour:
m_CorrespondingSourceObject: {fileID: 9117562908589005100, guid: 69942fa558cf34dfc91982c6bccef840, type: 3}
m_PrefabInstance: {fileID: 1758412515}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 63ba002d2116d4c54a8d55e905869d8f, type: 3}
m_Name:
m_EditorClassIdentifier:
--- !u!1001 &2214187228236614840 --- !u!1001 &2214187228236614840
PrefabInstance: PrefabInstance:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0

View File

@ -99,6 +99,26 @@ public List<Proposition> GetPropositionsForPlayer(Player player)
return playerPropositions; return playerPropositions;
} }
/// <summary>
/// Return the number of voters for a specific question
/// </summary>
/// <param name="_question"></param>
/// <returns></returns>
public int NumbersOfVotersForQuestion(Question _question)
{
int numberOfVoters = 0;
foreach(Proposition proposition in _question.propositions.Values.ToList())
{
if (proposition.voters == null)
continue;
numberOfVoters += proposition.voters.Count;
}
return numberOfVoters;
}
} }
public class ArrayToDictionaryConverter<T> : JsonConverter<Dictionary<int, T>> public class ArrayToDictionaryConverter<T> : JsonConverter<Dictionary<int, T>>

View File

@ -10,9 +10,13 @@
using Firebase.Storage; using Firebase.Storage;
using System.Security.Policy; using System.Security.Policy;
using System.Threading.Tasks; using System.Threading.Tasks;
using System.Collections;
using System.Security.Cryptography;
public class RoomManager : MonoBehaviour public class RoomManager : MonoBehaviour
{ {
public static RoomManager Instance;
[Header("Waiting For Players Page")] [Header("Waiting For Players Page")]
public GameObject waitingForPlayersPage; public GameObject waitingForPlayersPage;
/// <summary> /// <summary>
@ -40,12 +44,14 @@ public class RoomManager : MonoBehaviour
[Header("Other")] [Header("Other")]
public PromptList promptList; public PromptList promptList;
private Room myRoom = null;
public Room myRoom { get; private set; } = null;
DatabaseReference realtimeDB; DatabaseReference realtimeDB;
private void Awake() private void Awake()
{ {
Instance = this;
FirebaseInitializer.Instance.onFirebaseReady += Initialize; FirebaseInitializer.Instance.onFirebaseReady += Initialize;
} }
@ -92,16 +98,32 @@ private void ResetAllPlayerLabels()
} }
} }
private void OnApplicationQuit() private bool deleteRoomFilesCompleted = false;
private bool deleteRealtimeDBCompleted = false;
private IEnumerator OnApplicationQuit()
{ {
Debug.Log($"delete files of room {myRoom.code} from storage", this);
StorageManager.Instance.DeleteFileOfRoom(myRoom, () =>
{
Debug.Log($"cleaning photo files of room({myRoom.code})finish", this);
deleteRoomFilesCompleted = true;
});
Debug.Log($"delete realtimeDB room {myRoom.code}"); Debug.Log($"delete realtimeDB room {myRoom.code}");
realtimeDB.Child("rooms").Child(myRoom.code).RemoveValueAsync().ContinueWithOnMainThread(task => realtimeDB.Child("rooms").Child(myRoom.code).RemoveValueAsync().ContinueWithOnMainThread(task =>
{ {
Debug.Log($"room {myRoom.code} has been deleted"); Debug.Log($"room's({myRoom.code}) data has been deleted for database", this);
myRoom = null; myRoom = null;
deleteRealtimeDBCompleted = true;
}); });
Debug.Log($"delete files of room {myRoom.code}");
DeleteRoomFiles(); while (!deleteRoomFilesCompleted || !deleteRealtimeDBCompleted)
{
yield return null; // Yield until both tasks are completed
}
Debug.Log("Everything is clean. You can go. Bye bye...");
} }
private void Initialize() private void Initialize()
@ -336,9 +358,26 @@ private void QueryRoomsInDatabase(Action<List<Room>> callback)
{ {
string JSON = snapshot.GetRawJsonValue(); string JSON = snapshot.GetRawJsonValue();
Debug.Log($"Found some rooms:\n{JSON}", this); Debug.Log($"Found some rooms:\n{JSON}", this);
try
{
Dictionary<string, Room> onlineRooms = JsonConvert.DeserializeObject<Dictionary<string, Room>>(JSON); Dictionary<string, Room> onlineRooms = JsonConvert.DeserializeObject<Dictionary<string, Room>>(JSON);
callback?.Invoke(onlineRooms.Values.ToList()); callback?.Invoke(onlineRooms.Values.ToList());
} }
catch (Exception e)
{
Debug.LogException(e);
Debug.LogError($"Room {JSON} was broken, deleting it", this);
snapshot.Reference.RemoveValueAsync().ContinueWithOnMainThread(task =>
{
if (task.IsFaulted)
{
Debug.LogException(task.Exception);
return;
}
Debug.Log($"Broken room has been deleted", this);
}); ;
}
}
else else
{ {
Debug.Log("No rooms found in the database", this); Debug.Log("No rooms found in the database", this);
@ -358,20 +397,27 @@ private void CleanOldRooms()
{ {
if (DateTime.FromOADate(r.creationDate) < oneHourLater) if (DateTime.FromOADate(r.creationDate) < oneHourLater)
{ {
Debug.Log($"Room {r.code} has been created at {DateTime.FromOADate(r.creationDate)} and it's more than one hour old. Deleting it"); Debug.Log($"Room {r.code} has been created at {DateTime.FromOADate(r.creationDate)} and it's more than one hour old.");
realtimeDB.Child("rooms").Child(r.code).RemoveValueAsync().ContinueWithOnMainThread(task => DeleteRoom(r.code);
}
}
});
}
private void DeleteRoom(string _roomCode)
{
realtimeDB.Child("rooms").Child(_roomCode).RemoveValueAsync().ContinueWithOnMainThread(task =>
{ {
if (task.IsFaulted) if (task.IsFaulted)
{ {
Debug.LogException(task.Exception); Debug.LogException(task.Exception);
return; return;
} }
Debug.Log($"Room {r.code} has been deleted"); Debug.Log($"Room {_roomCode} has been deleted");
});
}
}
}); });
} }
private async Task<bool> DoesPathExistAsync(StorageReference storageReference) private async Task<bool> DoesPathExistAsync(StorageReference storageReference)
{ {
try try
@ -392,32 +438,4 @@ private async Task<bool> DoesPathExistAsync(StorageReference storageReference)
} }
} }
} }
private async void DeleteRoomFiles()
{
string roomCode = myRoom.code; //save it in case room has been deleted during you check files
StorageReference roomFolder = FirebaseStorage.DefaultInstance.RootReference.Child(roomCode);
bool pathExists = await DoesPathExistAsync(roomFolder);
if (pathExists)
{
_ = roomFolder.DeleteAsync().ContinueWithOnMainThread(task =>
{
if (task.IsCanceled || task.IsFaulted)
{
Debug.LogException(task.Exception);
}
else
{
Debug.Log($"Files of Room {roomCode} have been deleted");
}
});
}
else
{
Debug.Log($"Path for Room {roomCode} does not exist, nothing to delete");
}
}
} }

View File

@ -6,6 +6,14 @@ public class ScoringPage : MonoBehaviour
{ {
[SerializeField] private List<PlayerSticker> playerStickers; [SerializeField] private List<PlayerSticker> playerStickers;
private void Awake()
{
if(playerStickers == null || playerStickers.Count == 0)
{
Debug.LogError("You must provide the player stickers to the Scoring Page", this);
}
}
public void Initialize(Room _room) public void Initialize(Room _room)
{ {
gameObject.SetActive(true); gameObject.SetActive(true);

View File

@ -3,6 +3,9 @@
using Firebase.Storage; using Firebase.Storage;
using System; using System;
using System.Collections; using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Security.Policy; using System.Security.Policy;
using System.Threading.Tasks; using System.Threading.Tasks;
using UnityEditor; using UnityEditor;
@ -11,12 +14,15 @@
public class StorageManager : MonoBehaviour public class StorageManager : MonoBehaviour
{ {
public static StorageManager Instance;
public CameraManager cameraManager; public CameraManager cameraManager;
private StorageReference storage; private StorageReference storage;
private DatabaseReference realtimeDB; private DatabaseReference realtimeDB;
void Awake() void Awake()
{ {
Instance = this;
FirebaseInitializer.Instance.onFirebaseReady += Initialize; FirebaseInitializer.Instance.onFirebaseReady += Initialize;
} }
@ -27,18 +33,84 @@ void Initialize()
realtimeDB = FirebaseDatabase.DefaultInstance.RootReference; realtimeDB = FirebaseDatabase.DefaultInstance.RootReference;
} }
// Start is called before the first frame update public void DeleteFileOfRoom(Room _room, Action callBack_OnFinish)
void Start()
{ {
List<Task> deleteTasks = new List<Task>();
foreach(Player player in _room.players.Values.ToList())
{
foreach(Proposition proposition in _room.GetPropositionsForPlayer(player))
{
if (proposition != null)
{
if(proposition.photoUrl != null)
{
Debug.Log($"Adding a task to delete {proposition.photoUrl}", this);
deleteTasks.Add(Task.Run(async () =>
{
string temp = proposition.photoUrl;
StorageReference imageRef = FirebaseStorage.DefaultInstance.GetReferenceFromUrl(temp);
Debug.Log($"deleting {temp}", this);
await imageRef.DeleteAsync();
}));
}
}
}
}
if(deleteTasks.Count > 0)
{
RunDeleteTasks(deleteTasks, callBack_OnFinish);
}
else
{
Debug.Log($"There is no files to delete for room {_room.code}", this);
callBack_OnFinish.Invoke();
}
} }
// Update is called once per frame private void RunDeleteTasks(List<Task> deleteTasks, Action callback_OnFinish)
void Update()
{ {
int taskCount = deleteTasks.Count;
Debug.Log($"There are {taskCount} files to delete", this);
Task.WhenAll(deleteTasks).ContinueWith(_ =>
{
Debug.Log($"all delete tasks are done", this);
callback_OnFinish?.Invoke();
});
} }
/*
private IEnumerator RunDeleteTasks(List<Task> deleteTasks, Action callback_OnFinish)
{
int taskCount = deleteTasks.Count;
Debug.Log($"There are {taskCount} files to delete", this);
foreach (Task task in deleteTasks)
{
task.ContinueWith((completedTask) =>
{
// This code will be executed when the task is completed.
taskCount--;
});
// Start the task
task.Start();
}
while (taskCount > 0)
{
yield return null;
}
callback_OnFinish?.Invoke();
}
private Task DeletePhoto(string _gsURL)
{
string temp = _gsURL;
StorageReference imageRef = FirebaseStorage.DefaultInstance.GetReferenceFromUrl(temp);
Debug.Log($"deleting {temp}", this);
return imageRef.DeleteAsync();
}*/
public void UploadPhoto(string roomCode, string playerId, int question, int proposition, Action<bool> callback_OnPhotoUploaded) public void UploadPhoto(string roomCode, string playerId, int question, int proposition, Action<bool> callback_OnPhotoUploaded)
{ {
Texture2D photo = cameraManager.GetPhoto(); Texture2D photo = cameraManager.GetPhoto();

View File

@ -1,5 +1,4 @@
using System; using System;
using System.Collections;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using Firebase.Database; using Firebase.Database;
@ -24,44 +23,77 @@ public class VotingPage : MonoBehaviour
private Question currentQuestion = null; private Question currentQuestion = null;
private DatabaseReference roomRef; private DatabaseReference roomRef;
private Dictionary<string, Player> currentPlayers; //all the current playing players private Dictionary<string, Player> currentPlayers; // All the current playing players
private DateTime endOfTimer = DateTime.MinValue; private DateTime endOfTimer = DateTime.MinValue;
private Action OnVoteEnded; private Action OnVoteEnded;
private bool allPlayersHaveVotedForCurrentQuestion = false;
/// <summary>
/// Is the number of questions for this game sessions
/// </summary>
private int numberOfQuestions = 0;
private void Update() private void Update()
{ {
//there is no question displayed or timer is not started // If there is no question displayed or the timer is not started, return early.
if (currentQuestion == null || endOfTimer == DateTime.MinValue) if (currentQuestion == null || endOfTimer == DateTime.MinValue)
return; return;
if (DateTime.Now < endOfTimer) if (DateTime.Now < endOfTimer)
{ {
TimeSpan duration = endOfTimer - DateTime.Now; TimeSpan duration = endOfTimer - DateTime.Now;
timerLabel.text = ((int)duration.TotalSeconds).ToString("D2"); timerLabel.text = ((int)duration.TotalSeconds).ToString("D2");
if (allPlayersHaveVotedForCurrentQuestion)
{
Debug.Log("All players have voted. So I put only 5sec to look at the winner.", this);
if(endOfTimer > DateTime.Now.AddSeconds(5))
{
endOfTimer = DateTime.Now.AddSeconds(5);
}
}
} }
else else
{
EndCurrentQuestion();
}
}
/// <summary>
/// End current question and timer and go to next question (or end the vote if there is no more questions)
/// </summary>
private void EndCurrentQuestion()
{ {
timerLabel.text = "0"; timerLabel.text = "0";
if (remainingQuestions.Count > 0) if (remainingQuestions.Count > 0)
{ {
currentQuestion = remainingQuestions.Dequeue(); currentQuestion = remainingQuestions.Dequeue();
ShowQuestion(); ShowNextQuestion();
} }
else else
{ {
OnVoteEnded?.Invoke(); OnVoteEnded?.Invoke();
OnVoteEnded = null; OnVoteEnded = null;
gameObject.SetActive(false); gameObject.SetActive(false);
for (int i = 0; i < numberOfQuestions; i++)
{
roomRef.Child("questions").Child(i.ToString()).ValueChanged -= OnQuestionDataUpdate;
} }
} }
} }
/// <summary>
// Start is called before the first frame update /// Initializes the voting page with necessary data, such as the room reference, current players,
/// questions, and a callback function for when the voting ends.
/// </summary>
/// <param name="_roomRef">Reference to the Firebase room database.</param>
/// <param name="_currentPlayers">Dictionary of current players.</param>
/// <param name="_questions">Dictionary of questions associated with their IDs.</param>
/// <param name="_callback_OnVoteEnded">Callback function to invoke when the voting ends.</param>
public void ShowVotingPage(DatabaseReference _roomRef, Dictionary<string, Player> _currentPlayers, Dictionary<int, Question> _questions, Action _callback_OnVoteEnded) public void ShowVotingPage(DatabaseReference _roomRef, Dictionary<string, Player> _currentPlayers, Dictionary<int, Question> _questions, Action _callback_OnVoteEnded)
{ {
Debug.Log("Initializing voting page"); Debug.Log("Initializing voting page");
@ -71,99 +103,138 @@ public void ShowVotingPage(DatabaseReference _roomRef, Dictionary<string, Player
OnVoteEnded = _callback_OnVoteEnded; OnVoteEnded = _callback_OnVoteEnded;
Question[] _questionArray = _questions.Values.ToArray(); Question[] _questionArray = _questions.Values.ToArray();
numberOfQuestions = _questionArray.Length;
for (int i = 0; i < _questionArray.Length; i++) for (int i = 0; i < _questionArray.Length; i++)
{ {
remainingQuestions.Enqueue(_questionArray[i]); remainingQuestions.Enqueue(_questionArray[i]);
roomRef.Child("questions").Child(i.ToString()).ValueChanged += OnQuestionChanged; roomRef.Child("questions").Child(i.ToString()).ValueChanged += OnQuestionDataUpdate;
} }
currentQuestion = remainingQuestions.Dequeue(); currentQuestion = remainingQuestions.Dequeue();
ShowQuestion(); ShowNextQuestion();
} }
/// <summary> /// <summary>
/// Display next question on screen /// Displays the next question on the screen, updating the prompt, timer, and proposition frames.
/// </summary> /// </summary>
void ShowQuestion() private void ShowNextQuestion()
{ {
// Set the current question ID in the Firebase room database.
roomRef.Child("currentQuestionId").SetValueAsync(currentQuestion.index); roomRef.Child("currentQuestionId").SetValueAsync(currentQuestion.index);
// Update the prompt text based on the current question's prompt ID.
Debug.Log($"Show Question {currentQuestion.promptId}", this); Debug.Log($"Show Question {currentQuestion.promptId}", this);
Prompt currentPrompt = promptList.GetPromptById(currentQuestion.promptId); Prompt currentPrompt = promptList.GetPromptById(currentQuestion.promptId);
currentPromptLabel.text = currentPrompt.en; currentPromptLabel.text = currentPrompt.en;
Debug.Log($"Prompt is {currentPromptLabel.text}", this); Debug.Log($"Prompt is {currentPromptLabel.text}", this);
if (currentQuestion.propositions[0] != null) // Initialize the proposition frames with proposition data.
proposition1.Initialize(currentQuestion.propositions[0]); InitializeProposition(proposition1, currentQuestion.propositions[0]);
else InitializeProposition(proposition2, currentQuestion.propositions[1]);
{
Debug.Log("User has given no proposition", this);
//manage if there is no proposition
}
if (currentQuestion.propositions[1] != null)
proposition2.Initialize(currentQuestion.propositions[1]);
else
{
Debug.Log("User has given no proposition", this);
//manage if there is no proposition
}
// Set the timer to end after the specified voting time.
endOfTimer = DateTime.Now.AddSeconds(votingTime); endOfTimer = DateTime.Now.AddSeconds(votingTime);
//reset the count of voters
allPlayersHaveVotedForCurrentQuestion = false;
} }
/// <summary> /// <summary>
/// Is called when a question is updated (someone has voted) /// Initializes a proposition frame with the provided proposition data, updating it if available,
/// or handling the case when there is no proposition.
/// </summary> /// </summary>
/// <param name="sender"></param> /// <param name="proposition">The PropositionFrame to initialize or update.</param>
/// <param name="_questionRef"></param> /// <param name="propositionData">The Proposition data to use for initialization or update.</param>
private void OnQuestionChanged(object sender, ValueChangedEventArgs _questionRef) private void InitializeProposition(PropositionFrame proposition, Proposition propositionData)
{
if (propositionData != null)
{
proposition.Initialize(propositionData);
}
else
{
Debug.Log("User has given no proposition", this);
// Handle the case when there is no proposition
}
}
/// <summary>
/// Handles updates to a question, such as when someone has voted for it.
/// </summary>
/// <param name="sender">The sender of the event.</param>
/// <param name="_questionRef">The ValueChangedEventArgs containing the updated question reference.</param>
private void OnQuestionDataUpdate(object sender, ValueChangedEventArgs _questionRef)
{ {
//Debug.Log("a question value has changed, maybe someone has voted", this);
string JSON = _questionRef.Snapshot.GetRawJsonValue(); string JSON = _questionRef.Snapshot.GetRawJsonValue();
if (string.IsNullOrEmpty(JSON))
return;
Question question = Newtonsoft.Json.JsonConvert.DeserializeObject<Question>(JSON); Question question = Newtonsoft.Json.JsonConvert.DeserializeObject<Question>(JSON);
//if someone succeeded to vote for another question than the one that is displayed => yeet // If someone succeeded in voting for another question than the one displayed, ignore it.
if (question.index != currentQuestion.index) if (question.index != currentQuestion.index)
return; return;
//Debug.Log($"someone has voted for {question.index}", this);
currentQuestion.propositions = question.propositions; currentQuestion.propositions = question.propositions;
UpdateVoters();
if (currentQuestion.propositions.Count > 0)
{
// Update the proposition voters for both propositions.
UpdatePropositionVoters(proposition1, currentQuestion.propositions[0]);
UpdatePropositionVoters(proposition2, currentQuestion.propositions[1]);
}
if (RoomManager.Instance.myRoom.NumbersOfVotersForQuestion(currentQuestion) >= currentPlayers.Count)
{
allPlayersHaveVotedForCurrentQuestion = true;
}
} }
private void UpdateVoters() /// <summary>
/// Updates the voters for a specific proposition frame based on the provided proposition data.
/// If the proposition data is not null, it retrieves the list of voters and updates the frame.
/// If there is no proposition data, it logs a message indicating that the user has not given a proposition.
/// </summary>
/// <param name="proposition">The PropositionFrame to update.</param>
/// <param name="propositionData">The Proposition data used to update voters for the proposition frame.</param>
private void UpdatePropositionVoters(PropositionFrame proposition, Proposition propositionData)
{ {
if (currentQuestion.propositions.Count == 0) //manage if there is no propositons if (propositionData != null)
return;
if (currentQuestion.propositions[0] != null)
{ {
List<Player> playersThatHasVotedForFirstProposition = new List<Player>(); List<Player> voters = GetVotersForProposition(propositionData);
if (currentQuestion.propositions[0].voters != null) proposition.UpdateVoters(voters);
{
foreach (string playerId in currentQuestion.propositions[0].voters)
{
playersThatHasVotedForFirstProposition.Add(currentPlayers[playerId]);
} }
proposition1.UpdateVoters(playersThatHasVotedForFirstProposition); else
{
Debug.Log("User has given no proposition", this);
// Handle the case when there is no proposition
} }
} }
if (currentQuestion.propositions[1] != null) /// <summary>
/// Retrieves the list of players who have voted for a specific proposition based on the provided proposition data.
/// It checks if the proposition data contains a list of voters and then looks up player information in the current players dictionary.
/// </summary>
/// <param name="propositionData">The Proposition data for which to retrieve voters.</param>
/// <returns>The list of players who voted for the proposition.</returns>
private List<Player> GetVotersForProposition(Proposition propositionData)
{ {
List<Player> playersThatHasVotedForSecondProposition = new List<Player>(); List<Player> voters = new List<Player>();
if (currentQuestion.propositions[1].voters != null)
if (propositionData.voters != null)
{ {
foreach (string playerId in currentQuestion.propositions[1].voters) foreach (string playerId in propositionData.voters)
{ {
playersThatHasVotedForSecondProposition.Add(currentPlayers[playerId]); voters.Add(currentPlayers[playerId]);
} Debug.Log($"updating number of voters for: {propositionData.owner.name}'s propositions. They are now {voters.Count}.");
proposition2.UpdateVoters(playersThatHasVotedForSecondProposition);
} }
} }
return voters;
} }
} }