Skip to content

Commit e391cf4

Browse files
committed
World Generator as a scriptable object
1 parent 70c30b7 commit e391cf4

17 files changed

+117
-90
lines changed

Demo/Demo-URP.unitypackage

50.2 KB
Binary file not shown.

Editor/WorldMapGeneratorEditor.cs

+3-3
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33

44
namespace Gameframe.Procgen
55
{
6-
[CustomEditor(typeof(WorldMapGenerator), true)]
6+
[CustomEditor(typeof(WorldMapGenController), true)]
77
public class WorldMapGeneratorEditor : Editor
88
{
99
private bool autoUpdate = false;
@@ -14,14 +14,14 @@ public override void OnInspectorGUI()
1414
base.OnInspectorGUI();
1515
if (EditorGUI.EndChangeCheck() && autoUpdate)
1616
{
17-
((WorldMapGenerator) target).GenerateMap();
17+
((WorldMapGenController) target).GenerateMap();
1818
}
1919

2020
autoUpdate = EditorGUILayout.Toggle("Auto Update", autoUpdate);
2121

2222
if (GUILayout.Button("Generate"))
2323
{
24-
((WorldMapGenerator) target).GenerateMap();
24+
((WorldMapGenController) target).GenerateMap();
2525
}
2626
}
2727
}
+6
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
namespace Gameframe.Procgen
2+
{
3+
public interface IWorldMapLayerData
4+
{
5+
}
6+
}

