Skip to content

Commit 701a85d

Browse files
committed
feat(core): add tutorial 43 code
1 parent 08681d4 commit 701a85d

8 files changed

Lines changed: 272 additions & 16 deletions

File tree

Assets/Scenes/Core.unity

Lines changed: 158 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,81 @@ MonoBehaviour:
166166
m_Script: {fileID: 11500000, guid: 4b1293220f71f4ad59dd157eefa42dfd, type: 3}
167167
m_Name:
168168
m_EditorClassIdentifier:
169+
--- !u!1 &245256337
170+
GameObject:
171+
m_ObjectHideFlags: 0
172+
m_CorrespondingSourceObject: {fileID: 0}
173+
m_PrefabInstance: {fileID: 0}
174+
m_PrefabAsset: {fileID: 0}
175+
serializedVersion: 6
176+
m_Component:
177+
- component: {fileID: 245256338}
178+
- component: {fileID: 245256340}
179+
- component: {fileID: 245256339}
180+
m_Layer: 5
181+
m_Name: SceneTransitioner
182+
m_TagString: Untagged
183+
m_Icon: {fileID: 0}
184+
m_NavMeshLayer: 0
185+
m_StaticEditorFlags: 0
186+
m_IsActive: 1
187+
--- !u!224 &245256338
188+
RectTransform:
189+
m_ObjectHideFlags: 0
190+
m_CorrespondingSourceObject: {fileID: 0}
191+
m_PrefabInstance: {fileID: 0}
192+
m_PrefabAsset: {fileID: 0}
193+
m_GameObject: {fileID: 245256337}
194+
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
195+
m_LocalPosition: {x: 0, y: 0, z: 0}
196+
m_LocalScale: {x: 1, y: 1, z: 1}
197+
m_Children: []
198+
m_Father: {fileID: 983291388}
199+
m_RootOrder: 0
200+
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
201+
m_AnchorMin: {x: 0, y: 0}
202+
m_AnchorMax: {x: 1, y: 1}
203+
m_AnchoredPosition: {x: 0, y: 0}
204+
m_SizeDelta: {x: 0, y: 0}
205+
m_Pivot: {x: 0.5, y: 0.5}
206+
--- !u!114 &245256339
207+
MonoBehaviour:
208+
m_ObjectHideFlags: 0
209+
m_CorrespondingSourceObject: {fileID: 0}
210+
m_PrefabInstance: {fileID: 0}
211+
m_PrefabAsset: {fileID: 0}
212+
m_GameObject: {fileID: 245256337}
213+
m_Enabled: 1
214+
m_EditorHideFlags: 0
215+
m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
216+
m_Name:
217+
m_EditorClassIdentifier:
218+
m_Material: {fileID: 0}
219+
m_Color: {r: 0, g: 0, b: 0, a: 1}
220+
m_RaycastTarget: 0
221+
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
222+
m_Maskable: 1
223+
m_OnCullStateChanged:
224+
m_PersistentCalls:
225+
m_Calls: []
226+
m_Sprite: {fileID: 0}
227+
m_Type: 1
228+
m_PreserveAspect: 0
229+
m_FillCenter: 1
230+
m_FillMethod: 4
231+
m_FillAmount: 1
232+
m_FillClockwise: 1
233+
m_FillOrigin: 0
234+
m_UseSpriteMesh: 0
235+
m_PixelsPerUnitMultiplier: 1
236+
--- !u!222 &245256340
237+
CanvasRenderer:
238+
m_ObjectHideFlags: 0
239+
m_CorrespondingSourceObject: {fileID: 0}
240+
m_PrefabInstance: {fileID: 0}
241+
m_PrefabAsset: {fileID: 0}
242+
m_GameObject: {fileID: 245256337}
243+
m_CullTransparentMesh: 1
169244
--- !u!1 &262929173
170245
GameObject:
171246
m_ObjectHideFlags: 0
@@ -275,3 +350,86 @@ MonoBehaviour:
275350
m_Script: {fileID: 11500000, guid: 8e88161851c4b4b60890f0b79dccd828, type: 3}
276351
m_Name:
277352
m_EditorClassIdentifier:
353+
sceneTransitioner: {fileID: 245256339}
354+
--- !u!1 &983291384
355+
GameObject:
356+
m_ObjectHideFlags: 0
357+
m_CorrespondingSourceObject: {fileID: 0}
358+
m_PrefabInstance: {fileID: 0}
359+
m_PrefabAsset: {fileID: 0}
360+
serializedVersion: 6
361+
m_Component:
362+
- component: {fileID: 983291388}
363+
- component: {fileID: 983291387}
364+
- component: {fileID: 983291386}
365+
m_Layer: 5
366+
m_Name: Canvas
367+
m_TagString: Untagged
368+
m_Icon: {fileID: 0}
369+
m_NavMeshLayer: 0
370+
m_StaticEditorFlags: 0
371+
m_IsActive: 1
372+
--- !u!114 &983291386
373+
MonoBehaviour:
374+
m_ObjectHideFlags: 0
375+
m_CorrespondingSourceObject: {fileID: 0}
376+
m_PrefabInstance: {fileID: 0}
377+
m_PrefabAsset: {fileID: 0}
378+
m_GameObject: {fileID: 983291384}
379+
m_Enabled: 1
380+
m_EditorHideFlags: 0
381+
m_Script: {fileID: 11500000, guid: 0cd44c1031e13a943bb63640046fad76, type: 3}
382+
m_Name:
383+
m_EditorClassIdentifier:
384+
m_UiScaleMode: 0
385+
m_ReferencePixelsPerUnit: 100
386+
m_ScaleFactor: 1
387+
m_ReferenceResolution: {x: 800, y: 600}
388+
m_ScreenMatchMode: 0
389+
m_MatchWidthOrHeight: 0
390+
m_PhysicalUnit: 3
391+
m_FallbackScreenDPI: 96
392+
m_DefaultSpriteDPI: 96
393+
m_DynamicPixelsPerUnit: 1
394+
m_PresetInfoIsWorld: 0
395+
--- !u!223 &983291387
396+
Canvas:
397+
m_ObjectHideFlags: 0
398+
m_CorrespondingSourceObject: {fileID: 0}
399+
m_PrefabInstance: {fileID: 0}
400+
m_PrefabAsset: {fileID: 0}
401+
m_GameObject: {fileID: 983291384}
402+
m_Enabled: 1
403+
serializedVersion: 3
404+
m_RenderMode: 0
405+
m_Camera: {fileID: 0}
406+
m_PlaneDistance: 100
407+
m_PixelPerfect: 0
408+
m_ReceivesEvents: 1
409+
m_OverrideSorting: 0
410+
m_OverridePixelPerfect: 0
411+
m_SortingBucketNormalizedSize: 0
412+
m_AdditionalShaderChannelsFlag: 0
413+
m_SortingLayerID: 0
414+
m_SortingOrder: 32767
415+
m_TargetDisplay: 0
416+
--- !u!224 &983291388
417+
RectTransform:
418+
m_ObjectHideFlags: 0
419+
m_CorrespondingSourceObject: {fileID: 0}
420+
m_PrefabInstance: {fileID: 0}
421+
m_PrefabAsset: {fileID: 0}
422+
m_GameObject: {fileID: 983291384}
423+
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
424+
m_LocalPosition: {x: 0, y: 0, z: 0}
425+
m_LocalScale: {x: 0, y: 0, z: 0}
426+
m_Children:
427+
- {fileID: 245256338}
428+
m_Father: {fileID: 0}
429+
m_RootOrder: 3
430+
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
431+
m_AnchorMin: {x: 0, y: 0}
432+
m_AnchorMax: {x: 0, y: 0}
433+
m_AnchoredPosition: {x: 0, y: 0}
434+
m_SizeDelta: {x: 0, y: 0}
435+
m_Pivot: {x: 0, y: 0}

