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:
Felix Boucher 2023-05-28 22:00:47 -04:00
parent f1a328122c
commit 8b5d0370dc
29 changed files with 740 additions and 519 deletions

8
Assets/Docu.meta Normal file
View File

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 8a15f4b90f65f61489693e72dc43b1bd
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

Before

Width:  |  Height:  |  Size: 110 KiB

After

Width:  |  Height:  |  Size: 110 KiB

View 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();
}
}

View File

@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: d7329f36f451bd2479a760e1fc38e1a3
guid: ca089e7bfdaf2a943aebf7ce03bbd2e6
MonoImporter:
externalObjects: {}
serializedVersion: 2

View 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();
}
}
}

View File

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 0c34c07f45297c74ca25240700f7903d
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -123,7 +123,7 @@ NavMeshSettings:
debug:
m_Flags: 0
m_NavMeshData: {fileID: 0}
--- !u!1 &86093666
--- !u!1 &364640801
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
@ -131,9 +131,127 @@ GameObject:
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 86093667}
- component: {fileID: 86093669}
- component: {fileID: 86093668}
- component: {fileID: 364640805}
- component: {fileID: 364640804}
- 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_Name: Entities
m_TagString: Untagged
@ -141,13 +259,13 @@ GameObject:
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &86093667
--- !u!4 &448766792
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {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_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
@ -156,13 +274,13 @@ Transform:
m_Father: {fileID: 1827197199}
m_RootOrder: 1
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!483693784 &86093668
--- !u!483693784 &448766793
TilemapRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 86093666}
m_GameObject: {fileID: 448766791}
m_Enabled: 1
m_CastShadows: 0
m_ReceiveShadows: 0
@ -196,7 +314,7 @@ TilemapRenderer:
m_LightmapParameters: {fileID: 0}
m_SortingLayerID: 0
m_SortingLayer: 0
m_SortingOrder: 0
m_SortingOrder: 1
m_ChunkSize: {x: 32, y: 32, z: 32}
m_ChunkCullingBounds: {x: 0, y: 0, z: 0}
m_MaxChunkCount: 16
@ -205,13 +323,13 @@ TilemapRenderer:
m_Mode: 0
m_DetectChunkCullingBounds: 0
m_MaskInteraction: 0
--- !u!1839735485 &86093669
--- !u!1839735485 &448766794
Tilemap:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 86093666}
m_GameObject: {fileID: 448766791}
m_Enabled: 1
m_Tiles:
- first: {x: -10, y: -4, z: 0}
@ -707,7 +825,7 @@ Tilemap:
e31: 0
e32: 0
e33: 1
--- !u!1 &364640801
--- !u!1 &1134605333
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
@ -715,127 +833,9 @@ GameObject:
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 364640805}
- component: {fileID: 364640804}
- 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 &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}
- component: {fileID: 1134605334}
- component: {fileID: 1134605336}
- component: {fileID: 1134605335}
m_Layer: 0
m_Name: Background
m_TagString: Untagged
@ -843,13 +843,13 @@ GameObject:
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &449089079
--- !u!4 &1134605334
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {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_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
@ -858,13 +858,13 @@ Transform:
m_Father: {fileID: 1827197199}
m_RootOrder: 0
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!483693784 &449089080
--- !u!483693784 &1134605335
TilemapRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 449089078}
m_GameObject: {fileID: 1134605333}
m_Enabled: 1
m_CastShadows: 0
m_ReceiveShadows: 0
@ -907,13 +907,13 @@ TilemapRenderer:
m_Mode: 0
m_DetectChunkCullingBounds: 0
m_MaskInteraction: 0
--- !u!1839735485 &449089081
--- !u!1839735485 &1134605336
Tilemap:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 449089078}
m_GameObject: {fileID: 1134605333}
m_Enabled: 1
m_Tiles:
- first: {x: -10, y: -4, z: 0}
@ -2439,7 +2439,7 @@ Tilemap:
e31: 0
e32: 0
e33: 1
--- !u!1 &991823372
--- !u!1 &1588294913
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
@ -2447,9 +2447,9 @@ GameObject:
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 991823373}
- component: {fileID: 991823375}
- component: {fileID: 991823374}
- component: {fileID: 1588294914}
- component: {fileID: 1588294916}
- component: {fileID: 1588294915}
m_Layer: 6
m_Name: Spawners
m_TagString: Untagged
@ -2457,13 +2457,13 @@ GameObject:
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &991823373
--- !u!4 &1588294914
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {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_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
@ -2472,13 +2472,13 @@ Transform:
m_Father: {fileID: 1827197199}
m_RootOrder: 2
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!483693784 &991823374
--- !u!483693784 &1588294915
TilemapRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 991823372}
m_GameObject: {fileID: 1588294913}
m_Enabled: 1
m_CastShadows: 0
m_ReceiveShadows: 0
@ -2521,13 +2521,13 @@ TilemapRenderer:
m_Mode: 0
m_DetectChunkCullingBounds: 0
m_MaskInteraction: 0
--- !u!1839735485 &991823375
--- !u!1839735485 &1588294916
Tilemap:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 991823372}
m_GameObject: {fileID: 1588294913}
m_Enabled: 1
m_Tiles:
- first: {x: -10, y: -4, z: 0}
@ -2709,9 +2709,9 @@ Transform:
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children:
- {fileID: 449089079}
- {fileID: 86093667}
- {fileID: 991823373}
- {fileID: 1134605334}
- {fileID: 448766792}
- {fileID: 1588294914}
m_Father: {fileID: 0}
m_RootOrder: 1
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
@ -2729,48 +2729,3 @@ MonoBehaviour:
m_EditorClassIdentifier:
_path: {fileID: 102900000, guid: c9341b1bdc1103b4e832cf62d29e5471, type: 3}
_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

