WIP reconfiguration

This commit is contained in:
Dawid Pietrykowski 2022-09-08 00:43:34 +02:00
parent 3270cc0b10
commit f2f74c07a3
3 changed files with 592 additions and 70 deletions

View File

@ -140,7 +140,7 @@ GameObject:
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
m_IsActive: 0
--- !u!224 &44030830
RectTransform:
m_ObjectHideFlags: 0
@ -157,7 +157,7 @@ RectTransform:
- {fileID: 369720528}
- {fileID: 70943246}
m_Father: {fileID: 107864146}
m_RootOrder: 4
m_RootOrder: 3
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0.5, y: 0.5}
m_AnchorMax: {x: 0.5, y: 0.5}
@ -429,8 +429,7 @@ RectTransform:
m_LocalScale: {x: 0, y: 0, z: 0}
m_ConstrainProportionsScale: 0
m_Children:
- {fileID: 1365705406}
- {fileID: 799530712}
- {fileID: 1347097429}
- {fileID: 489742540}
- {fileID: 1540189690}
- {fileID: 44030830}
@ -677,6 +676,105 @@ Transform:
m_CorrespondingSourceObject: {fileID: 13560301962479320, guid: dbfe1689c60c23f129ff74156ff8e6a8, type: 3}
m_PrefabInstance: {fileID: 440632606}
m_PrefabAsset: {fileID: 0}
--- !u!1 &441283503
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 441283504}
- component: {fileID: 441283505}
m_Layer: 5
m_Name: Reconfiguration toggle
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &441283504
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 441283503}
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: 719677295}
- {fileID: 1040615156}
m_Father: {fileID: 1347097429}
m_RootOrder: 3
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: 250, y: 20}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &441283505
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 441283503}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 9085046f02f69544eb97fd06b6048fe2, 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: 719677296}
toggleTransition: 1
graphic: {fileID: 1690960237}
m_Group: {fileID: 0}
onValueChanged:
m_PersistentCalls:
m_Calls:
- m_Target: {fileID: 1300650500}
m_TargetAssemblyTypeName: Parking.ParkingManager, Assembly-CSharp
m_MethodName: ReconfigurationToggle
m_Mode: 6
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_IsOn: 1
--- !u!1 &489742539
GameObject:
m_ObjectHideFlags: 0
@ -708,7 +806,7 @@ RectTransform:
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 107864146}
m_RootOrder: 2
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}
@ -1176,6 +1274,83 @@ Transform:
m_Father: {fileID: 0}
m_RootOrder: 9
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!1 &719677294
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 719677295}
- component: {fileID: 719677297}
- component: {fileID: 719677296}
m_Layer: 5
m_Name: Background
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &719677295
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 719677294}
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: 1690960236}
m_Father: {fileID: 441283504}
m_RootOrder: 0
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 1}
m_AnchorMax: {x: 0, y: 1}
m_AnchoredPosition: {x: 10, y: -10}
m_SizeDelta: {x: 20, y: 20}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &719677296
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 719677294}
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: 10905, guid: 0000000000000000f000000000000000, type: 0}
m_Type: 1
m_PreserveAspect: 0
m_FillCenter: 1
m_FillMethod: 4
m_FillAmount: 1
m_FillClockwise: 1
m_FillOrigin: 0
m_UseSpriteMesh: 0
m_PixelsPerUnitMultiplier: 1
--- !u!222 &719677297
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 719677294}
m_CullTransparentMesh: 1
--- !u!1 &762547645
GameObject:
m_ObjectHideFlags: 0
@ -1337,20 +1512,19 @@ RectTransform:
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 799530711}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
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: 820792684}
- {fileID: 861769592}
m_Father: {fileID: 107864146}
m_RootOrder: 1
m_Father: {fileID: 1347097429}
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: -300, y: -261.92}
m_SizeDelta: {x: 239.464, y: 69.846}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 0, y: 0}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 250, y: 60}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &799530713
MonoBehaviour:
@ -1611,13 +1785,13 @@ RectTransform:
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 799530712}
m_Father: {fileID: 1347097429}
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: 293.212, y: 0}
m_SizeDelta: {x: 254.411, y: 69.844}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 0, y: 0}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 250, y: 60}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &861769593
MonoBehaviour:
@ -1856,6 +2030,86 @@ CanvasRenderer:
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 934996861}
m_CullTransparentMesh: 1
--- !u!1 &1040615155
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 1040615156}
- component: {fileID: 1040615158}
- component: {fileID: 1040615157}
m_Layer: 5
m_Name: Label
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &1040615156
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1040615155}
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: 441283504}
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: 9, y: -0.5}
m_SizeDelta: {x: -28, y: -3}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &1040615157
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1040615155}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 0}
m_Color: {r: 0, g: 0, b: 0, 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_FontData:
m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0}
m_FontSize: 14
m_FontStyle: 0
m_BestFit: 0
m_MinSize: 10
m_MaxSize: 40
m_Alignment: 0
m_AlignByGeometry: 0
m_RichText: 1
m_HorizontalOverflow: 0
m_VerticalOverflow: 0
m_LineSpacing: 1
m_Text: Rekonfiguracja aktywna
--- !u!222 &1040615158
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1040615155}
m_CullTransparentMesh: 1
--- !u!1 &1079236959
GameObject:
m_ObjectHideFlags: 0
@ -2503,6 +2757,75 @@ MonoBehaviour:
carPrefab: {fileID: 6930264687477137091, guid: e78fd5078b51c856ea96f94520af409b, type: 3}
mainPlanContainer: {fileID: 557435656}
emergencyPlanContainer: {fileID: 632826360}
reconfigurationToggle: {fileID: 441283505}
defaultPath: Assets/Data/Tablica1.csv
--- !u!1 &1347097428
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 1347097429}
- component: {fileID: 1347097430}
m_Layer: 5
m_Name: GameObject
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &1347097429
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1347097428}
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: 799530712}
- {fileID: 861769592}
- {fileID: 1365705406}
- {fileID: 441283504}
m_Father: {fileID: 107864146}
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: -261.92}
m_SizeDelta: {x: 1300, y: 90}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &1347097430
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1347097428}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 30649d3a9faa99c48a7b1166b86bf2a0, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Padding:
m_Left: 0
m_Right: 0
m_Top: 0
m_Bottom: 0
m_ChildAlignment: 4
m_Spacing: 0
m_ChildForceExpandWidth: 1
m_ChildForceExpandHeight: 1
m_ChildControlWidth: 0
m_ChildControlHeight: 0
m_ChildScaleWidth: 0
m_ChildScaleHeight: 0
m_ReverseArrangement: 0
--- !u!1001 &1356388471
PrefabInstance:
m_ObjectHideFlags: 0
@ -2591,19 +2914,19 @@ RectTransform:
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1365705405}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
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: 1092905955}
m_Father: {fileID: 107864146}
m_RootOrder: 0
m_Father: {fileID: 1347097429}
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: 300, y: -261.92}
m_SizeDelta: {x: 239.464, y: 69.846}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 0, y: 0}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 250, y: 60}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &1365705407
MonoBehaviour:
@ -2882,7 +3205,7 @@ RectTransform:
m_Children:
- {fileID: 762547646}
m_Father: {fileID: 107864146}
m_RootOrder: 3
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}
@ -3083,6 +3406,82 @@ Transform:
m_CorrespondingSourceObject: {fileID: 13560301962479320, guid: 547c30e1f8f23f122968c9f6363ea48d, type: 3}
m_PrefabInstance: {fileID: 1623836583}
m_PrefabAsset: {fileID: 0}
--- !u!1 &1690960235
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 1690960236}
- component: {fileID: 1690960238}
- component: {fileID: 1690960237}
m_Layer: 5
m_Name: Checkmark
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &1690960236
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1690960235}
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: 719677295}
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: 20, y: 20}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &1690960237
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1690960235}
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: 10901, guid: 0000000000000000f000000000000000, type: 0}
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!222 &1690960238
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1690960235}
m_CullTransparentMesh: 1
--- !u!1 &1728782014
GameObject:
m_ObjectHideFlags: 0

