tidied up + addressed issue with non-LevelTiles
problèmes : - mon code et l'arrangement des fichiers avait besoin d'un peu de tidy up - les tiles qui n'étaient pas des LevelTile ne loadaient pas solution : - rangé un peu + respecté structure une classe - un fichier - tenté un build pour voir si tout roulait comme il faut, ce qui m'a porté à ajouter des directives de preprocessing et à bouger les custom inspectors dans le dossier Editor. - ajouté une représentation simple des tuiles non-LevelTile dans la sauvegarde.
This commit is contained in:
parent
f1a328122c
commit
8b5d0370dc
8
Assets/Docu.meta
Normal file
8
Assets/Docu.meta
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 8a15f4b90f65f61489693e72dc43b1bd
|
||||||
|
folderAsset: yes
|
||||||
|
DefaultImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
|
Before Width: | Height: | Size: 110 KiB After Width: | Height: | Size: 110 KiB |
51
Assets/Editor/DatabaseEditor.cs
Normal file
51
Assets/Editor/DatabaseEditor.cs
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
using System.Linq;
|
||||||
|
using UnityEditor;
|
||||||
|
using UnityEngine;
|
||||||
|
using System.IO;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
|
|
||||||
|
[CustomEditor(typeof(Database))]
|
||||||
|
public class DatabaseEditor : Editor
|
||||||
|
{
|
||||||
|
public override void OnInspectorGUI()
|
||||||
|
{
|
||||||
|
DrawDefaultInspector();
|
||||||
|
|
||||||
|
if (GUILayout.Button("fetch assets"))
|
||||||
|
{
|
||||||
|
var targ = target as Database;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
foreach (var folder in targ.Folders)
|
||||||
|
{
|
||||||
|
var path = AssetDatabase.GetAssetPath(folder);
|
||||||
|
foreach (var file in GetAllPaths(path))
|
||||||
|
{
|
||||||
|
var scriptableObject = AssetDatabase.LoadAssetAtPath<ScriptableObject>(file);
|
||||||
|
if (scriptableObject && !targ.ScriptableObjects.Contains(scriptableObject))
|
||||||
|
{
|
||||||
|
targ.ScriptableObjects.Add(scriptableObject);
|
||||||
|
}
|
||||||
|
|
||||||
|
var prefab = AssetDatabase.LoadAssetAtPath<GameObject>(file);
|
||||||
|
if (prefab && !targ.Prefabs.Contains(prefab))
|
||||||
|
{
|
||||||
|
targ.Prefabs.Add(prefab);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
string[] GetAllPaths(string target)
|
||||||
|
{
|
||||||
|
var files = Directory.GetFiles(target).ToList();
|
||||||
|
foreach (var dir in Directory.GetDirectories(target))
|
||||||
|
{
|
||||||
|
files.AddRange(GetAllPaths(dir));
|
||||||
|
}
|
||||||
|
return files.ToArray();
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -1,5 +1,5 @@
|
|||||||
fileFormatVersion: 2
|
fileFormatVersion: 2
|
||||||
guid: d7329f36f451bd2479a760e1fc38e1a3
|
guid: ca089e7bfdaf2a943aebf7ce03bbd2e6
|
||||||
MonoImporter:
|
MonoImporter:
|
||||||
externalObjects: {}
|
externalObjects: {}
|
||||||
serializedVersion: 2
|
serializedVersion: 2
|
||||||
19
Assets/Editor/LevelManagerEditor.cs
Normal file
19
Assets/Editor/LevelManagerEditor.cs
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
using UnityEditor;
|
||||||
|
using UnityEngine;
|
||||||
|
|
||||||
|
[CustomEditor(typeof(LevelManagerScript))]
|
||||||
|
public class LevelManagerEditor : Editor
|
||||||
|
{
|
||||||
|
public override void OnInspectorGUI()
|
||||||
|
{
|
||||||
|
DrawDefaultInspector();
|
||||||
|
if (GUILayout.Button("Save"))
|
||||||
|
{
|
||||||
|
LevelManager.Instance.SaveFile();
|
||||||
|
}
|
||||||
|
if (GUILayout.Button("Load"))
|
||||||
|
{
|
||||||
|
LevelManager.Instance.LoadFile();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
11
Assets/Editor/LevelManagerEditor.cs.meta
Normal file
11
Assets/Editor/LevelManagerEditor.cs.meta
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 0c34c07f45297c74ca25240700f7903d
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
@ -123,7 +123,7 @@ NavMeshSettings:
|
|||||||
debug:
|
debug:
|
||||||
m_Flags: 0
|
m_Flags: 0
|
||||||
m_NavMeshData: {fileID: 0}
|
m_NavMeshData: {fileID: 0}
|
||||||
--- !u!1 &86093666
|
--- !u!1 &364640801
|
||||||
GameObject:
|
GameObject:
|
||||||
m_ObjectHideFlags: 0
|
m_ObjectHideFlags: 0
|
||||||
m_CorrespondingSourceObject: {fileID: 0}
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
@ -131,9 +131,127 @@ GameObject:
|
|||||||
m_PrefabAsset: {fileID: 0}
|
m_PrefabAsset: {fileID: 0}
|
||||||
serializedVersion: 6
|
serializedVersion: 6
|
||||||
m_Component:
|
m_Component:
|
||||||
- component: {fileID: 86093667}
|
- component: {fileID: 364640805}
|
||||||
- component: {fileID: 86093669}
|
- component: {fileID: 364640804}
|
||||||
- component: {fileID: 86093668}
|
- component: {fileID: 364640803}
|
||||||
|
- component: {fileID: 364640802}
|
||||||
|
m_Layer: 0
|
||||||
|
m_Name: Camera
|
||||||
|
m_TagString: MainCamera
|
||||||
|
m_Icon: {fileID: 0}
|
||||||
|
m_NavMeshLayer: 0
|
||||||
|
m_StaticEditorFlags: 0
|
||||||
|
m_IsActive: 1
|
||||||
|
--- !u!114 &364640802
|
||||||
|
MonoBehaviour:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 364640801}
|
||||||
|
m_Enabled: 1
|
||||||
|
m_EditorHideFlags: 0
|
||||||
|
m_Script: {fileID: 11500000, guid: a79441f348de89743a2939f4d699eac1, type: 3}
|
||||||
|
m_Name:
|
||||||
|
m_EditorClassIdentifier:
|
||||||
|
m_RenderShadows: 1
|
||||||
|
m_RequiresDepthTextureOption: 2
|
||||||
|
m_RequiresOpaqueTextureOption: 2
|
||||||
|
m_CameraType: 0
|
||||||
|
m_Cameras: []
|
||||||
|
m_RendererIndex: -1
|
||||||
|
m_VolumeLayerMask:
|
||||||
|
serializedVersion: 2
|
||||||
|
m_Bits: 1
|
||||||
|
m_VolumeTrigger: {fileID: 0}
|
||||||
|
m_VolumeFrameworkUpdateModeOption: 2
|
||||||
|
m_RenderPostProcessing: 0
|
||||||
|
m_Antialiasing: 0
|
||||||
|
m_AntialiasingQuality: 2
|
||||||
|
m_StopNaN: 0
|
||||||
|
m_Dithering: 0
|
||||||
|
m_ClearDepth: 1
|
||||||
|
m_AllowXRRendering: 1
|
||||||
|
m_RequiresDepthTexture: 0
|
||||||
|
m_RequiresColorTexture: 0
|
||||||
|
m_Version: 2
|
||||||
|
--- !u!81 &364640803
|
||||||
|
AudioListener:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 364640801}
|
||||||
|
m_Enabled: 1
|
||||||
|
--- !u!20 &364640804
|
||||||
|
Camera:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 364640801}
|
||||||
|
m_Enabled: 1
|
||||||
|
serializedVersion: 2
|
||||||
|
m_ClearFlags: 1
|
||||||
|
m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0}
|
||||||
|
m_projectionMatrixMode: 1
|
||||||
|
m_GateFitMode: 2
|
||||||
|
m_FOVAxisMode: 0
|
||||||
|
m_SensorSize: {x: 36, y: 24}
|
||||||
|
m_LensShift: {x: 0, y: 0}
|
||||||
|
m_FocalLength: 50
|
||||||
|
m_NormalizedViewPortRect:
|
||||||
|
serializedVersion: 2
|
||||||
|
x: 0
|
||||||
|
y: 0
|
||||||
|
width: 1
|
||||||
|
height: 1
|
||||||
|
near clip plane: 0.3
|
||||||
|
far clip plane: 1000
|
||||||
|
field of view: 60
|
||||||
|
orthographic: 1
|
||||||
|
orthographic size: 5
|
||||||
|
m_Depth: 0
|
||||||
|
m_CullingMask:
|
||||||
|
serializedVersion: 2
|
||||||
|
m_Bits: 55
|
||||||
|
m_RenderingPath: -1
|
||||||
|
m_TargetTexture: {fileID: 0}
|
||||||
|
m_TargetDisplay: 0
|
||||||
|
m_TargetEye: 3
|
||||||
|
m_HDR: 1
|
||||||
|
m_AllowMSAA: 1
|
||||||
|
m_AllowDynamicResolution: 0
|
||||||
|
m_ForceIntoRT: 0
|
||||||
|
m_OcclusionCulling: 1
|
||||||
|
m_StereoConvergence: 10
|
||||||
|
m_StereoSeparation: 0.022
|
||||||
|
--- !u!4 &364640805
|
||||||
|
Transform:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 364640801}
|
||||||
|
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
|
||||||
|
m_LocalPosition: {x: 0, y: 0, z: -10}
|
||||||
|
m_LocalScale: {x: 1, y: 1, z: 1}
|
||||||
|
m_ConstrainProportionsScale: 0
|
||||||
|
m_Children: []
|
||||||
|
m_Father: {fileID: 0}
|
||||||
|
m_RootOrder: 0
|
||||||
|
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||||
|
--- !u!1 &448766791
|
||||||
|
GameObject:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
serializedVersion: 6
|
||||||
|
m_Component:
|
||||||
|
- component: {fileID: 448766792}
|
||||||
|
- component: {fileID: 448766794}
|
||||||
|
- component: {fileID: 448766793}
|
||||||
m_Layer: 0
|
m_Layer: 0
|
||||||
m_Name: Entities
|
m_Name: Entities
|
||||||
m_TagString: Untagged
|
m_TagString: Untagged
|
||||||
@ -141,13 +259,13 @@ GameObject:
|
|||||||
m_NavMeshLayer: 0
|
m_NavMeshLayer: 0
|
||||||
m_StaticEditorFlags: 0
|
m_StaticEditorFlags: 0
|
||||||
m_IsActive: 1
|
m_IsActive: 1
|
||||||
--- !u!4 &86093667
|
--- !u!4 &448766792
|
||||||
Transform:
|
Transform:
|
||||||
m_ObjectHideFlags: 0
|
m_ObjectHideFlags: 0
|
||||||
m_CorrespondingSourceObject: {fileID: 0}
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
m_PrefabInstance: {fileID: 0}
|
m_PrefabInstance: {fileID: 0}
|
||||||
m_PrefabAsset: {fileID: 0}
|
m_PrefabAsset: {fileID: 0}
|
||||||
m_GameObject: {fileID: 86093666}
|
m_GameObject: {fileID: 448766791}
|
||||||
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_LocalPosition: {x: 0, y: 0, z: 0}
|
||||||
m_LocalScale: {x: 1, y: 1, z: 1}
|
m_LocalScale: {x: 1, y: 1, z: 1}
|
||||||
@ -156,13 +274,13 @@ Transform:
|
|||||||
m_Father: {fileID: 1827197199}
|
m_Father: {fileID: 1827197199}
|
||||||
m_RootOrder: 1
|
m_RootOrder: 1
|
||||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||||
--- !u!483693784 &86093668
|
--- !u!483693784 &448766793
|
||||||
TilemapRenderer:
|
TilemapRenderer:
|
||||||
m_ObjectHideFlags: 0
|
m_ObjectHideFlags: 0
|
||||||
m_CorrespondingSourceObject: {fileID: 0}
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
m_PrefabInstance: {fileID: 0}
|
m_PrefabInstance: {fileID: 0}
|
||||||
m_PrefabAsset: {fileID: 0}
|
m_PrefabAsset: {fileID: 0}
|
||||||
m_GameObject: {fileID: 86093666}
|
m_GameObject: {fileID: 448766791}
|
||||||
m_Enabled: 1
|
m_Enabled: 1
|
||||||
m_CastShadows: 0
|
m_CastShadows: 0
|
||||||
m_ReceiveShadows: 0
|
m_ReceiveShadows: 0
|
||||||
@ -196,7 +314,7 @@ TilemapRenderer:
|
|||||||
m_LightmapParameters: {fileID: 0}
|
m_LightmapParameters: {fileID: 0}
|
||||||
m_SortingLayerID: 0
|
m_SortingLayerID: 0
|
||||||
m_SortingLayer: 0
|
m_SortingLayer: 0
|
||||||
m_SortingOrder: 0
|
m_SortingOrder: 1
|
||||||
m_ChunkSize: {x: 32, y: 32, z: 32}
|
m_ChunkSize: {x: 32, y: 32, z: 32}
|
||||||
m_ChunkCullingBounds: {x: 0, y: 0, z: 0}
|
m_ChunkCullingBounds: {x: 0, y: 0, z: 0}
|
||||||
m_MaxChunkCount: 16
|
m_MaxChunkCount: 16
|
||||||
@ -205,13 +323,13 @@ TilemapRenderer:
|
|||||||
m_Mode: 0
|
m_Mode: 0
|
||||||
m_DetectChunkCullingBounds: 0
|
m_DetectChunkCullingBounds: 0
|
||||||
m_MaskInteraction: 0
|
m_MaskInteraction: 0
|
||||||
--- !u!1839735485 &86093669
|
--- !u!1839735485 &448766794
|
||||||
Tilemap:
|
Tilemap:
|
||||||
m_ObjectHideFlags: 0
|
m_ObjectHideFlags: 0
|
||||||
m_CorrespondingSourceObject: {fileID: 0}
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
m_PrefabInstance: {fileID: 0}
|
m_PrefabInstance: {fileID: 0}
|
||||||
m_PrefabAsset: {fileID: 0}
|
m_PrefabAsset: {fileID: 0}
|
||||||
m_GameObject: {fileID: 86093666}
|
m_GameObject: {fileID: 448766791}
|
||||||
m_Enabled: 1
|
m_Enabled: 1
|
||||||
m_Tiles:
|
m_Tiles:
|
||||||
- first: {x: -10, y: -4, z: 0}
|
- first: {x: -10, y: -4, z: 0}
|
||||||
@ -707,7 +825,7 @@ Tilemap:
|
|||||||
e31: 0
|
e31: 0
|
||||||
e32: 0
|
e32: 0
|
||||||
e33: 1
|
e33: 1
|
||||||
--- !u!1 &364640801
|
--- !u!1 &1134605333
|
||||||
GameObject:
|
GameObject:
|
||||||
m_ObjectHideFlags: 0
|
m_ObjectHideFlags: 0
|
||||||
m_CorrespondingSourceObject: {fileID: 0}
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
@ -715,127 +833,9 @@ GameObject:
|
|||||||
m_PrefabAsset: {fileID: 0}
|
m_PrefabAsset: {fileID: 0}
|
||||||
serializedVersion: 6
|
serializedVersion: 6
|
||||||
m_Component:
|
m_Component:
|
||||||
- component: {fileID: 364640805}
|
- component: {fileID: 1134605334}
|
||||||
- component: {fileID: 364640804}
|
- component: {fileID: 1134605336}
|
||||||
- component: {fileID: 364640803}
|
- component: {fileID: 1134605335}
|
||||||
- component: {fileID: 364640802}
|
|
||||||
m_Layer: 0
|
|
||||||
m_Name: Camera
|
|
||||||
m_TagString: MainCamera
|
|
||||||
m_Icon: {fileID: 0}
|
|
||||||
m_NavMeshLayer: 0
|
|
||||||
m_StaticEditorFlags: 0
|
|
||||||
m_IsActive: 1
|
|
||||||
--- !u!114 &364640802
|
|
||||||
MonoBehaviour:
|
|
||||||
m_ObjectHideFlags: 0
|
|
||||||
m_CorrespondingSourceObject: {fileID: 0}
|
|
||||||
m_PrefabInstance: {fileID: 0}
|
|
||||||
m_PrefabAsset: {fileID: 0}
|
|
||||||
m_GameObject: {fileID: 364640801}
|
|
||||||
m_Enabled: 1
|
|
||||||
m_EditorHideFlags: 0
|
|
||||||
m_Script: {fileID: 11500000, guid: a79441f348de89743a2939f4d699eac1, type: 3}
|
|
||||||
m_Name:
|
|
||||||
m_EditorClassIdentifier:
|
|
||||||
m_RenderShadows: 1
|
|
||||||
m_RequiresDepthTextureOption: 2
|
|
||||||
m_RequiresOpaqueTextureOption: 2
|
|
||||||
m_CameraType: 0
|
|
||||||
m_Cameras: []
|
|
||||||
m_RendererIndex: -1
|
|
||||||
m_VolumeLayerMask:
|
|
||||||
serializedVersion: 2
|
|
||||||
m_Bits: 1
|
|
||||||
m_VolumeTrigger: {fileID: 0}
|
|
||||||
m_VolumeFrameworkUpdateModeOption: 2
|
|
||||||
m_RenderPostProcessing: 0
|
|
||||||
m_Antialiasing: 0
|
|
||||||
m_AntialiasingQuality: 2
|
|
||||||
m_StopNaN: 0
|
|
||||||
m_Dithering: 0
|
|
||||||
m_ClearDepth: 1
|
|
||||||
m_AllowXRRendering: 1
|
|
||||||
m_RequiresDepthTexture: 0
|
|
||||||
m_RequiresColorTexture: 0
|
|
||||||
m_Version: 2
|
|
||||||
--- !u!81 &364640803
|
|
||||||
AudioListener:
|
|
||||||
m_ObjectHideFlags: 0
|
|
||||||
m_CorrespondingSourceObject: {fileID: 0}
|
|
||||||
m_PrefabInstance: {fileID: 0}
|
|
||||||
m_PrefabAsset: {fileID: 0}
|
|
||||||
m_GameObject: {fileID: 364640801}
|
|
||||||
m_Enabled: 1
|
|
||||||
--- !u!20 &364640804
|
|
||||||
Camera:
|
|
||||||
m_ObjectHideFlags: 0
|
|
||||||
m_CorrespondingSourceObject: {fileID: 0}
|
|
||||||
m_PrefabInstance: {fileID: 0}
|
|
||||||
m_PrefabAsset: {fileID: 0}
|
|
||||||
m_GameObject: {fileID: 364640801}
|
|
||||||
m_Enabled: 1
|
|
||||||
serializedVersion: 2
|
|
||||||
m_ClearFlags: 1
|
|
||||||
m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0}
|
|
||||||
m_projectionMatrixMode: 1
|
|
||||||
m_GateFitMode: 2
|
|
||||||
m_FOVAxisMode: 0
|
|
||||||
m_SensorSize: {x: 36, y: 24}
|
|
||||||
m_LensShift: {x: 0, y: 0}
|
|
||||||
m_FocalLength: 50
|
|
||||||
m_NormalizedViewPortRect:
|
|
||||||
serializedVersion: 2
|
|
||||||
x: 0
|
|
||||||
y: 0
|
|
||||||
width: 1
|
|
||||||
height: 1
|
|
||||||
near clip plane: 0.3
|
|
||||||
far clip plane: 1000
|
|
||||||
field of view: 60
|
|
||||||
orthographic: 1
|
|
||||||
orthographic size: 5
|
|
||||||
m_Depth: 0
|
|
||||||
m_CullingMask:
|
|
||||||
serializedVersion: 2
|
|
||||||
m_Bits: 55
|
|
||||||
m_RenderingPath: -1
|
|
||||||
m_TargetTexture: {fileID: 0}
|
|
||||||
m_TargetDisplay: 0
|
|
||||||
m_TargetEye: 3
|
|
||||||
m_HDR: 1
|
|
||||||
m_AllowMSAA: 1
|
|
||||||
m_AllowDynamicResolution: 0
|
|
||||||
m_ForceIntoRT: 0
|
|
||||||
m_OcclusionCulling: 1
|
|
||||||
m_StereoConvergence: 10
|
|
||||||
m_StereoSeparation: 0.022
|
|
||||||
--- !u!4 &364640805
|
|
||||||
Transform:
|
|
||||||
m_ObjectHideFlags: 0
|
|
||||||
m_CorrespondingSourceObject: {fileID: 0}
|
|
||||||
m_PrefabInstance: {fileID: 0}
|
|
||||||
m_PrefabAsset: {fileID: 0}
|
|
||||||
m_GameObject: {fileID: 364640801}
|
|
||||||
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
|
|
||||||
m_LocalPosition: {x: 0, y: 0, z: -10}
|
|
||||||
m_LocalScale: {x: 1, y: 1, z: 1}
|
|
||||||
m_ConstrainProportionsScale: 0
|
|
||||||
m_Children: []
|
|
||||||
m_Father: {fileID: 0}
|
|
||||||
m_RootOrder: 0
|
|
||||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
|
||||||
--- !u!1 &449089078
|
|
||||||
GameObject:
|
|
||||||
m_ObjectHideFlags: 0
|
|
||||||
m_CorrespondingSourceObject: {fileID: 0}
|
|
||||||
m_PrefabInstance: {fileID: 0}
|
|
||||||
m_PrefabAsset: {fileID: 0}
|
|
||||||
serializedVersion: 6
|
|
||||||
m_Component:
|
|
||||||
- component: {fileID: 449089079}
|
|
||||||
- component: {fileID: 449089081}
|
|
||||||
- component: {fileID: 449089080}
|
|
||||||
m_Layer: 0
|
m_Layer: 0
|
||||||
m_Name: Background
|
m_Name: Background
|
||||||
m_TagString: Untagged
|
m_TagString: Untagged
|
||||||
@ -843,13 +843,13 @@ GameObject:
|
|||||||
m_NavMeshLayer: 0
|
m_NavMeshLayer: 0
|
||||||
m_StaticEditorFlags: 0
|
m_StaticEditorFlags: 0
|
||||||
m_IsActive: 1
|
m_IsActive: 1
|
||||||
--- !u!4 &449089079
|
--- !u!4 &1134605334
|
||||||
Transform:
|
Transform:
|
||||||
m_ObjectHideFlags: 0
|
m_ObjectHideFlags: 0
|
||||||
m_CorrespondingSourceObject: {fileID: 0}
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
m_PrefabInstance: {fileID: 0}
|
m_PrefabInstance: {fileID: 0}
|
||||||
m_PrefabAsset: {fileID: 0}
|
m_PrefabAsset: {fileID: 0}
|
||||||
m_GameObject: {fileID: 449089078}
|
m_GameObject: {fileID: 1134605333}
|
||||||
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_LocalPosition: {x: 0, y: 0, z: 0}
|
||||||
m_LocalScale: {x: 1, y: 1, z: 1}
|
m_LocalScale: {x: 1, y: 1, z: 1}
|
||||||
@ -858,13 +858,13 @@ Transform:
|
|||||||
m_Father: {fileID: 1827197199}
|
m_Father: {fileID: 1827197199}
|
||||||
m_RootOrder: 0
|
m_RootOrder: 0
|
||||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||||
--- !u!483693784 &449089080
|
--- !u!483693784 &1134605335
|
||||||
TilemapRenderer:
|
TilemapRenderer:
|
||||||
m_ObjectHideFlags: 0
|
m_ObjectHideFlags: 0
|
||||||
m_CorrespondingSourceObject: {fileID: 0}
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
m_PrefabInstance: {fileID: 0}
|
m_PrefabInstance: {fileID: 0}
|
||||||
m_PrefabAsset: {fileID: 0}
|
m_PrefabAsset: {fileID: 0}
|
||||||
m_GameObject: {fileID: 449089078}
|
m_GameObject: {fileID: 1134605333}
|
||||||
m_Enabled: 1
|
m_Enabled: 1
|
||||||
m_CastShadows: 0
|
m_CastShadows: 0
|
||||||
m_ReceiveShadows: 0
|
m_ReceiveShadows: 0
|
||||||
@ -907,13 +907,13 @@ TilemapRenderer:
|
|||||||
m_Mode: 0
|
m_Mode: 0
|
||||||
m_DetectChunkCullingBounds: 0
|
m_DetectChunkCullingBounds: 0
|
||||||
m_MaskInteraction: 0
|
m_MaskInteraction: 0
|
||||||
--- !u!1839735485 &449089081
|
--- !u!1839735485 &1134605336
|
||||||
Tilemap:
|
Tilemap:
|
||||||
m_ObjectHideFlags: 0
|
m_ObjectHideFlags: 0
|
||||||
m_CorrespondingSourceObject: {fileID: 0}
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
m_PrefabInstance: {fileID: 0}
|
m_PrefabInstance: {fileID: 0}
|
||||||
m_PrefabAsset: {fileID: 0}
|
m_PrefabAsset: {fileID: 0}
|
||||||
m_GameObject: {fileID: 449089078}
|
m_GameObject: {fileID: 1134605333}
|
||||||
m_Enabled: 1
|
m_Enabled: 1
|
||||||
m_Tiles:
|
m_Tiles:
|
||||||
- first: {x: -10, y: -4, z: 0}
|
- first: {x: -10, y: -4, z: 0}
|
||||||
@ -2439,7 +2439,7 @@ Tilemap:
|
|||||||
e31: 0
|
e31: 0
|
||||||
e32: 0
|
e32: 0
|
||||||
e33: 1
|
e33: 1
|
||||||
--- !u!1 &991823372
|
--- !u!1 &1588294913
|
||||||
GameObject:
|
GameObject:
|
||||||
m_ObjectHideFlags: 0
|
m_ObjectHideFlags: 0
|
||||||
m_CorrespondingSourceObject: {fileID: 0}
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
@ -2447,9 +2447,9 @@ GameObject:
|
|||||||
m_PrefabAsset: {fileID: 0}
|
m_PrefabAsset: {fileID: 0}
|
||||||
serializedVersion: 6
|
serializedVersion: 6
|
||||||
m_Component:
|
m_Component:
|
||||||
- component: {fileID: 991823373}
|
- component: {fileID: 1588294914}
|
||||||
- component: {fileID: 991823375}
|
- component: {fileID: 1588294916}
|
||||||
- component: {fileID: 991823374}
|
- component: {fileID: 1588294915}
|
||||||
m_Layer: 6
|
m_Layer: 6
|
||||||
m_Name: Spawners
|
m_Name: Spawners
|
||||||
m_TagString: Untagged
|
m_TagString: Untagged
|
||||||
@ -2457,13 +2457,13 @@ GameObject:
|
|||||||
m_NavMeshLayer: 0
|
m_NavMeshLayer: 0
|
||||||
m_StaticEditorFlags: 0
|
m_StaticEditorFlags: 0
|
||||||
m_IsActive: 1
|
m_IsActive: 1
|
||||||
--- !u!4 &991823373
|
--- !u!4 &1588294914
|
||||||
Transform:
|
Transform:
|
||||||
m_ObjectHideFlags: 0
|
m_ObjectHideFlags: 0
|
||||||
m_CorrespondingSourceObject: {fileID: 0}
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
m_PrefabInstance: {fileID: 0}
|
m_PrefabInstance: {fileID: 0}
|
||||||
m_PrefabAsset: {fileID: 0}
|
m_PrefabAsset: {fileID: 0}
|
||||||
m_GameObject: {fileID: 991823372}
|
m_GameObject: {fileID: 1588294913}
|
||||||
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_LocalPosition: {x: 0, y: 0, z: 0}
|
||||||
m_LocalScale: {x: 1, y: 1, z: 1}
|
m_LocalScale: {x: 1, y: 1, z: 1}
|
||||||
@ -2472,13 +2472,13 @@ Transform:
|
|||||||
m_Father: {fileID: 1827197199}
|
m_Father: {fileID: 1827197199}
|
||||||
m_RootOrder: 2
|
m_RootOrder: 2
|
||||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||||
--- !u!483693784 &991823374
|
--- !u!483693784 &1588294915
|
||||||
TilemapRenderer:
|
TilemapRenderer:
|
||||||
m_ObjectHideFlags: 0
|
m_ObjectHideFlags: 0
|
||||||
m_CorrespondingSourceObject: {fileID: 0}
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
m_PrefabInstance: {fileID: 0}
|
m_PrefabInstance: {fileID: 0}
|
||||||
m_PrefabAsset: {fileID: 0}
|
m_PrefabAsset: {fileID: 0}
|
||||||
m_GameObject: {fileID: 991823372}
|
m_GameObject: {fileID: 1588294913}
|
||||||
m_Enabled: 1
|
m_Enabled: 1
|
||||||
m_CastShadows: 0
|
m_CastShadows: 0
|
||||||
m_ReceiveShadows: 0
|
m_ReceiveShadows: 0
|
||||||
@ -2521,13 +2521,13 @@ TilemapRenderer:
|
|||||||
m_Mode: 0
|
m_Mode: 0
|
||||||
m_DetectChunkCullingBounds: 0
|
m_DetectChunkCullingBounds: 0
|
||||||
m_MaskInteraction: 0
|
m_MaskInteraction: 0
|
||||||
--- !u!1839735485 &991823375
|
--- !u!1839735485 &1588294916
|
||||||
Tilemap:
|
Tilemap:
|
||||||
m_ObjectHideFlags: 0
|
m_ObjectHideFlags: 0
|
||||||
m_CorrespondingSourceObject: {fileID: 0}
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
m_PrefabInstance: {fileID: 0}
|
m_PrefabInstance: {fileID: 0}
|
||||||
m_PrefabAsset: {fileID: 0}
|
m_PrefabAsset: {fileID: 0}
|
||||||
m_GameObject: {fileID: 991823372}
|
m_GameObject: {fileID: 1588294913}
|
||||||
m_Enabled: 1
|
m_Enabled: 1
|
||||||
m_Tiles:
|
m_Tiles:
|
||||||
- first: {x: -10, y: -4, z: 0}
|
- first: {x: -10, y: -4, z: 0}
|
||||||
@ -2709,9 +2709,9 @@ Transform:
|
|||||||
m_LocalScale: {x: 1, y: 1, z: 1}
|
m_LocalScale: {x: 1, y: 1, z: 1}
|
||||||
m_ConstrainProportionsScale: 0
|
m_ConstrainProportionsScale: 0
|
||||||
m_Children:
|
m_Children:
|
||||||
- {fileID: 449089079}
|
- {fileID: 1134605334}
|
||||||
- {fileID: 86093667}
|
- {fileID: 448766792}
|
||||||
- {fileID: 991823373}
|
- {fileID: 1588294914}
|
||||||
m_Father: {fileID: 0}
|
m_Father: {fileID: 0}
|
||||||
m_RootOrder: 1
|
m_RootOrder: 1
|
||||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||||
@ -2729,48 +2729,3 @@ MonoBehaviour:
|
|||||||
m_EditorClassIdentifier:
|
m_EditorClassIdentifier:
|
||||||
_path: {fileID: 102900000, guid: c9341b1bdc1103b4e832cf62d29e5471, type: 3}
|
_path: {fileID: 102900000, guid: c9341b1bdc1103b4e832cf62d29e5471, type: 3}
|
||||||
_level: {fileID: 11400000, guid: e715669e1ed4b294c82d07ac011e89bb, type: 2}
|
_level: {fileID: 11400000, guid: e715669e1ed4b294c82d07ac011e89bb, type: 2}
|
||||||
--- !u!1 &2124900075
|
|
||||||
GameObject:
|
|
||||||
m_ObjectHideFlags: 0
|
|
||||||
m_CorrespondingSourceObject: {fileID: 0}
|
|
||||||
m_PrefabInstance: {fileID: 0}
|
|
||||||
m_PrefabAsset: {fileID: 0}
|
|
||||||
serializedVersion: 6
|
|
||||||
m_Component:
|
|
||||||
- component: {fileID: 2124900076}
|
|
||||||
- component: {fileID: 2124900077}
|
|
||||||
m_Layer: 0
|
|
||||||
m_Name: LevelManager
|
|
||||||
m_TagString: Untagged
|
|
||||||
m_Icon: {fileID: 0}
|
|
||||||
m_NavMeshLayer: 0
|
|
||||||
m_StaticEditorFlags: 0
|
|
||||||
m_IsActive: 1
|
|
||||||
--- !u!4 &2124900076
|
|
||||||
Transform:
|
|
||||||
m_ObjectHideFlags: 0
|
|
||||||
m_CorrespondingSourceObject: {fileID: 0}
|
|
||||||
m_PrefabInstance: {fileID: 0}
|
|
||||||
m_PrefabAsset: {fileID: 0}
|
|
||||||
m_GameObject: {fileID: 2124900075}
|
|
||||||
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: 0}
|
|
||||||
m_RootOrder: 2
|
|
||||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
|
||||||
--- !u!114 &2124900077
|
|
||||||
MonoBehaviour:
|
|
||||||
m_ObjectHideFlags: 0
|
|
||||||
m_CorrespondingSourceObject: {fileID: 0}
|
|
||||||
m_PrefabInstance: {fileID: 0}
|
|
||||||
m_PrefabAsset: {fileID: 0}
|
|
||||||
m_GameObject: {fileID: 2124900075}
|
|
||||||
m_Enabled: 1
|
|
||||||
m_EditorHideFlags: 0
|
|
||||||
m_Script: {fileID: 11500000, guid: c8f415d45fd9659408ac8c5ce2e96aba, type: 3}
|
|
||||||
m_Name:
|
|
||||||
m_EditorClassIdentifier:
|
|
||||||
firstLevel: {fileID: 11400000, guid: e715669e1ed4b294c82d07ac011e89bb, type: 2}
|
|
||||||
|
|||||||
BIN
Assets/Newtonsoft.Json.dll
Normal file
BIN
Assets/Newtonsoft.Json.dll
Normal file
Binary file not shown.
33
Assets/Newtonsoft.Json.dll.meta
Normal file
33
Assets/Newtonsoft.Json.dll.meta
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 175b6e9751ccac44b94d94c793bec2d8
|
||||||
|
PluginImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
iconMap: {}
|
||||||
|
executionOrder: {}
|
||||||
|
defineConstraints: []
|
||||||
|
isPreloaded: 0
|
||||||
|
isOverridable: 0
|
||||||
|
isExplicitlyReferenced: 0
|
||||||
|
validateReferences: 1
|
||||||
|
platformData:
|
||||||
|
- first:
|
||||||
|
Any:
|
||||||
|
second:
|
||||||
|
enabled: 1
|
||||||
|
settings: {}
|
||||||
|
- first:
|
||||||
|
Editor: Editor
|
||||||
|
second:
|
||||||
|
enabled: 0
|
||||||
|
settings:
|
||||||
|
DefaultValueInitialized: true
|
||||||
|
- first:
|
||||||
|
Windows Store Apps: WindowsStoreApps
|
||||||
|
second:
|
||||||
|
enabled: 0
|
||||||
|
settings:
|
||||||
|
CPU: AnyCPU
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
80
Assets/Prefabs/LevelManager.prefab
Normal file
80
Assets/Prefabs/LevelManager.prefab
Normal file
@ -0,0 +1,80 @@
|
|||||||
|
%YAML 1.1
|
||||||
|
%TAG !u! tag:unity3d.com,2011:
|
||||||
|
--- !u!1 &3028288566889208744
|
||||||
|
GameObject:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
serializedVersion: 6
|
||||||
|
m_Component:
|
||||||
|
- component: {fileID: 3028288566889208751}
|
||||||
|
- component: {fileID: 3028288566889208750}
|
||||||
|
- component: {fileID: 3028288566889208749}
|
||||||
|
m_Layer: 0
|
||||||
|
m_Name: LevelManager
|
||||||
|
m_TagString: Untagged
|
||||||
|
m_Icon: {fileID: 0}
|
||||||
|
m_NavMeshLayer: 0
|
||||||
|
m_StaticEditorFlags: 0
|
||||||
|
m_IsActive: 1
|
||||||
|
--- !u!4 &3028288566889208751
|
||||||
|
Transform:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 3028288566889208744}
|
||||||
|
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: 0}
|
||||||
|
m_RootOrder: 0
|
||||||
|
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||||
|
--- !u!114 &3028288566889208750
|
||||||
|
MonoBehaviour:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 3028288566889208744}
|
||||||
|
m_Enabled: 1
|
||||||
|
m_EditorHideFlags: 0
|
||||||
|
m_Script: {fileID: 11500000, guid: c8f415d45fd9659408ac8c5ce2e96aba, type: 3}
|
||||||
|
m_Name:
|
||||||
|
m_EditorClassIdentifier:
|
||||||
|
firstLevel: {fileID: 11400000, guid: e715669e1ed4b294c82d07ac011e89bb, type: 2}
|
||||||
|
--- !u!114 &3028288566889208749
|
||||||
|
MonoBehaviour:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 3028288566889208744}
|
||||||
|
m_Enabled: 1
|
||||||
|
m_EditorHideFlags: 0
|
||||||
|
m_Script: {fileID: 11500000, guid: edb1aa3d6230b1e4c9a50056da756015, type: 3}
|
||||||
|
m_Name:
|
||||||
|
m_EditorClassIdentifier:
|
||||||
|
_folders:
|
||||||
|
- {fileID: 102900000, guid: f3dee7994db941e47b9445cb464c69a9, type: 3}
|
||||||
|
- {fileID: 102900000, guid: 4f8284570682f8f4c954e446b35ea0ae, type: 3}
|
||||||
|
- {fileID: 102900000, guid: 0ca30b5ca281be24bb62d7e48cc2bec8, type: 3}
|
||||||
|
- {fileID: 102900000, guid: 73ca1afa7b0f7dd4ea39f69cf74f8370, type: 3}
|
||||||
|
_prefabs:
|
||||||
|
- {fileID: 6962989255644195630, guid: 6cd87b398e7a0e94580f4fcbe2fd310a, type: 3}
|
||||||
|
- {fileID: 6962989255644195630, guid: 377c7275c0001cc47a6b8926ac57d573, type: 3}
|
||||||
|
- {fileID: 6962989255644195630, guid: 869a03bba705e8d4485aa73daad773dc, type: 3}
|
||||||
|
- {fileID: 6962989255644195630, guid: 9b40c232eddfd1b469bea688e3c970c0, type: 3}
|
||||||
|
- {fileID: 4052934186652138539, guid: 8560e1f66d452b543a705c8a0f3e22fa, type: 3}
|
||||||
|
- {fileID: 3814095509541806390, guid: 9527f3a1482b90a48bb6c62acc70f986, type: 3}
|
||||||
|
_scriptableObjects:
|
||||||
|
- {fileID: 11400000, guid: a6e34739c9325da4cac4fbaea30d052c, type: 2}
|
||||||
|
- {fileID: 11400000, guid: d37561e153d6a6448a03839488fdec5e, type: 2}
|
||||||
|
- {fileID: 11400000, guid: 4002377ed7e87b34699f126f2b10c703, type: 2}
|
||||||
|
- {fileID: 11400000, guid: 4aaf448680c7f8a438a9a5861c622a55, type: 2}
|
||||||
|
- {fileID: 11400000, guid: e715669e1ed4b294c82d07ac011e89bb, type: 2}
|
||||||
|
- {fileID: 11400000, guid: a387250a316b97e43be83b85980101e1, type: 2}
|
||||||
|
- {fileID: 11400000, guid: ef5a154519b23a34aaded32e86bf7f2f, type: 2}
|
||||||
7
Assets/Prefabs/LevelManager.prefab.meta
Normal file
7
Assets/Prefabs/LevelManager.prefab.meta
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 02daecb0115395844b4932445d039051
|
||||||
|
PrefabImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
@ -7,54 +7,18 @@ using System;
|
|||||||
|
|
||||||
#if UNITY_EDITOR
|
#if UNITY_EDITOR
|
||||||
using UnityEditor;
|
using UnityEditor;
|
||||||
|
|
||||||
[CustomEditor(typeof(Database))]
|
|
||||||
public class DatabaseEditor : Editor
|
|
||||||
{
|
|
||||||
public override void OnInspectorGUI()
|
|
||||||
{
|
|
||||||
DrawDefaultInspector();
|
|
||||||
|
|
||||||
if (GUILayout.Button("fetch assets"))
|
|
||||||
{
|
|
||||||
var targ = target as Database;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
foreach (var folder in targ.Folders)
|
|
||||||
{
|
|
||||||
var path = AssetDatabase.GetAssetPath(folder);
|
|
||||||
foreach (var file in GetAllPaths(path))
|
|
||||||
{
|
|
||||||
var scriptableObject = AssetDatabase.LoadAssetAtPath<ScriptableObject>(file);
|
|
||||||
if (scriptableObject && !targ.ScriptableObjects.Contains(scriptableObject))
|
|
||||||
{
|
|
||||||
targ.ScriptableObjects.Add(scriptableObject);
|
|
||||||
}
|
|
||||||
|
|
||||||
var prefab = AssetDatabase.LoadAssetAtPath<GameObject>(file);
|
|
||||||
if (prefab && !targ.Prefabs.Contains(prefab))
|
|
||||||
{
|
|
||||||
targ.Prefabs.Add(prefab);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
string[] GetAllPaths(string target)
|
|
||||||
{
|
|
||||||
var files = Directory.GetFiles(target).ToList();
|
|
||||||
foreach (var dir in Directory.GetDirectories(target))
|
|
||||||
{
|
|
||||||
files.AddRange(GetAllPaths(dir));
|
|
||||||
}
|
|
||||||
return files.ToArray();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
public class Database : SingletonBehaviour<Database>
|
public class Database : SingletonBehaviour<Database>
|
||||||
{
|
{
|
||||||
|
#if UNITY_EDITOR
|
||||||
|
[Header("Editor section")]
|
||||||
|
[SerializeField]
|
||||||
|
private List<DefaultAsset> _folders;
|
||||||
|
|
||||||
|
public List<DefaultAsset> Folders => _folders;
|
||||||
|
#endif
|
||||||
|
|
||||||
public const string TYPE = nameof(TYPE);
|
public const string TYPE = nameof(TYPE);
|
||||||
[Serializable]
|
[Serializable]
|
||||||
@ -95,9 +59,7 @@ public class Database : SingletonBehaviour<Database>
|
|||||||
_prefabs = new List<GameObject>();
|
_prefabs = new List<GameObject>();
|
||||||
_scriptableObjects = new List<ScriptableObject>();
|
_scriptableObjects = new List<ScriptableObject>();
|
||||||
}
|
}
|
||||||
[Header("Editor section")]
|
#if UNITY_EDITOR
|
||||||
[SerializeField]
|
|
||||||
private List<DefaultAsset> _folders;
|
#endif
|
||||||
|
|
||||||
public List<DefaultAsset> Folders => _folders;
|
|
||||||
}
|
}
|
||||||
@ -31,10 +31,6 @@ public static class Extensions
|
|||||||
public static bool ToBool(this object jobj) => bool.Parse(jobj.ToString());
|
public static bool ToBool(this object jobj) => bool.Parse(jobj.ToString());
|
||||||
public static GameObject Create(this GameObject prefab, Vector3 position, Quaternion rotation = default, Transform parent = null)
|
public static GameObject Create(this GameObject prefab, Vector3 position, Quaternion rotation = default, Transform parent = null)
|
||||||
{
|
{
|
||||||
if (!prefab)
|
|
||||||
{
|
|
||||||
Debug.Log("");
|
|
||||||
}
|
|
||||||
if (rotation == default) rotation = Quaternion.identity;
|
if (rotation == default) rotation = Quaternion.identity;
|
||||||
var instance = GameObject.Instantiate(prefab, position, rotation);
|
var instance = GameObject.Instantiate(prefab, position, rotation);
|
||||||
instance.transform.SetParent(parent);
|
instance.transform.SetParent(parent);
|
||||||
|
|||||||
@ -1,5 +1,9 @@
|
|||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// a singleton but as a MonoBehaviour
|
||||||
|
/// </summary>
|
||||||
|
/// <typeparam name="T"></typeparam>
|
||||||
public class SingletonBehaviour<T> : MonoBehaviour where T : SingletonBehaviour<T>
|
public class SingletonBehaviour<T> : MonoBehaviour where T : SingletonBehaviour<T>
|
||||||
{
|
{
|
||||||
public static T Instance
|
public static T Instance
|
||||||
|
|||||||
@ -1,17 +0,0 @@
|
|||||||
using UnityEngine;
|
|
||||||
|
|
||||||
public class SingletonSO<T> : ScriptableObject where T : SingletonSO<T>
|
|
||||||
{
|
|
||||||
private static T _instance;
|
|
||||||
public static T Instance
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
if (!_instance)
|
|
||||||
{
|
|
||||||
_instance = CreateInstance<T>();
|
|
||||||
}
|
|
||||||
return _instance;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,3 +1,4 @@
|
|||||||
|
|
||||||
#if UNITY_EDITOR
|
#if UNITY_EDITOR
|
||||||
using UnityEditor;
|
using UnityEditor;
|
||||||
#endif
|
#endif
|
||||||
@ -12,7 +13,13 @@ namespace GatherAndDefend.LevelEditor
|
|||||||
#if UNITY_EDITOR
|
#if UNITY_EDITOR
|
||||||
[SerializeField]
|
[SerializeField]
|
||||||
private DefaultAsset _path;
|
private DefaultAsset _path;
|
||||||
|
public DefaultAsset Path
|
||||||
|
{
|
||||||
|
get => _path;
|
||||||
|
set => _path = value;
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
[SerializeField]
|
[SerializeField]
|
||||||
private Level _level;
|
private Level _level;
|
||||||
public Level Level
|
public Level Level
|
||||||
@ -20,10 +27,6 @@ namespace GatherAndDefend.LevelEditor
|
|||||||
get => _level;
|
get => _level;
|
||||||
set => _level = value;
|
set => _level = value;
|
||||||
}
|
}
|
||||||
public DefaultAsset Path
|
|
||||||
{
|
|
||||||
get => _path;
|
|
||||||
set => _path = value;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -3,6 +3,8 @@ using UnityEngine.Tilemaps;
|
|||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
using System;
|
using System;
|
||||||
using System.Collections;
|
using System.Collections;
|
||||||
|
using System.Linq;
|
||||||
|
using Newtonsoft.Json;
|
||||||
|
|
||||||
namespace GatherAndDefend.LevelEditor
|
namespace GatherAndDefend.LevelEditor
|
||||||
{
|
{
|
||||||
@ -75,6 +77,83 @@ namespace GatherAndDefend.LevelEditor
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// returns a dictionary representation of the tilemap
|
||||||
|
/// </summary>
|
||||||
|
/// <returns></returns>
|
||||||
|
public Dictionary<string, object> ToDictionary()
|
||||||
|
{
|
||||||
|
return new Dictionary<string, object>()
|
||||||
|
{
|
||||||
|
{nameof(_key), _key },
|
||||||
|
{nameof(_isInvisible), _isInvisible },
|
||||||
|
{nameof(_isCollidable), _isCollidable },
|
||||||
|
{nameof(_isTrigger), _isTrigger },
|
||||||
|
{nameof(_renderOrder), _renderOrder },
|
||||||
|
{nameof(_renderLayer), _renderLayer },
|
||||||
|
{nameof(_tiles), _tiles.FindAll(x => !(x.Tile is LevelTile))
|
||||||
|
.Select(x => new Dictionary<string, object>() {
|
||||||
|
{nameof(x.Position), new float[] { x.Position.x, x.Position.y, x.Position.z } },
|
||||||
|
{nameof(x.Tile), x.Tile.name } }).ToArray() }
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// builds a tilemap from a dictionary representation (from the save file)
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="dict"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public static Tilemap FromDictionary(Dictionary<string, object> dict)
|
||||||
|
{
|
||||||
|
//get all tilemap data
|
||||||
|
var key = dict[nameof(_key)].ToString();
|
||||||
|
var invisible = dict[nameof(_isInvisible)].ToBool();
|
||||||
|
var collidable = dict[nameof(_isCollidable)].ToBool();
|
||||||
|
var trigger = dict[nameof(_isTrigger)].ToBool();
|
||||||
|
var renderOrder = dict[nameof(_renderOrder)].ToInt();
|
||||||
|
var renderLayer = dict[nameof(_renderLayer)].ToString();
|
||||||
|
var tiles = dict[nameof(_tiles)];
|
||||||
|
|
||||||
|
//get grid
|
||||||
|
var grid = GameObject.FindObjectOfType<Grid>();
|
||||||
|
if (!grid) grid = new GameObject("Grid").AddComponent<Grid>();
|
||||||
|
|
||||||
|
//get tilemap by name
|
||||||
|
var tilemap = grid.GetComponentInChildren<Tilemap>(key);
|
||||||
|
TilemapRenderer renderer;
|
||||||
|
if (!tilemap)
|
||||||
|
{
|
||||||
|
tilemap = new GameObject(key).AddComponent<Tilemap>();
|
||||||
|
tilemap.gameObject.AddComponent<TilemapRenderer>();
|
||||||
|
tilemap.transform.SetParent(grid.transform);
|
||||||
|
}
|
||||||
|
renderer = tilemap.GetComponent<TilemapRenderer>();
|
||||||
|
|
||||||
|
//populate tilemap according to specs
|
||||||
|
renderer.sortingOrder = renderOrder;
|
||||||
|
renderer.sortingLayerName = renderLayer;
|
||||||
|
|
||||||
|
if (invisible) tilemap.gameObject.layer = INVISIBLE_LAYER;
|
||||||
|
if (collidable)
|
||||||
|
{
|
||||||
|
tilemap.gameObject.AddComponent<TilemapCollider2D>().isTrigger = trigger;
|
||||||
|
}
|
||||||
|
|
||||||
|
//populate tilemaps with non-LevelTile tiles
|
||||||
|
foreach (var tileObj in tiles as IEnumerable)
|
||||||
|
{
|
||||||
|
var tileDict = JsonConvert.DeserializeObject<Dictionary<string, object>>(tileObj.ToString());
|
||||||
|
var tileName = tileDict["Tile"].ToString();
|
||||||
|
var tile = Database.Instance.ScriptableObjects[tileName];
|
||||||
|
|
||||||
|
var tilePos = tileDict["Position"].ToVector3();
|
||||||
|
|
||||||
|
tilemap.SetTile(Vector3Int.RoundToInt(tilePos), tile as TileBase);
|
||||||
|
}
|
||||||
|
|
||||||
|
return tilemap;
|
||||||
|
}
|
||||||
|
|
||||||
public IEnumerator<TileData> GetEnumerator()
|
public IEnumerator<TileData> GetEnumerator()
|
||||||
{
|
{
|
||||||
return _tiles.GetEnumerator();
|
return _tiles.GetEnumerator();
|
||||||
|
|||||||
@ -6,7 +6,8 @@ public interface ILevelObject
|
|||||||
public enum ObjectType
|
public enum ObjectType
|
||||||
{
|
{
|
||||||
Tile = 0,
|
Tile = 0,
|
||||||
Prefab = 1
|
Prefab = 1,
|
||||||
|
Tilemap = 2
|
||||||
}
|
}
|
||||||
|
|
||||||
string Name { get; }
|
string Name { get; }
|
||||||
|
|||||||
231
Assets/Scripts/LevelManager/LevelManager.cs
Normal file
231
Assets/Scripts/LevelManager/LevelManager.cs
Normal file
@ -0,0 +1,231 @@
|
|||||||
|
using GatherAndDefend.LevelEditor;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Text;
|
||||||
|
using UnityEngine.Tilemaps;
|
||||||
|
using UnityEngine;
|
||||||
|
using System.Linq;
|
||||||
|
using Newtonsoft.Json;
|
||||||
|
using System.IO;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// data class for containing everything level related
|
||||||
|
/// </summary>
|
||||||
|
public class LevelManager : Singleton<LevelManager>
|
||||||
|
{
|
||||||
|
string SavePath => Application.dataPath + "/save.txt";
|
||||||
|
|
||||||
|
public delegate void LevelAction(ILevelObject levelObject);
|
||||||
|
public delegate bool LevelPredicate<T>(T levelObject) where T : ILevelObject;
|
||||||
|
|
||||||
|
public event LevelAction Added;
|
||||||
|
public event LevelAction Removed;
|
||||||
|
|
||||||
|
private readonly List<ILevelObject> _toAdd;
|
||||||
|
private readonly List<ILevelObject> _toRemove;
|
||||||
|
private readonly List<ILevelObject> _levelObjects;
|
||||||
|
|
||||||
|
public Level _currentLevel;
|
||||||
|
|
||||||
|
public Transform LevelTransform
|
||||||
|
{
|
||||||
|
get; private set;
|
||||||
|
}
|
||||||
|
public LevelManager()
|
||||||
|
{
|
||||||
|
_toAdd = new List<ILevelObject>();
|
||||||
|
_toRemove = new List<ILevelObject>();
|
||||||
|
_levelObjects = new List<ILevelObject>();
|
||||||
|
|
||||||
|
var mgrScript = Object.FindObjectOfType<LevelManagerScript>();
|
||||||
|
if (!mgrScript) mgrScript = new GameObject(nameof(LevelManager)).AddComponent<LevelManagerScript>();
|
||||||
|
LevelTransform = mgrScript.transform;
|
||||||
|
}
|
||||||
|
|
||||||
|
#region [~CRUD~]
|
||||||
|
public void Add(ILevelObject levelObject)
|
||||||
|
{
|
||||||
|
_toAdd.Add(levelObject);
|
||||||
|
}
|
||||||
|
public void Remove(ILevelObject levelObject)
|
||||||
|
{
|
||||||
|
_toRemove.Add(levelObject);
|
||||||
|
}
|
||||||
|
public void Clear()
|
||||||
|
{
|
||||||
|
_toAdd.Clear();
|
||||||
|
_toRemove.Clear();
|
||||||
|
_levelObjects.Clear();
|
||||||
|
}
|
||||||
|
public T Get<T>(LevelPredicate<T> predicate = null) where T : ILevelObject
|
||||||
|
{
|
||||||
|
if (predicate == null) predicate = (generic) => true;
|
||||||
|
return (T)_levelObjects.Find(levelObject => levelObject is T generic && predicate(generic));
|
||||||
|
}
|
||||||
|
public List<T> GetAll<T>(LevelPredicate<T> predicate = null) where T : ILevelObject
|
||||||
|
{
|
||||||
|
if (predicate == null) predicate = (generic) => true;
|
||||||
|
List<T> ret = new();
|
||||||
|
foreach (var levelObject in _levelObjects) if (levelObject is T generic && predicate(generic)) ret.Add(generic);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
public int Count<T>(LevelPredicate<T> predicate = null) where T : ILevelObject
|
||||||
|
{
|
||||||
|
return GetAll(predicate).Count;
|
||||||
|
}
|
||||||
|
public bool Has<T>(LevelPredicate<T> predicate = null) where T : ILevelObject
|
||||||
|
{
|
||||||
|
if (predicate == null) predicate = (generic) => true;
|
||||||
|
return _levelObjects.Exists(levelObject => levelObject is T generic && predicate(generic));
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region [Level management]
|
||||||
|
public void UpdateLevel()
|
||||||
|
{
|
||||||
|
_levelObjects.ForEach(levelObject => levelObject.LevelUpdate());
|
||||||
|
|
||||||
|
var toAdd = new List<ILevelObject>(this._toAdd);
|
||||||
|
toAdd.ForEach(addedObject =>
|
||||||
|
{
|
||||||
|
this._toAdd.Remove(addedObject);
|
||||||
|
_levelObjects.Add(addedObject);
|
||||||
|
Added?.Invoke(addedObject);
|
||||||
|
addedObject.LevelStart();
|
||||||
|
});
|
||||||
|
|
||||||
|
var toRemove = new List<ILevelObject>(this._toRemove);
|
||||||
|
toRemove.ForEach(removedObject =>
|
||||||
|
{
|
||||||
|
this._toRemove.Remove(removedObject);
|
||||||
|
_levelObjects.Remove(removedObject);
|
||||||
|
Removed?.Invoke(removedObject);
|
||||||
|
removedObject.LevelDestroy();
|
||||||
|
});
|
||||||
|
toRemove.Clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void ClearLevel()
|
||||||
|
{
|
||||||
|
foreach (var obj in _levelObjects)
|
||||||
|
{
|
||||||
|
obj.RemoveFromLevel();
|
||||||
|
}
|
||||||
|
Clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// permet de loader un scriptable object de niveau
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="level">le niveau à loader</param>
|
||||||
|
/// <param name="shouldClear">est ce qu'on veut effacer ce qui est déjà là?</param>
|
||||||
|
public void LoadLevel(Level level, bool shouldClear = false)
|
||||||
|
{
|
||||||
|
if (shouldClear)
|
||||||
|
{
|
||||||
|
ClearLevel();
|
||||||
|
}
|
||||||
|
|
||||||
|
_currentLevel = level;
|
||||||
|
Grid grid = Object.FindObjectOfType<Grid>();
|
||||||
|
//create new grid if there is none
|
||||||
|
if (!grid)
|
||||||
|
{
|
||||||
|
grid = new GameObject("Grid").AddComponent<Grid>();
|
||||||
|
}
|
||||||
|
//remove all tilemaps if there is a grid
|
||||||
|
else
|
||||||
|
{
|
||||||
|
foreach (Transform child in grid.transform)
|
||||||
|
{
|
||||||
|
Object.Destroy(child.gameObject);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//generate all tilemaps
|
||||||
|
foreach (TilemapData tilemapData in _currentLevel)
|
||||||
|
{
|
||||||
|
var tilemap = new GameObject(tilemapData.Key).AddComponent<Tilemap>();
|
||||||
|
tilemap.gameObject.AddComponent<TilemapRenderer>();
|
||||||
|
tilemapData.LoadToTilemap(tilemap);
|
||||||
|
tilemap.transform.SetParent(grid.transform);
|
||||||
|
}
|
||||||
|
Debug.Log("level loaded successfully");
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// permet de loader un scriptable object de niveau
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="levelName">le nom du niveau à loader</param>
|
||||||
|
/// <param name="shouldClear">est ce qu'on veut effacer ce qui est déjà là?</param>
|
||||||
|
public void LoadLevel(string levelName, bool shouldClear = false)
|
||||||
|
{
|
||||||
|
if (shouldClear)
|
||||||
|
{
|
||||||
|
ClearLevel();
|
||||||
|
}
|
||||||
|
|
||||||
|
//fetch level from database
|
||||||
|
_currentLevel = Database.Instance.ScriptableObjects[levelName] as Level;
|
||||||
|
|
||||||
|
LoadLevel(_currentLevel, shouldClear);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public void SaveFile()
|
||||||
|
{
|
||||||
|
var list = _levelObjects.Select(obj => obj.ToDictionary()).ToList();
|
||||||
|
|
||||||
|
foreach (var tilemapData in _currentLevel)
|
||||||
|
{
|
||||||
|
var levelConfig = tilemapData.ToDictionary();
|
||||||
|
levelConfig[nameof(ILevelObject.ObjectType)] = nameof(ILevelObject.ObjectType.Tilemap);
|
||||||
|
list.Add(levelConfig);
|
||||||
|
}
|
||||||
|
string saved = JsonConvert.SerializeObject(list);
|
||||||
|
|
||||||
|
File.WriteAllText(SavePath, saved, Encoding.UTF8);
|
||||||
|
Debug.Log("game saved successfully");
|
||||||
|
}
|
||||||
|
|
||||||
|
public void LoadFile()
|
||||||
|
{
|
||||||
|
|
||||||
|
string saved = File.ReadAllText(SavePath, Encoding.UTF8);
|
||||||
|
var dicts = JsonConvert.DeserializeObject<List<Dictionary<string, object>>>(saved);
|
||||||
|
|
||||||
|
ClearLevel();
|
||||||
|
|
||||||
|
var tilemapDicts = dicts.FindAll(x => x[nameof(ILevelObject.ObjectType)].ToString() == nameof(ILevelObject.ObjectType.Tilemap));
|
||||||
|
foreach (var tilemapDict in tilemapDicts) CreateTilemap(tilemapDict);
|
||||||
|
|
||||||
|
var prefabDicts = dicts.FindAll(x => x[nameof(ILevelObject.ObjectType)].ToString() == nameof(ILevelObject.ObjectType.Prefab));
|
||||||
|
foreach (var prefabDict in prefabDicts) CreatePrefab(prefabDict);
|
||||||
|
|
||||||
|
var tileDicts = dicts.FindAll(x => x[nameof(ILevelObject.ObjectType)].ToString() == nameof(ILevelObject.ObjectType.Tile));
|
||||||
|
foreach (var tileDict in tileDicts) CreateTile(tileDict);
|
||||||
|
|
||||||
|
Debug.Log("game loaded successfully");
|
||||||
|
}
|
||||||
|
private void CreatePrefab(Dictionary<string, object> dict)
|
||||||
|
{
|
||||||
|
var name = dict["Name"].ToString();
|
||||||
|
var prefab = Database.Instance.Prefabs[name];
|
||||||
|
var instance = prefab.Create(Vector3.zero, parent: LevelTransform);
|
||||||
|
var comp = instance.GetComponent<LevelObject>();
|
||||||
|
comp.LoadDictionary(dict);
|
||||||
|
}
|
||||||
|
private void CreateTile(Dictionary<string, object> dict)
|
||||||
|
{
|
||||||
|
var name = dict["Name"].ToString();
|
||||||
|
|
||||||
|
var tile = Object.Instantiate(Database.Instance.ScriptableObjects[name]) as LevelTile;
|
||||||
|
tile.Instantiated = true;
|
||||||
|
tile.LoadDictionary(dict);
|
||||||
|
tile.AddToLevel();
|
||||||
|
}
|
||||||
|
private void CreateTilemap(Dictionary<string, object> dict)
|
||||||
|
{
|
||||||
|
TilemapData.FromDictionary(dict);
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
}
|
||||||
11
Assets/Scripts/LevelManager/LevelManager.cs.meta
Normal file
11
Assets/Scripts/LevelManager/LevelManager.cs.meta
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: e3bef4a71d706874fb7500a47d3f4f1d
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
@ -1,243 +1,6 @@
|
|||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using Unity.Plastic.Newtonsoft.Json;
|
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
using UnityEngine.Tilemaps;
|
|
||||||
using GatherAndDefend.LevelEditor;
|
using GatherAndDefend.LevelEditor;
|
||||||
using Unity.VisualScripting.YamlDotNet.Core.Tokens;
|
|
||||||
using System.Text;
|
|
||||||
using System.IO;
|
|
||||||
|
|
||||||
#region [custom inspector]
|
|
||||||
#if UNITY_EDITOR
|
|
||||||
using UnityEditor;
|
|
||||||
|
|
||||||
[CustomEditor(typeof(LevelManagerScript))]
|
|
||||||
public class LevelManagerEditor : Editor
|
|
||||||
{
|
|
||||||
public override void OnInspectorGUI()
|
|
||||||
{
|
|
||||||
DrawDefaultInspector();
|
|
||||||
if (GUILayout.Button("Save"))
|
|
||||||
{
|
|
||||||
LevelManager.Instance.SaveFile();
|
|
||||||
}
|
|
||||||
if (GUILayout.Button("Load"))
|
|
||||||
{
|
|
||||||
LevelManager.Instance.LoadFile();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
#region [singleton level manager]
|
|
||||||
public class LevelManager : Singleton<LevelManager>
|
|
||||||
{
|
|
||||||
string SavePath => Application.dataPath + "/save.txt";
|
|
||||||
public delegate void LevelAction(ILevelObject levelObject);
|
|
||||||
public delegate bool LevelPredicate<T>(T levelObject) where T : ILevelObject;
|
|
||||||
public event LevelAction Added;
|
|
||||||
public event LevelAction Removed;
|
|
||||||
|
|
||||||
private readonly List<ILevelObject> _toAdd;
|
|
||||||
private readonly List<ILevelObject> _toRemove;
|
|
||||||
private readonly List<ILevelObject> _levelObjects;
|
|
||||||
|
|
||||||
public Level _currentLevel;
|
|
||||||
|
|
||||||
public Transform LevelTransform
|
|
||||||
{
|
|
||||||
get;private set;
|
|
||||||
}
|
|
||||||
public LevelManager()
|
|
||||||
{
|
|
||||||
_toAdd = new List<ILevelObject>();
|
|
||||||
_toRemove = new List<ILevelObject>();
|
|
||||||
_levelObjects = new List<ILevelObject>();
|
|
||||||
|
|
||||||
var mgrScript = Object.FindObjectOfType<LevelManagerScript>();
|
|
||||||
if (!mgrScript) mgrScript = new GameObject(nameof(LevelManager)).AddComponent<LevelManagerScript>();
|
|
||||||
LevelTransform = mgrScript.transform;
|
|
||||||
}
|
|
||||||
|
|
||||||
#region [~CRUD~]
|
|
||||||
public void Add(ILevelObject levelObject)
|
|
||||||
{
|
|
||||||
_toAdd.Add(levelObject);
|
|
||||||
}
|
|
||||||
public void Remove(ILevelObject levelObject)
|
|
||||||
{
|
|
||||||
_toRemove.Add(levelObject);
|
|
||||||
}
|
|
||||||
public void Clear()
|
|
||||||
{
|
|
||||||
_toAdd.Clear();
|
|
||||||
_toRemove.Clear();
|
|
||||||
_levelObjects.Clear();
|
|
||||||
}
|
|
||||||
public T Get<T>(LevelPredicate<T> predicate = null) where T : ILevelObject
|
|
||||||
{
|
|
||||||
if (predicate == null) predicate = (generic) => true;
|
|
||||||
return (T)_levelObjects.Find(levelObject => levelObject is T generic && predicate(generic));
|
|
||||||
}
|
|
||||||
public List<T> GetAll<T>(LevelPredicate<T> predicate = null) where T : ILevelObject
|
|
||||||
{
|
|
||||||
if (predicate == null) predicate = (generic) => true;
|
|
||||||
List<T> ret = new();
|
|
||||||
foreach (var levelObject in _levelObjects) if (levelObject is T generic && predicate(generic)) ret.Add(generic);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
public int Count<T>(LevelPredicate<T> predicate = null) where T : ILevelObject
|
|
||||||
{
|
|
||||||
return GetAll(predicate).Count;
|
|
||||||
}
|
|
||||||
public bool Has<T>(LevelPredicate<T> predicate = null) where T : ILevelObject
|
|
||||||
{
|
|
||||||
if (predicate == null) predicate = (generic) => true;
|
|
||||||
return _levelObjects.Exists(levelObject => levelObject is T generic && predicate(generic));
|
|
||||||
}
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
#region [Level management]
|
|
||||||
public void UpdateLevel()
|
|
||||||
{
|
|
||||||
_levelObjects.ForEach(levelObject => levelObject.LevelUpdate());
|
|
||||||
|
|
||||||
var toAdd = new List<ILevelObject>(this._toAdd);
|
|
||||||
toAdd.ForEach(addedObject =>
|
|
||||||
{
|
|
||||||
this._toAdd.Remove(addedObject);
|
|
||||||
_levelObjects.Add(addedObject);
|
|
||||||
Added?.Invoke(addedObject);
|
|
||||||
addedObject.LevelStart();
|
|
||||||
});
|
|
||||||
|
|
||||||
var toRemove = new List<ILevelObject>(this._toRemove);
|
|
||||||
toRemove.ForEach(removedObject =>
|
|
||||||
{
|
|
||||||
this._toRemove.Remove(removedObject);
|
|
||||||
_levelObjects.Remove(removedObject);
|
|
||||||
Removed?.Invoke(removedObject);
|
|
||||||
removedObject.LevelDestroy();
|
|
||||||
});
|
|
||||||
toRemove.Clear();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void ClearLevel()
|
|
||||||
{
|
|
||||||
foreach (var obj in _levelObjects)
|
|
||||||
{
|
|
||||||
obj.RemoveFromLevel();
|
|
||||||
}
|
|
||||||
Clear();
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// permet de loader un scriptable object de niveau
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="level">le niveau à loader</param>
|
|
||||||
/// <param name="shouldClear">est ce qu'on veut effacer ce qui est déjà là?</param>
|
|
||||||
public void LoadLevel(Level level, bool shouldClear = false)
|
|
||||||
{
|
|
||||||
if (shouldClear)
|
|
||||||
{
|
|
||||||
ClearLevel();
|
|
||||||
}
|
|
||||||
|
|
||||||
_currentLevel = level;
|
|
||||||
Grid grid = Object.FindObjectOfType<Grid>();
|
|
||||||
//create new grid if there is none
|
|
||||||
if (!grid)
|
|
||||||
{
|
|
||||||
grid = new GameObject("Grid").AddComponent<Grid>();
|
|
||||||
}
|
|
||||||
//remove all tilemaps if there is a grid
|
|
||||||
else
|
|
||||||
{
|
|
||||||
foreach (Transform child in grid.transform)
|
|
||||||
{
|
|
||||||
Object.Destroy(child.gameObject);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//generate all tilemaps
|
|
||||||
foreach (TilemapData tilemapData in _currentLevel)
|
|
||||||
{
|
|
||||||
var tilemap = new GameObject(tilemapData.Key).AddComponent<Tilemap>();
|
|
||||||
tilemap.gameObject.AddComponent<TilemapRenderer>();
|
|
||||||
tilemapData.LoadToTilemap(tilemap);
|
|
||||||
tilemap.transform.SetParent(grid.transform);
|
|
||||||
}
|
|
||||||
Debug.Log("level loaded successfully");
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// permet de loader un scriptable object de niveau
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="levelName">le nom du niveau à loader</param>
|
|
||||||
/// <param name="shouldClear">est ce qu'on veut effacer ce qui est déjà là?</param>
|
|
||||||
public void LoadLevel(string levelName, bool shouldClear = false)
|
|
||||||
{
|
|
||||||
if (shouldClear)
|
|
||||||
{
|
|
||||||
ClearLevel();
|
|
||||||
}
|
|
||||||
|
|
||||||
//fetch level from database
|
|
||||||
_currentLevel = Database.Instance.ScriptableObjects[levelName] as Level;
|
|
||||||
|
|
||||||
LoadLevel(_currentLevel, shouldClear);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public void SaveFile()
|
|
||||||
{
|
|
||||||
var list = _levelObjects.Select(obj => obj.ToDictionary()).ToList();
|
|
||||||
string saved = JsonConvert.SerializeObject(list);
|
|
||||||
|
|
||||||
File.WriteAllText(SavePath, saved, Encoding.UTF8);
|
|
||||||
Debug.Log("game saved successfully");
|
|
||||||
}
|
|
||||||
|
|
||||||
public void LoadFile()
|
|
||||||
{
|
|
||||||
|
|
||||||
string saved = File.ReadAllText(SavePath, Encoding.UTF8);
|
|
||||||
var dicts = JsonConvert.DeserializeObject<List<Dictionary<string, object>>>(saved);
|
|
||||||
|
|
||||||
ClearLevel();
|
|
||||||
|
|
||||||
var prefabDicts = dicts.FindAll(x => x[nameof(ILevelObject.ObjectType)].ToString() == nameof(ILevelObject.ObjectType.Prefab));
|
|
||||||
foreach (var prefabDict in prefabDicts) CreatePrefab(prefabDict);
|
|
||||||
|
|
||||||
var tileDicts = dicts.FindAll(x => x[nameof(ILevelObject.ObjectType)].ToString() == nameof(ILevelObject.ObjectType.Tile));
|
|
||||||
foreach (var tileDict in tileDicts) CreateTile(tileDict);
|
|
||||||
|
|
||||||
Debug.Log("game loaded successfully");
|
|
||||||
}
|
|
||||||
private void CreatePrefab(Dictionary<string, object> dict)
|
|
||||||
{
|
|
||||||
var name = dict["Name"].ToString();
|
|
||||||
var prefab = Database.Instance.Prefabs[name];
|
|
||||||
var instance = prefab.Create(Vector3.zero, parent: LevelTransform);
|
|
||||||
var comp = instance.GetComponent<LevelObject>();
|
|
||||||
comp.LoadDictionary(dict);
|
|
||||||
}
|
|
||||||
private void CreateTile(Dictionary<string, object> dict)
|
|
||||||
{
|
|
||||||
var name = dict["Name"].ToString();
|
|
||||||
|
|
||||||
var tile = Object.Instantiate(Database.Instance.ScriptableObjects[name]) as LevelTile;
|
|
||||||
tile.Instantiated = true;
|
|
||||||
tile.LoadDictionary(dict);
|
|
||||||
tile.AddToLevel();
|
|
||||||
}
|
|
||||||
#endregion
|
|
||||||
}
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
#region [mono behaviour]
|
|
||||||
public class LevelManagerScript : MonoBehaviour
|
public class LevelManagerScript : MonoBehaviour
|
||||||
{
|
{
|
||||||
public Level firstLevel;
|
public Level firstLevel;
|
||||||
@ -265,5 +28,4 @@ public class LevelManagerScript : MonoBehaviour
|
|||||||
{
|
{
|
||||||
LevelManager.Instance.UpdateLevel();
|
LevelManager.Instance.UpdateLevel();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endregion
|
|
||||||
@ -51,6 +51,8 @@ public abstract class LevelObject : MonoBehaviour, ILevelObject
|
|||||||
|
|
||||||
public void RemoveFromLevel()
|
public void RemoveFromLevel()
|
||||||
{
|
{
|
||||||
|
//checks if go is still in scene before removing it
|
||||||
|
if (!this) return;
|
||||||
Destroy(gameObject);
|
Destroy(gameObject);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1,9 +1,8 @@
|
|||||||
using System.Collections;
|
using System.Collections;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using Unity.Plastic.Newtonsoft.Json.Linq;
|
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
using UnityEngine.Tilemaps;
|
using UnityEngine.Tilemaps;
|
||||||
using static Extensions;
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// can be inherited by tiles in order to be added to the level manager
|
/// can be inherited by tiles in order to be added to the level manager
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@ -89,16 +88,17 @@ public abstract class LevelTile : TileBase, ILevelObject
|
|||||||
var tilemapName = dict[nameof(Tilemap)].ToString();
|
var tilemapName = dict[nameof(Tilemap)].ToString();
|
||||||
|
|
||||||
_tilemap = FindObjectOfType<Grid>().GetComponentInChildren<Tilemap>(tilemapName);
|
_tilemap = FindObjectOfType<Grid>().GetComponentInChildren<Tilemap>(tilemapName);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void AddToLevel()
|
public void AddToLevel()
|
||||||
{
|
{
|
||||||
|
if (!_tilemap) return;
|
||||||
_tilemap.SetTile(Vector3Int.RoundToInt(Position), this);
|
_tilemap.SetTile(Vector3Int.RoundToInt(Position), this);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void RemoveFromLevel()
|
public void RemoveFromLevel()
|
||||||
{
|
{
|
||||||
|
if (!_tilemap) return;
|
||||||
_tilemap.SetTile(Vector3Int.RoundToInt(Position), null);
|
_tilemap.SetTile(Vector3Int.RoundToInt(Position), null);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
1
Assets/save.txt
Normal file
1
Assets/save.txt
Normal file
File diff suppressed because one or more lines are too long
@ -1,5 +1,5 @@
|
|||||||
fileFormatVersion: 2
|
fileFormatVersion: 2
|
||||||
guid: 0e51df1fc98540b49abfd724a8df0eb6
|
guid: e12fc9910d378cd4b913db867d6c3018
|
||||||
TextScriptImporter:
|
TextScriptImporter:
|
||||||
externalObjects: {}
|
externalObjects: {}
|
||||||
userData:
|
userData:
|
||||||
@ -1 +0,0 @@
|
|||||||
[{"Name":"StickSpawner","Position":[-8.0,-5.0,0.0],"Tilemap":"Spawners","_prefab":"baseArcher","_spawnOnStart":true,"_spawnSpeed":0.0},{"Name":"StickSpawner","Position":[-8.0,-3.0,0.0],"Tilemap":"Spawners","_prefab":"baseArcher","_spawnOnStart":true,"_spawnSpeed":0.0},{"Name":"StickSpawner","Position":[-8.0,-1.0,0.0],"Tilemap":"Spawners","_prefab":"baseArcher","_spawnOnStart":true,"_spawnSpeed":0.0},{"Name":"StickSpawner","Position":[-8.0,1.0,0.0],"Tilemap":"Spawners","_prefab":"baseArcher","_spawnOnStart":true,"_spawnSpeed":0.0},{"Name":"baseArcher(Clone)","Position":[-8.0,-5.0,0.0],"_hp":100,"_speed":0.0,"_attack_speed":2.0,"_attack_damage":10},{"Name":"baseArcher(Clone)","Position":[-8.0,-3.0,0.0],"_hp":100,"_speed":0.0,"_attack_speed":2.0,"_attack_damage":10},{"Name":"baseArcher(Clone)","Position":[-8.0,-1.0,0.0],"_hp":100,"_speed":0.0,"_attack_speed":2.0,"_attack_damage":10},{"Name":"baseArcher(Clone)","Position":[-8.0,1.0,0.0],"_hp":100,"_speed":0.0,"_attack_speed":2.0,"_attack_damage":10}]
|
|
||||||
17
ProjectSettings/BurstAotSettings_StandaloneWindows.json
Normal file
17
ProjectSettings/BurstAotSettings_StandaloneWindows.json
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
{
|
||||||
|
"MonoBehaviour": {
|
||||||
|
"Version": 4,
|
||||||
|
"EnableBurstCompilation": true,
|
||||||
|
"EnableOptimisations": true,
|
||||||
|
"EnableSafetyChecks": false,
|
||||||
|
"EnableDebugInAllBuilds": false,
|
||||||
|
"EnableArmv9SecurityFeatures": false,
|
||||||
|
"CpuMinTargetX32": 0,
|
||||||
|
"CpuMaxTargetX32": 0,
|
||||||
|
"CpuMinTargetX64": 0,
|
||||||
|
"CpuMaxTargetX64": 0,
|
||||||
|
"CpuTargetsX32": 6,
|
||||||
|
"CpuTargetsX64": 72,
|
||||||
|
"OptimizeFor": 0
|
||||||
|
}
|
||||||
|
}
|
||||||
6
ProjectSettings/CommonBurstAotSettings.json
Normal file
6
ProjectSettings/CommonBurstAotSettings.json
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
"MonoBehaviour": {
|
||||||
|
"Version": 4,
|
||||||
|
"DisabledWarnings": ""
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
x
Reference in New Issue
Block a user