Assets/Scenes/MainMenu.unity

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3024,7 +3024,7 @@ GameObject:
30243024
- component: {fileID: 1474452007}
30253025
m_Layer: 0
30263026
m_Name: Main Camera
3027-
m_TagString: MainCamera
3027+
m_TagString: Untagged
30283028
m_Icon: {fileID: 0}
30293029
m_NavMeshLayer: 0
30303030
m_StaticEditorFlags: 0

Assets/Scripts/Core/CoreBooter.cs

Lines changed: 70 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ public class CoreBooter : MonoBehaviour
77
{
88
public static CoreBooter instance;
99

10+
public UnityEngine.UI.Image sceneTransitioner;
11+
1012
private void Awake()
1113
{
1214
if (instance == null)
@@ -15,18 +17,82 @@ private void Awake()
1517

1618
private void Start()
1719
{
18-
LoadMap("Map1");
20+
LoadMenu();
1921
}
2022

23+
public void LoadMenu() => StartCoroutine(_SwitchingScene("menu"));
2124
public void LoadMap(string mapReference)
2225
{
2326
MapData d = Resources.Load<MapData>($"ScriptableObjects/Maps/{mapReference}");
2427
CoreDataHandler.instance.SetMapData(d);
2528
string s = d.sceneName;
26-
SceneManager.LoadSceneAsync(s, LoadSceneMode.Additive).completed += (_) =>
29+
StartCoroutine(_SwitchingScene("game", s));
30+
}
31+
32+
private IEnumerator _SwitchingScene(string to, string map = "")
33+
{
34+
sceneTransitioner.color = Color.clear;
35+
36+
float t = 0;
37+
while (t < 1f)
38+
{
39+
sceneTransitioner.color = Color.Lerp(Color.clear, Color.black, t);
40+
t += Time.deltaTime;
41+
yield return null;
42+
}
43+
44+
AsyncOperation op;
45+
if (to == "menu")
46+
op = _LoadMenu();
47+
else
48+
op = _LoadMap(map);
49+
50+
yield return new WaitUntil(() => op.isDone);
51+
52+
t = 0;
53+
while (t < 1f)
54+
{
55+
sceneTransitioner.color = Color.Lerp(Color.black, Color.clear, t);
56+
t += Time.deltaTime;
57+
yield return null;
58+
}
59+
60+
sceneTransitioner.color = Color.clear;
61+
}
62+
63+
private AsyncOperation _LoadMap(string map)
64+
{
65+
AsyncOperation op = SceneManager.LoadSceneAsync(map, LoadSceneMode.Additive);
66+
AudioListener prevListener = Object.FindObjectOfType<AudioListener>();
67+
op.completed += (_) =>
68+
{
69+
if (prevListener != null) prevListener.enabled = false;
70+
SceneManager.SetActiveScene(SceneManager.GetSceneByName(map));
71+
Scene s = SceneManager.GetSceneByName("MainMenu");
72+
if (s != null && s.IsValid())
73+
SceneManager.LoadSceneAsync("GameScene", LoadSceneMode.Additive).completed += (_) =>
74+
{
75+
SceneManager.UnloadSceneAsync(s);
76+
};
77+
else
78+
SceneManager.LoadSceneAsync("GameScene", LoadSceneMode.Additive);
79+
};
80+
return op;
81+
}
82+
83+
private AsyncOperation _LoadMenu()
84+
{
85+
AudioListener prevListener = Object.FindObjectOfType<AudioListener>();
86+
if (prevListener != null) prevListener.enabled = false;
87+
AsyncOperation op = SceneManager.LoadSceneAsync("MainMenu", LoadSceneMode.Additive);
88+
op.completed += (_) =>
2789
{
28-
SceneManager.SetActiveScene(SceneManager.GetSceneByName(s));
29-
SceneManager.LoadSceneAsync("GameScene", LoadSceneMode.Additive);
90+
Scene s = SceneManager.GetSceneByName("GameScene");
91+
if (s != null && s.IsValid())
92+
SceneManager.UnloadSceneAsync(s);
93+
94+
SceneManager.SetActiveScene(SceneManager.GetSceneByName("MainMenu"));
3095
};
96+
return op;
3197
}
3298
}

Assets/Scripts/Core/CoreDataHandler.cs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,11 @@ public class CoreDataHandler : MonoBehaviour
66
{
77
public static CoreDataHandler instance;
88

9+
private string _gameUID;
910
private MapData _mapData;
1011

11-
public string Scene => _mapData.sceneName;
12+
public string GameUID => _gameUID;
13+
public string Scene => _mapData != null ? _mapData.sceneName : null;
1214
public float MapSize => _mapData.mapSize;
1315

1416
private void Awake()
@@ -17,6 +19,11 @@ private void Awake()
1719
instance = this;
1820
}
1921

22+
public void SetGameUID(MapData d)
23+
{
24+
_gameUID = $"{d.sceneName}__{System.Guid.NewGuid().ToString()}";
25+
}
26+
2027
public void SetMapData(MapData d)
2128
{
2229
_mapData = d;

Assets/Scripts/Managers/MainMenuManager.cs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -213,6 +213,22 @@ private void _AddScenePickPlayerToggleListener(Button b, Transform t, int i)
213213
b.onClick.AddListener(() => _TogglePlayer(t, i));
214214
}
215215

216+
public void StartNewGame()
217+
{
218+
CoreDataHandler.instance.SetGameUID(_selectedMap);
219+
220+
// save player parameters for this map
221+
// from the menu setup
222+
GamePlayersParameters p = new GamePlayersParameters();
223+
p.players = _playersData
224+
.Where((KeyValuePair<int, PlayerData> p) => _activePlayers[p.Key])
225+
.Select((KeyValuePair<int, PlayerData> p) => p.Value)
226+
.ToArray();
227+
p.myPlayerId = 0;
228+
p.SaveToFile($"Games/{CoreDataHandler.instance.GameUID}/PlayerParameters", true);
229+
230+
CoreBooter.instance.LoadMap(_selectedMap.sceneName);
231+
}
216232
#endregion
217233

218234
}

