-
Notifications
You must be signed in to change notification settings - Fork 58
/
Copy pathObjectSpawnController.cs
100 lines (86 loc) · 2.3 KB
/
ObjectSpawnController.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
// --------------------------------------------------------------------------------------------------------------------
// <copyright file="ObjectSpawner.cs">
// Copyright (c) 2020 Johannes Deml. All rights reserved.
// </copyright>
// <author>
// Johannes Deml
// public@deml.io
// </author>
// --------------------------------------------------------------------------------------------------------------------
using System.Collections.Generic;
using UnityEngine;
namespace Supyrb
{
public class ObjectSpawnController : MonoBehaviour
{
[SerializeField]
private ObjectSpawner objectSpawnerPrefab = null;
[SerializeField]
private int spawnerCount = 4;
[SerializeField]
private float spawnerRadius = 0.5f;
[SerializeField]
private float spawnerCoolDown = 0.5f;
private List<ObjectSpawner> spawners;
private void Awake()
{
spawners = new List<ObjectSpawner>();
for (int i = 0; i < spawnerCount; i++)
{
var spawner = Instantiate(objectSpawnerPrefab, transform);
spawners.Add(spawner);
}
UpdateSpawners();
}
[ContextMenu("Add Spawner")]
public void AddSpawner()
{
var spawner = Instantiate(objectSpawnerPrefab, transform);
spawners.Add(spawner);
UpdateSpawners();
}
[ContextMenu("Remove Spawner")]
public void RemoveSpawner()
{
if (spawners.Count == 0)
{
return;
}
var spawner = spawners[spawners.Count - 1];
spawners.RemoveAt(spawners.Count - 1);
Destroy(spawner.gameObject);
UpdateSpawners();
}
[ContextMenu("Pause Spawning")]
public void PauseSpawning()
{
foreach (var spawner in spawners)
{
spawner.PauseSpawning();
}
}
[ContextMenu("Resume Spawning")]
public void ResumeSpawning()
{
foreach (var spawner in spawners)
{
spawner.ResumeSpawning();
}
}
private void UpdateSpawners()
{
int count = spawners.Count;
float angleStep = 360f / count;
float coolDownStep = spawnerCoolDown / count;
for (int i = 0; i < count; i++)
{
var spawner = spawners[i];
float angle = i * angleStep;
Vector3 position = new Vector3(Mathf.Cos(angle * Mathf.Deg2Rad), 0f, Mathf.Sin(angle * Mathf.Deg2Rad)) * spawnerRadius;
spawner.transform.localPosition = position;
spawner.SpawnCoolDownSeconds = spawnerCoolDown;
spawner.SpawnOffsetSeconds = i * coolDownStep;
}
}
}
}