diff --git a/Assets/Prefabs/GameController.prefab b/Assets/Prefabs/GameController.prefab index 456fde8..027f47f 100644 --- a/Assets/Prefabs/GameController.prefab +++ b/Assets/Prefabs/GameController.prefab @@ -57,3 +57,6 @@ MonoBehaviour: hp: 0 maxHp: 100 factory: 2 + enemies: + - prefab: {fileID: 3602081654026665026, guid: 7ab59219438e4a241affd5e9441d9d9f, type: 3} + weight: 1 diff --git a/Assets/Prefabs/LevelController.prefab b/Assets/Prefabs/LevelController.prefab index 1502cee..19e427c 100644 --- a/Assets/Prefabs/LevelController.prefab +++ b/Assets/Prefabs/LevelController.prefab @@ -44,4 +44,5 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 67f50dd8d32d83d4891b1a18fd12ec38, type: 3} m_Name: m_EditorClassIdentifier: - enemies: [] + deployScene: {fileID: 102900000, guid: 3dbb8dbb9a7a2f2a0bd1311c83d35a6a, type: 3} + spawnPoints: [] diff --git a/Assets/Scenes/Level1.unity b/Assets/Scenes/Level1.unity index f071cf8..f046bb5 100644 --- a/Assets/Scenes/Level1.unity +++ b/Assets/Scenes/Level1.unity @@ -355,6 +355,75 @@ Transform: m_CorrespondingSourceObject: {fileID: 4357511284367880818, guid: 73c9d3d3ea6065747956699e5d1f5392, type: 3} m_PrefabInstance: {fileID: 506206182} m_PrefabAsset: {fileID: 0} +--- !u!1001 &512102627 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + serializedVersion: 3 + m_TransformParent: {fileID: 0} + m_Modifications: + - target: {fileID: 626889921843831083, guid: 235b3ad8eb2fc6b43b3296d18a8a9d06, type: 3} + propertyPath: spawnPoints.Array.size + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 626889921843831083, guid: 235b3ad8eb2fc6b43b3296d18a8a9d06, type: 3} + propertyPath: spawnPoints.Array.data[0].radius + value: 3 + objectReference: {fileID: 0} + - target: {fileID: 626889921843831083, guid: 235b3ad8eb2fc6b43b3296d18a8a9d06, type: 3} + propertyPath: spawnPoints.Array.data[0].transform + value: + objectReference: {fileID: 1573607468} + - target: {fileID: 4174800862365466133, guid: 235b3ad8eb2fc6b43b3296d18a8a9d06, type: 3} + propertyPath: m_LocalPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4174800862365466133, guid: 235b3ad8eb2fc6b43b3296d18a8a9d06, type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4174800862365466133, guid: 235b3ad8eb2fc6b43b3296d18a8a9d06, type: 3} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4174800862365466133, guid: 235b3ad8eb2fc6b43b3296d18a8a9d06, type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 4174800862365466133, guid: 235b3ad8eb2fc6b43b3296d18a8a9d06, type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4174800862365466133, guid: 235b3ad8eb2fc6b43b3296d18a8a9d06, type: 3} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4174800862365466133, guid: 235b3ad8eb2fc6b43b3296d18a8a9d06, type: 3} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4174800862365466133, guid: 235b3ad8eb2fc6b43b3296d18a8a9d06, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4174800862365466133, guid: 235b3ad8eb2fc6b43b3296d18a8a9d06, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4174800862365466133, guid: 235b3ad8eb2fc6b43b3296d18a8a9d06, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 8523789084967070956, guid: 235b3ad8eb2fc6b43b3296d18a8a9d06, type: 3} + propertyPath: m_Name + value: LevelController + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: 235b3ad8eb2fc6b43b3296d18a8a9d06, type: 3} --- !u!4 &578107310 stripped Transform: m_CorrespondingSourceObject: {fileID: 6025933111829980118, guid: ca28c894d7e3a8e4d8feb70b9a8bb1c4, type: 3} @@ -755,6 +824,38 @@ PrefabInstance: m_AddedGameObjects: [] m_AddedComponents: [] m_SourcePrefab: {fileID: 100100000, guid: 7ab59219438e4a241affd5e9441d9d9f, type: 3} +--- !u!1 &1311630985 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1311630986} + m_Layer: 0 + m_Name: Spawn Points + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1311630986 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1311630985} + serializedVersion: 2 + 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: + - {fileID: 1573607468} + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1001 &1341570327 PrefabInstance: m_ObjectHideFlags: 0 @@ -1064,6 +1165,37 @@ MonoBehaviour: m_LightCookieSize: {x: 1, y: 1} m_LightCookieOffset: {x: 0, y: 0} m_SoftShadowQuality: 0 +--- !u!1 &1573607467 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1573607468} + m_Layer: 0 + m_Name: Spawn1 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1573607468 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1573607467} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 3, z: 27} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1311630986} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1001 &1653938973 PrefabInstance: m_ObjectHideFlags: 0 @@ -1727,3 +1859,5 @@ SceneRoots: - {fileID: 1259296367} - {fileID: 887070209} - {fileID: 1481837882} + - {fileID: 512102627} + - {fileID: 1311630986} diff --git a/Assets/Scripts/Game/DeployController.cs b/Assets/Scripts/Game/DeployController.cs index f892a06..94f20b3 100644 --- a/Assets/Scripts/Game/DeployController.cs +++ b/Assets/Scripts/Game/DeployController.cs @@ -3,6 +3,11 @@ using UnityEngine.SceneManagement; public class DeployController : MonoBehaviour { + public void Start() { + Cursor.lockState = CursorLockMode.None; + Cursor.visible = true; + } + public void Deploy(string sceneName) { LevelInfo level = GameController.i.GetLevel(sceneName); SceneManager.LoadScene(level.scene.name); diff --git a/Assets/Scripts/Game/GameController.cs b/Assets/Scripts/Game/GameController.cs index 2da7d2e..e5405f8 100644 --- a/Assets/Scripts/Game/GameController.cs +++ b/Assets/Scripts/Game/GameController.cs @@ -1,30 +1,42 @@ using System; using System.Collections.Generic; +using System.Linq; using UnityEditor; using UnityEngine; +using Random = UnityEngine.Random; public class GameController : MonoBehaviour { public static GameController i; public List levels; + public List enemies; public void Start() { if (i) { Destroy(gameObject); return; } - i = gameObject.GetComponent(); + i = GetComponent(); DontDestroyOnLoad(gameObject); + levels = levels.Select(li => { + li.hp = li.maxHp; + li.enemies = new(); + return li; + }).ToList(); + levels.ForEach(li => { + AddEnemyInLevel(SelectEnemyWeighted().prefab, li.scene.name); + }); + } public Dictionary PopEnemies(string sceneName) { LevelInfo li = levels.Find(x => x.scene.name == sceneName); - Dictionary enemies = li.enemies; + Dictionary levelEnemies = new(li.enemies); li.enemies.Clear(); - return enemies; + return levelEnemies; } public void AddEnemyInLevel(GameObject enemy, string sceneName) { - Dictionary enemies = levels.Find(x => x.scene.name == sceneName).enemies; - if (enemies.ContainsKey(enemy)) enemies[enemy] += 1; - else enemies[enemy] = 1; + Dictionary levelEnemies = levels.Find(x => x.scene.name == sceneName).enemies; + if (levelEnemies.ContainsKey(enemy)) levelEnemies[enemy] += 1; + else levelEnemies[enemy] = 1; } public LevelInfo GetLevel(string sceneName) { @@ -34,6 +46,17 @@ public class GameController : MonoBehaviour public void OnLevelClear(string sceneName, float timeSpent) { } + + EnemyInfo SelectEnemyWeighted() { + float sumWeights = enemies.Sum(enemy => enemy.weight); + float r = Random.Range(0, sumWeights); + float curSum = 0; + foreach (EnemyInfo en in enemies) { + curSum += en.weight; + if (curSum >= r) return en; + } + return enemies[^1]; + } } [Serializable] @@ -52,3 +75,9 @@ public enum FactoryType { Minigun, Railgun } + +[Serializable] +public struct EnemyInfo { + public GameObject prefab; + public float weight; +} diff --git a/Assets/Scripts/Game/LevelController.cs b/Assets/Scripts/Game/LevelController.cs index 43d462d..b1909dd 100644 --- a/Assets/Scripts/Game/LevelController.cs +++ b/Assets/Scripts/Game/LevelController.cs @@ -23,7 +23,7 @@ public class LevelController : MonoBehaviour enemies[enemy] -= 1; if (enemies[enemy] <= 0) enemies.Remove(enemy); SpawnPointInfo spawnPointInfo = spawnPoints[Random.Range(0, spawnPoints.Count)]; - Vector2 circle = Random.insideUnitCircle; + Vector2 circle = Random.insideUnitCircle * spawnPointInfo.radius; Vector3 spawnVector = spawnPointInfo.transform.position + new Vector3(circle.x, 0, circle.y); Enemy spawnedEnemy = Instantiate(enemy, spawnVector, spawnPointInfo.transform.rotation).GetComponent(); aliveEnemies.Add(spawnedEnemy);