View File

@ -50,6 +50,7 @@ namespace Parking
public bool Reserved = false;
public int ReservedPriority = 0;
public Size Size;
public TimeSpan LastReconfiguration = TimeSpan.Zero;
public Spot(Size size, bool flipped)
{

View File

@ -3,6 +3,7 @@ using System.Collections.Generic;
using System.Linq;
using TMPro;
using UnityEngine;
using UnityEngine.UI;
namespace Parking
{
@ -31,6 +32,8 @@ namespace Parking
[SerializeField] public GameObject carPrefab;
[SerializeField] public Transform mainPlanContainer;
[SerializeField] public Transform emergencyPlanContainer;
[SerializeField] public Toggle reconfigurationToggle;
[SerializeField] public string defaultPath = "Assets/Data/Tablica2.csv";
private readonly float[] _spotHeights = {4f, 4.5f, 5f, 7.5f};
@ -38,6 +41,7 @@ namespace Parking
{new List<Spot>(), new List<Spot>(), new List<Spot>(), new List<Spot>()};
private bool _emergencyActivated;
private bool _reconfigurationActive = true;
private int _initialConfigurationSpotCount;
private int[,] _initialSolution;
@ -52,15 +56,26 @@ namespace Parking
private void Start()
{
_spotPrefabs = new List<GameObject> {spotPrefabA, spotPrefabB, spotPrefabC, spotPrefabD};
startPanel.SetActive(true);
reconfigurationToggle.onValueChanged.AddListener(ReconfigurationToggle);
}
public void ReconfigurationToggle(bool value)
{
_reconfigurationActive = value;
Debug.Log($"Reconfiguration {(value ? "activated" : "deactivated")}");
}
public void ReadDataButtonClick()
{
if (!DataImporter.ReadFile(pathText.text.Replace("\u200B", ""))) {
string path = pathText.text.Replace("\u200B", "");
if (path.Length == 0)
path = defaultPath;
if (!DataImporter.ReadFile(path)) {
notFoundPanel.SetActive(true);
return;
}
InitiateManager();
startPanel.SetActive(false);
}
@ -134,7 +149,8 @@ namespace Parking
if (_emergencyActivated)
return;
ReconfigureSpots();
if(_reconfigurationActive)
ReconfigureSpots();
foreach (Driver driver in DataImporter.Drivers) {
// TODO: Check if car can stay before other reservation - may not work for priority-based reservations
@ -147,7 +163,7 @@ namespace Parking
&& !driver.Parked && !driver.Rejected && _currentTime <= driver.Times[3].TimeOfDay;
if (triesToPark && !driver.Parked && !driver.Rejected) {
if (!PlaceCarOnParking(driver)) {
if (TryReconfigureSpotForSize(driver.Size)) {
if (_reconfigurationActive && TryReconfigureSpotForSize(driver.Size)) {
if (!PlaceCarOnParking(driver)) {
Debug.Log($"Placing failed for car {driver.Number} size {driver.Size}");
driver.Rejected = true;
@ -206,7 +222,7 @@ namespace Parking
private int GetReservedSpotCount(int priority, Size size)
{
int count = 0;
foreach (var list in _spotMap)
foreach (List<Spot> list in _spotMap)
foreach (Spot spot in list)
if (spot.Size == size && spot.Reserved && spot.ReservedPriority == priority)
count++;
@ -216,7 +232,7 @@ namespace Parking
private bool FindReservedSpot(Driver driver, out Spot spot)
{
foreach (var list in _spotMap)
foreach (List<Spot> list in _spotMap)
foreach (Spot spot1 in list)
if (spot1.Reserved && spot1.ReservedPriority == driver.Priority) {
spot = spot1;
@ -240,7 +256,7 @@ namespace Parking
}
foreach (var t in _spotMap)
foreach (List<Spot> t in _spotMap)
foreach (Spot spot in t) {
bool spotAvailable = spot.Size == driver.Size && spot.Free &&
(spot.ParkingDirection == driver.ParkingPreference ||
@ -253,7 +269,7 @@ namespace Parking
}
}
foreach (var t in _spotMap)
foreach (List<Spot> t in _spotMap)
foreach (Spot spot in t)
if (spot.Size == driver.Size && spot.Free && !spot.Reserved) {
PlaceDriverOnSpot(driver, spot);
@ -288,7 +304,7 @@ namespace Parking
private void ReconfigureSpots()
{
int[] freeSpots = GetFreeSpotCount();
var nextCars = GetNextCars(1);
List<Driver> nextCars = GetNextCars(1);
int[] plannedSpots = {0, 0, 0, 0};
foreach (Driver driver in nextCars)
plannedSpots[(int) driver.Size]++;
@ -301,7 +317,7 @@ namespace Parking
Debug.Log($"Needed spots = {neededSpots[0]} {neededSpots[1]} {neededSpots[2]} {neededSpots[3]}");
Debug.Log("Attempting reconfiguration...");
var spotlessCars = new List<Driver>();
List<Driver> spotlessCars = new List<Driver>();
// Filter drivers by assigning free space
foreach (Driver nextCar in nextCars)
@ -311,21 +327,24 @@ namespace Parking
spotlessCars.Add(nextCar);
foreach (Driver nextCar in spotlessCars) {
foreach (Driver nextCar in spotlessCars)
TryReconfigureSpotForSize(nextCar.Size);
}
}
}
private bool TryReconfigureSpotForSize(Size newSize)
{
foreach (var currentLaneSpots in _spotMap)
foreach (List<Spot> currentLaneSpots in _spotMap)
foreach (Spot spot in currentLaneSpots) {
if (spot.Size > newSize && spot.Free && spot.Size != Size.D && !spot.Reserved) {
if (GetSpotCountOfSize(Size.A) <= 2 && spot.Size == Size.A)
continue;
if (GetSpotCountOfSize(Size.B) <= 2 && spot.Size == Size.B)
continue;
if (!(spot.Free && spot.Size != Size.D)) // && !spot.Reserved))
continue;
if (GetSpotCountOfSize(Size.A) <= 2 && spot.Size == Size.A)
continue;
if (GetSpotCountOfSize(Size.B) <= 2 && spot.Size == Size.B)
continue;
if (spot.LastReconfiguration == _currentTime)
continue;
if (spot.Size > newSize) {
int size = (int) newSize;
@ -349,31 +368,77 @@ namespace Parking
Vector3 newPosition = position + offset;
if (!spot.Perpendicular) {
var allBorders = new List<float>();
foreach (Spot spot1 in currentLaneSpots) {
if (spot1 == spot)
continue;
Vector3 spotPosition = spot1.GameObject.transform.position;
float sizeOffset = _spotHeights[(int) spot1.Size] / 2.0f;
allBorders.Add(spotPosition.x + sizeOffset);
allBorders.Add(spotPosition.x - sizeOffset);
float newX = GetNextBorderHorizontal(position, spot, true) -
_spotHeights[(int) spot.Size] / 2.0f;
newPosition = new Vector3(newX,
newPosition.y, newPosition.z);
}
else {
float newX = GetNextBorderHorizontal(position, spot, true) - 2.25f / 2.0f;
if (spot.Lane == 0) {
float xRelativeToRight = newX - Width / 2.0f - 2.25f / 2.0f;
xRelativeToRight -= (xRelativeToRight + 2.25f / 2.0f) % 2.25f;
newX = xRelativeToRight + Width / 2.0f;
}
else {
float xRelativeToLeft = newX + Width / 2.0f;
xRelativeToLeft -= (xRelativeToLeft + 2.25f / 2.0f) % 2.25f;
newX = xRelativeToLeft - Width / 2.0f;
}
allBorders.Sort();
foreach (float adjacentBorder in allBorders)
if (adjacentBorder > position.x) {
newPosition = new Vector3(adjacentBorder -
_spotHeights[size] / 2.0f,
newPosition.y, newPosition.z);
break;
}
newPosition = new Vector3(newX,
newPosition.y, newPosition.z);
}
// TODO: check how much space to right to push
spot.GameObject = Instantiate(_spotPrefabs[size],
newPosition, rotation, mainPlanContainer);
spot.LastReconfiguration = _currentTime;
return true;
}
if (spot.Size < newSize) {
if (!spot.Perpendicular)
continue;
int size = (int) newSize;
float diff = (_spotHeights[(int) spot.Size] - _spotHeights[size]) / 2.0f;
Vector3 position = spot.GameObject.transform.position;
float spotBorder;
float thisSizeOffset;
if (spot.Perpendicular)
thisSizeOffset = _spotHeights[(int) spot.Size] / 2.0f;
else
thisSizeOffset = 2.25f;
if (!spot.AlignToTop)
spotBorder = position.y + thisSizeOffset;
else
spotBorder = position.y - thisSizeOffset;
float nextBorder = GetNextBorderVectical(position, spot.Lane, spot.Perpendicular, newSize, !spot.AlignToTop);
if (Math.Abs(spotBorder - nextBorder) < 5.5f)
continue;
spot.Size = (Size) size;
Quaternion rotation = Quaternion.identity;
if (spot.GameObject != null) {
position = spot.GameObject.transform.position;
rotation = spot.GameObject.transform.rotation;
Destroy(spot.GameObject);
}
spot.Reserved = false;
if (!spot.AlignToTop)
diff *= -1;
Vector3 offset = spot.Perpendicular ? new Vector3(0, diff, 0) : new Vector3(-diff, 0, 0);
Vector3 newPosition = position + offset;
spot.GameObject = Instantiate(_spotPrefabs[size],
newPosition, rotation, mainPlanContainer);
spot.LastReconfiguration = _currentTime;
return true;
}
}
@ -381,11 +446,68 @@ namespace Parking
return false;
}
private float GetNextBorderVectical(Vector3 position, int lane, bool perpendicular, Size size, bool up)
{
float minX = position.x - (perpendicular ? 2.25f : _spotHeights[(int) size]);
float maxX = position.x + (perpendicular ? 2.25f : _spotHeights[(int) size]);
List<float> allBorders = new();
List<Spot> targetLane = up ? _spotMap[lane + 1] : _spotMap[lane - 1];
foreach (Spot spot1 in targetLane) {
Vector3 targetSpotPosition = spot1.GameObject.transform.position;
if (targetSpotPosition.x < minX || targetSpotPosition.x > maxX)
continue;
float sizeOffset;
if (spot1.Perpendicular)
sizeOffset = _spotHeights[(int) spot1.Size] / 2.0f;
else
sizeOffset = 2.25f;
if (up)
allBorders.Add(targetSpotPosition.y - sizeOffset);
else
allBorders.Add(targetSpotPosition.y + sizeOffset);
}
if (allBorders.Count == 0)
return up ? Height / 2.0f : -Height / 2.0f;
float nextBorder = up ? allBorders.Min() : allBorders.Max();
return nextBorder;
}
private float GetNextBorderHorizontal(Vector3 position, Spot spot, bool right)
{
List<float> allBorders = new List<float>();
List<Spot> targetLane = _spotMap[spot.Lane];
foreach (Spot spot1 in targetLane) {
if (spot1 == spot)
continue;
Vector3 spotPosition = spot1.GameObject.transform.position;
float sizeOffset;
if (spot1.Perpendicular)
sizeOffset = 2.25f / 2.0f;
else
sizeOffset = _spotHeights[(int) spot1.Size] / 2.0f;
allBorders.Add(spotPosition.x + sizeOffset);
allBorders.Add(spotPosition.x - sizeOffset);
}
allBorders.Sort();
foreach (float adjacentBorder in allBorders)
if (adjacentBorder > position.x)
return adjacentBorder;
if (spot.Perpendicular)
return position.x + (right ? 1 : -1) * _spotHeights[(int) spot.Size] / 2.0f;
return position.x + (right ? 1 : -1) * 2.25f / 2.0f;
}
private int GetSpotCountOfSize(Size size)
{
int count = 0;
foreach (var t in _spotMap)
foreach (List<Spot> t in _spotMap)
foreach (Spot spot in t)
if (spot.Size == size)
count++;
@ -395,7 +517,7 @@ namespace Parking
private int[] GetFreeSpotCount()
{
int[] freeSpots = {0, 0, 0, 0};
foreach (var t in _spotMap)
foreach (List<Spot> t in _spotMap)
foreach (Spot spot in t)
if (spot.Free)
freeSpots[(int) spot.Size]++;
@ -404,7 +526,7 @@ namespace Parking
private List<Driver> GetNextCars(int steps)
{
var nextCars = new List<Driver>();
List<Driver> nextCars = new List<Driver>();
TimeSpan updatedTime = _currentTime + TimeSpan.FromMinutes(stepTime * steps);
foreach (Driver driver in DataImporter.Drivers)
if (updatedTime <= driver.Times[1].TimeOfDay &&
@ -417,7 +539,7 @@ namespace Parking
private void ArrangeSpots(int[,] spotsCreated)
{
var spotMap = GenerateSpotMap(spotsCreated);
List<List<Spot>> spotMap = GenerateSpotMap(spotsCreated);
float[] spotSizes = {4, 4.5f, 5, 0};
float maxP3 = 0;
@ -431,7 +553,7 @@ namespace Parking
// float maxP3 = spotMap[2].Count == 0 ? 0 : _spotHeights[(int) spotMap[2].Max().Size];
// float maxP2 = spotMap[1].Count == 0 ? 0 : _spotHeights[(int) spotMap[1].Max().Size];
var prefabs = new List<GameObject> {spotPrefabA, spotPrefabB, spotPrefabC, spotPrefabD};
List<GameObject> prefabs = new List<GameObject> {spotPrefabA, spotPrefabB, spotPrefabC, spotPrefabD};
for (int i = 0; i < 4; i++) {
float currentY;
@ -566,7 +688,7 @@ namespace Parking
private List<List<Spot>> GenerateSpotMap(int[,] spotsCreated)
{
foreach (var list in _spotMap) {
foreach (List<Spot> list in _spotMap) {
foreach (Spot spot in list)
if (spot.GameObject != null)
Destroy(spot.GameObject);