Binary file not shown.

View 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:

View 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}

View File

@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 02daecb0115395844b4932445d039051
PrefabImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -7,54 +7,18 @@ using System;
#if UNITY_EDITOR
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
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);
[Serializable]
@ -95,9 +59,7 @@ public class Database : SingletonBehaviour<Database>
_prefabs = new List<GameObject>();
_scriptableObjects = new List<ScriptableObject>();
}
[Header("Editor section")]
[SerializeField]
private List<DefaultAsset> _folders;
public List<DefaultAsset> Folders => _folders;
#if UNITY_EDITOR
#endif
}

View File

@ -31,10 +31,6 @@ public static class Extensions
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)
{
if (!prefab)
{
Debug.Log("");
}
if (rotation == default) rotation = Quaternion.identity;
var instance = GameObject.Instantiate(prefab, position, rotation);
instance.transform.SetParent(parent);

View File

@ -1,5 +1,9 @@
using UnityEngine;
/// <summary>
/// a singleton but as a MonoBehaviour
/// </summary>
/// <typeparam name="T"></typeparam>
public class SingletonBehaviour<T> : MonoBehaviour where T : SingletonBehaviour<T>
{
public static T Instance

View File

@ -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;
}
}
}

View File

@ -1,3 +1,4 @@
#if UNITY_EDITOR
using UnityEditor;
#endif
@ -12,7 +13,13 @@ namespace GatherAndDefend.LevelEditor
#if UNITY_EDITOR
[SerializeField]
private DefaultAsset _path;
public DefaultAsset Path
{
get => _path;
set => _path = value;
}
#endif
[SerializeField]
private Level _level;
public Level Level
@ -20,10 +27,6 @@ namespace GatherAndDefend.LevelEditor
get => _level;
set => _level = value;
}
public DefaultAsset Path
{
get => _path;
set => _path = value;
}
}
}

View File

@ -3,6 +3,8 @@ using UnityEngine.Tilemaps;
using UnityEngine;
using System;
using System.Collections;
using System.Linq;
using Newtonsoft.Json;
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()
{
return _tiles.GetEnumerator();

View File

@ -6,7 +6,8 @@ public interface ILevelObject
public enum ObjectType
{
Tile = 0,
Prefab = 1
Prefab = 1,
Tilemap = 2
}
string Name { get; }

View 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
}

View File

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: e3bef4a71d706874fb7500a47d3f4f1d
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -1,243 +1,6 @@
using System.Collections.Generic;
using System.Linq;
using Unity.Plastic.Newtonsoft.Json;
using UnityEngine;
using UnityEngine.Tilemaps;
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 Level firstLevel;
@ -265,5 +28,4 @@ public class LevelManagerScript : MonoBehaviour
{
LevelManager.Instance.UpdateLevel();
}
}
#endregion
}

View File

@ -51,6 +51,8 @@ public abstract class LevelObject : MonoBehaviour, ILevelObject
public void RemoveFromLevel()
{
//checks if go is still in scene before removing it
if (!this) return;
Destroy(gameObject);
}
}

View File

@ -1,9 +1,8 @@
using System.Collections;
using System.Collections.Generic;
using Unity.Plastic.Newtonsoft.Json.Linq;
using UnityEngine;
using UnityEngine.Tilemaps;
using static Extensions;
/// <summary>
/// can be inherited by tiles in order to be added to the level manager
/// </summary>
@ -89,16 +88,17 @@ public abstract class LevelTile : TileBase, ILevelObject
var tilemapName = dict[nameof(Tilemap)].ToString();
_tilemap = FindObjectOfType<Grid>().GetComponentInChildren<Tilemap>(tilemapName);
}
public void AddToLevel()
{
if (!_tilemap) return;
_tilemap.SetTile(Vector3Int.RoundToInt(Position), this);
}
public void RemoveFromLevel()
{
if (!_tilemap) return;
_tilemap.SetTile(Vector3Int.RoundToInt(Position), null);
}
}

1
Assets/save.txt Normal file

File diff suppressed because one or more lines are too long

View File

@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 0e51df1fc98540b49abfd724a8df0eb6
guid: e12fc9910d378cd4b913db867d6c3018
TextScriptImporter:
externalObjects: {}
userData:

View File

@ -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}]

View 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
}
}

View File

@ -0,0 +1,6 @@
{
"MonoBehaviour": {
"Version": 4,
"DisabledWarnings": ""
}
}