Assets/Scripts/Tools/BinarySerializableData.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,14 +18,14 @@ public class BinarySerializableData
1818

1919
public Dictionary<string, object> properties;
2020

21-
public BinarySerializableData(ScriptableObject obj, List<string> fieldsToSerialize)
21+
public BinarySerializableData(ScriptableObject obj, List<string> fieldsToSerialize, bool serializeAll = false)
2222
{
2323
properties = new Dictionary<string, object>();
2424

2525
Type T = obj.GetType();
2626
foreach (FieldInfo field in T.GetFields())
2727
{
28-
if (!fieldsToSerialize.Contains(field.Name))
28+
if (!serializeAll && !fieldsToSerialize.Contains(field.Name))
2929
continue;
3030

3131
object value;

Assets/Scripts/Tools/BinarySerializableScriptableObject.cs

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -36,21 +36,25 @@ public void ToggleSerializeField(string fieldName)
3636
_fieldsToSerialize.Add(fieldName);
3737
}
3838

39-
public void SaveToFile()
39+
public void SaveToFile(string fileName = null, bool serializeAll = false)
4040
{
4141
string dirPath = Path.Combine(
4242
Application.persistentDataPath,
4343
_scriptableObjectsDataDirectory
4444
);
45-
string filePath = Path.Combine(dirPath, $"{name}.data");
45+
string filePath = Path.Combine(
46+
dirPath,
47+
$"{(fileName == null ? name : fileName)}.data");
4648

47-
if (!Directory.Exists(dirPath))
48-
Directory.CreateDirectory(dirPath);
49+
string fullDirPath = Path.GetDirectoryName(filePath);
50+
if (!Directory.Exists(fullDirPath))
51+
Directory.CreateDirectory(fullDirPath);
4952

5053
BinaryFormatter formatter = new BinaryFormatter();
5154
FileStream stream = new FileStream(filePath, FileMode.Create);
5255

53-
BinarySerializableData data = new BinarySerializableData(this, _fieldsToSerialize);
56+
BinarySerializableData data = new BinarySerializableData(
57+
this, _fieldsToSerialize, serializeAll);
5458
try
5559
{
5660
formatter.Serialize(stream, data.properties);
@@ -65,12 +69,12 @@ public void SaveToFile()
6569
}
6670
}
6771

68-
public void LoadFromFile()
72+
public void LoadFromFile(string fileName = null)
6973
{
7074
string filePath = Path.Combine(
7175
Application.persistentDataPath,
7276
_scriptableObjectsDataDirectory,
73-
$"{name}.data"
77+
$"{(fileName == null ? name : fileName)}.data"
7478
);
7579

7680
if (!File.Exists(filePath))

Assets/Scripts/Tools/DataHandler.cs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,12 @@ public static void LoadGameData()
1313
// load game parameters
1414
GameParameters[] gameParametersList = Resources.LoadAll<GameParameters>("ScriptableObjects/Parameters");
1515
foreach (GameParameters parameters in gameParametersList)
16-
parameters.LoadFromFile();
16+
{
17+
if (parameters is GamePlayersParameters pp)
18+
pp.LoadFromFile($"Games/{CoreDataHandler.instance.GameUID}/PlayerParameters");
19+
else
20+
parameters.LoadFromFile();
21+
}
1722
}
1823

1924
public static void SaveGameData()

0 commit comments

Comments
 (0)