Runtime/WorldMap/Layers/WorldMapLayerData.cs.meta renamed to Runtime/WorldMap/IWorldMapLayerData.cs.meta

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Runtime/WorldMap/Layers/HeightMapLayerData.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
namespace Gameframe.Procgen
22
{
33
[System.Serializable]
4-
public class HeightMapLayerData : WorldMapLayerData
4+
public class HeightMapLayerData : IWorldMapLayerData
55
{
66
public float[] heightMap;
77
}

Runtime/WorldMap/Layers/HeightMapLayerGenerator.cs

+3-3
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@
33

44
namespace Gameframe.Procgen
55
{
6-
[CreateAssetMenu]
7-
public class HeightMapLayerGenerator : ScriptableObject
6+
[CreateAssetMenu(menuName = "Gameframe/Procgen/Layers/HeightMapLayerGenerator")]
7+
public class HeightMapLayerGenerator : WorldMapLayerGenerator
88
{
99
public enum MapType
1010
{
@@ -66,7 +66,7 @@ public HeightMapLayerData Generate(int width, int height, int seed)
6666
};
6767
}
6868

69-
public void AddToWorld(WorldMapData worldMapData)
69+
public override void AddToWorld(WorldMapData worldMapData)
7070
{
7171
worldMapData.layers.Add(Generate(worldMapData.width,worldMapData.height,worldMapData.seed));
7272
}

Runtime/WorldMap/Layers/PoissonMapLayerData.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
namespace Gameframe.Procgen
55
{
66
[System.Serializable]
7-
public class PoissonMapLayerData : WorldMapLayerData
7+
public class PoissonMapLayerData : IWorldMapLayerData
88
{
99
public List<Vector2Int> points = new List<Vector2Int>();
1010
}

Runtime/WorldMap/Layers/PoissonMapLayerGenerator.cs

+3-3
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,15 @@
22

33
namespace Gameframe.Procgen
44
{
5-
[CreateAssetMenu]
6-
public class PoissonMapLayerGenerator : ScriptableObject
5+
[CreateAssetMenu(menuName = "Gameframe/Procgen/Layers/PoissonMapLayerGenerator")]
6+
public class PoissonMapLayerGenerator : WorldMapLayerGenerator
77
{
88
public float radius = 10;
99
public int maxSamplesPerPoint = 30;
1010
public bool useRegions = true;
1111
public int edgeAvoidance = 0;
1212

13-
public void AddToWorld(WorldMapData mapData)
13+
public override void AddToWorld(WorldMapData mapData)
1414
{
1515
if (useRegions)
1616
{

Runtime/WorldMap/Layers/RegionMapLayerData.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
namespace Gameframe.Procgen
55
{
66
[System.Serializable]
7-
public class RegionMapLayerData : WorldMapLayerData
7+
public class RegionMapLayerData : IWorldMapLayerData
88
{
99
public int[] regionMap;
1010
public List<RegionData> regions = new List<RegionData>();

Runtime/WorldMap/Layers/RegionMapLayerGenerator.cs

+3-3
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,13 @@
44

55
namespace Gameframe.Procgen
66
{
7-
[CreateAssetMenu]
8-
public class RegionMapLayerGenerator : ScriptableObject
7+
[CreateAssetMenu(menuName = "Gameframe/Procgen/Layers/RegionMapLayerGenerator")]
8+
public class RegionMapLayerGenerator : WorldMapLayerGenerator
99
{
1010
public int regionCount = 5;
1111
public float waterLevel = 0.2380952f;
1212

13-
public void AddToWorld(WorldMapData mapData)
13+
public override void AddToWorld(WorldMapData mapData)
1414
{
1515
var rng = new System.Random(mapData.seed);
1616
var regionLayer = new RegionMapLayerData();

Runtime/WorldMap/Layers/WorldMapLayerData.cs

-7
This file was deleted.

Runtime/WorldMap/Layers/WorldMapLayerGenerator.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,6 @@ namespace Gameframe.Procgen
44
{
55
public abstract class WorldMapLayerGenerator : ScriptableObject
66
{
7-
public abstract void AddToMap(WorldMapData mapData);
7+
public abstract void AddToWorld(WorldMapData mapData);
88
}
99
}

Runtime/WorldMap/Views/WorldMapVoxelMeshView.cs

+4-7
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,7 @@ public class WorldMapVoxelMeshView : MonoBehaviour, IWorldMapView
1515
[SerializeField] private int chunkWidth = 16;
1616

1717
[SerializeField] private int chunkHeight = 16;
18-
19-
[SerializeField] private WorldMapGenerator _generator;
20-
18+
2119
[SerializeField] private bool edges = false;
2220

2321
[SerializeField] private float edgeThickness = 1f;
@@ -26,12 +24,11 @@ public class WorldMapVoxelMeshView : MonoBehaviour, IWorldMapView
2624

2725
[SerializeField] private List<WorldMapViewChunk> chunkList = new List<WorldMapViewChunk>();
2826

27+
/// <summary>
28+
/// Start method here exists just to give us the enable checkbox in the inspector
29+
/// </summary>
2930
public void Start()
3031
{
31-
if (_generator != null)
32-
{
33-
34-
}
3532
}
3633

3734
private void OnDisable()

Runtime/WorldMap/WorldMapData.cs

+5-2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using System.Collections.Generic;
2+
using UnityEngine;
23

34
namespace Gameframe.Procgen
45
{
@@ -8,14 +9,16 @@ public class WorldMapData
89
public int seed;
910
public int width;
1011
public int height;
11-
public List<WorldMapLayerData> layers = new List<WorldMapLayerData>();
12+
13+
[SerializeReference]
14+
public List<IWorldMapLayerData> layers = new List<IWorldMapLayerData>();
1215

1316
/// <summary>
1417
/// Gets the first layer of the specified type
1518
/// </summary>
1619
/// <typeparam name="T">Type derived from WorldMapLayerData</typeparam>
1720
/// <returns>Returns the first layer of the requested type found. Otherwise null if no layer of that type exists.</returns>
18-
public T GetLayer<T>() where T : WorldMapLayerData
21+
public T GetLayer<T>() where T : class, IWorldMapLayerData
1922
{
2023
foreach (var layer in layers)
2124
{
+39
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
//Ignore those dumb 'never assigned to' warnings cuz this is Unity and our fields are serialized
2+
#pragma warning disable CS0649
3+
4+
using UnityEngine;
5+
6+
namespace Gameframe.Procgen
7+
{
8+
public class WorldMapGenController : MonoBehaviour
9+
{
10+
[SerializeField] private WorldMapGenerator _generator = null;
11+
12+
[SerializeField] private int seed = 100;
13+
14+
[SerializeField, HideInInspector] private WorldMapData _mapData;
15+
16+
private void Start()
17+
{
18+
GenerateMap();
19+
}
20+
21+
[ContextMenu("GenerateMap")]
22+
public void GenerateMap()
23+
{
24+
_mapData = _generator.GenerateMap(seed);
25+
DisplayMap(_mapData);
26+
}
27+
28+
private void DisplayMap(WorldMapData mapData)
29+
{
30+
var mapViews = GetComponents<IWorldMapView>();
31+
foreach (var view in mapViews)
32+
{
33+
view.DisplayMap(mapData);
34+
}
35+
}
36+
37+
}
38+
39+
}

Runtime/WorldMap/WorldMapGenController.cs.meta

+11
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Runtime/WorldMap/WorldMapGenerator.cs

+35-57
Original file line numberDiff line numberDiff line change
@@ -1,66 +1,44 @@
1-
//Ignore those dumb 'never assigned to' warnings cuz this is Unity and our fields are serialized
2-
#pragma warning disable CS0649
3-
1+
using System.Collections.Generic;
42
using UnityEngine;
53

64
namespace Gameframe.Procgen
75
{
8-
public class WorldMapGenerator : MonoBehaviour
6+
[CreateAssetMenu(menuName = "Gameframe/Procgen/WorldMapGenerator")]
7+
public class WorldMapGenerator : ScriptableObject
8+
{
9+
[SerializeField] private int mapWidth = 100;
10+
[SerializeField] private int mapHeight = 100;
11+
[SerializeField] private List<WorldMapLayerGenerator> layerGenerators = new List<WorldMapLayerGenerator>();
12+
13+
public WorldMapData GenerateMap(int seed)
914
{
10-
[SerializeField] private int mapWidth = 100;
11-
12-
[SerializeField] private int mapHeight = 100;
13-
14-
[SerializeField] private HeightMapLayerGenerator heightMapGenerator;
15-
16-
[SerializeField] private RegionMapLayerGenerator regionMapGenerator;
17-
18-
[SerializeField] private PoissonMapLayerGenerator poissonMapGenerator;
19-
20-
[SerializeField] private int seed = 100;
21-
22-
private void Start()
23-
{
24-
GenerateMap();
25-
}
26-
27-
[ContextMenu("GenerateMap")]
28-
public void GenerateMap()
29-
{
30-
var worldData = new WorldMapData
31-
{
32-
seed = seed,
33-
width = mapWidth,
34-
height = mapHeight
35-
};
36-
heightMapGenerator.AddToWorld(worldData);
37-
regionMapGenerator.AddToWorld(worldData);
38-
poissonMapGenerator.AddToWorld(worldData);
39-
DisplayMap(worldData);
40-
}
41-
42-
private void DisplayMap(WorldMapData mapData)
43-
{
44-
var mapViews = GetComponents<IWorldMapView>();
45-
foreach (var view in mapViews)
46-
{
47-
view.DisplayMap(mapData);
48-
}
49-
}
50-
51-
private void OnValidate()
52-
{
53-
if (mapWidth <= 0)
54-
{
55-
mapWidth = 1;
56-
}
57-
58-
if (mapHeight <= 0)
59-
{
60-
mapHeight = 1;
61-
}
62-
}
15+
var worldData = new WorldMapData
16+
{
17+
seed = seed,
18+
width = mapWidth,
19+
height = mapHeight
20+
};
21+
22+
for (int i = 0; i < layerGenerators.Count; i++)
23+
{
24+
layerGenerators[i].AddToWorld(worldData);
25+
}
26+
27+
return worldData;
28+
}
6329

30+
private void OnValidate()
31+
{
32+
if (mapWidth <= 0)
33+
{
34+
mapWidth = 1;
35+
}
36+
37+
if (mapHeight <= 0)
38+
{
39+
mapHeight = 1;
40+
}
6441
}
42+
}
6543

6644
}

0 commit comments

Comments
 (0)