From de6739cdfaea6e8602716b512853e5a21345a2a4 Mon Sep 17 00:00:00 2001 From: KOSMOGOR Date: Thu, 24 Apr 2025 13:18:37 +0300 Subject: [PATCH 1/7] add: OnLevelClear event --- Assets/Scripts/Game/GameController.cs | 4 ++++ Assets/Scripts/Game/LevelController.cs | 11 +++++++++++ 2 files changed, 15 insertions(+) diff --git a/Assets/Scripts/Game/GameController.cs b/Assets/Scripts/Game/GameController.cs index c14f634..09aeeb3 100644 --- a/Assets/Scripts/Game/GameController.cs +++ b/Assets/Scripts/Game/GameController.cs @@ -30,6 +30,10 @@ public class GameController : MonoBehaviour public LevelInfo GetLevel(string sceneName) { return levels.Find(x => x.scene.name == sceneName); } + + public void OnLevelClear(string sceneName, float timeSpent) { + + } } [Serializable] diff --git a/Assets/Scripts/Game/LevelController.cs b/Assets/Scripts/Game/LevelController.cs index 2f696ca..b820eb6 100644 --- a/Assets/Scripts/Game/LevelController.cs +++ b/Assets/Scripts/Game/LevelController.cs @@ -1,15 +1,18 @@ using System; using System.Collections.Generic; using System.Linq; +using UnityEditor; using UnityEngine; using UnityEngine.SceneManagement; using Random = UnityEngine.Random; public class LevelController : MonoBehaviour { + public SceneAsset deployScene; public List spawnPoints; List aliveEnemies; + float timeSpent = 0; public void Start() { aliveEnemies = new List(); @@ -26,6 +29,14 @@ public class LevelController : MonoBehaviour aliveEnemies.Add(spawnedEnemy); } } + + public void Update() { + if (aliveEnemies.All(enemy => enemy == null)) { + GameController.i.OnLevelClear(SceneManager.GetActiveScene().name, timeSpent); + SceneManager.LoadScene(deployScene.name); + } + timeSpent += Time.deltaTime; + } } [Serializable] From 851ee23092287c2cecf55ad3979dac10f12da106 Mon Sep 17 00:00:00 2001 From: KOSMOGOR Date: Thu, 24 Apr 2025 14:02:23 +0300 Subject: [PATCH 2/7] fix: player now jumps normally --- Assets/Prefabs/Player.prefab | 36 +++++++++++++++++++++---- Assets/Scripts/Player/GroundDetector.cs | 7 ++--- Assets/Scripts/Player/PlayerMovement.cs | 3 --- 3 files changed, 35 insertions(+), 11 deletions(-) diff --git a/Assets/Prefabs/Player.prefab b/Assets/Prefabs/Player.prefab index f3d6052..a8e85b2 100644 --- a/Assets/Prefabs/Player.prefab +++ b/Assets/Prefabs/Player.prefab @@ -66,6 +66,9 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: f16350ecb17bc8e49a8e9b8124ff2db2, type: 3} m_Name: m_EditorClassIdentifier: + groundMask: + serializedVersion: 2 + m_Bits: 64 --- !u!1 &1084592339258698369 GameObject: m_ObjectHideFlags: 0 @@ -247,6 +250,7 @@ GameObject: - component: {fileID: 1892283461227420150} - component: {fileID: 7857072580326449292} - component: {fileID: 1437407097293080706} + - component: {fileID: 8985924327125149956} - component: {fileID: 397169322893853401} - component: {fileID: 1198108720433238150} - component: {fileID: 3263211181679880648} @@ -353,6 +357,33 @@ CharacterController: m_SkinWidth: 0.08 m_MinMoveDistance: 0.001 m_Center: {x: 0, y: 0, z: 0} +--- !u!54 &8985924327125149956 +Rigidbody: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 9016311960615966999} + serializedVersion: 4 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_CenterOfMass: {x: 0, y: 0, z: 0} + m_InertiaTensor: {x: 1, y: 1, z: 1} + m_InertiaRotation: {x: 0, y: 0, z: 0, w: 1} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ImplicitCom: 1 + m_ImplicitTensor: 1 + m_UseGravity: 0 + m_IsKinematic: 0 + m_Interpolate: 0 + m_Constraints: 80 + m_CollisionDetection: 0 --- !u!114 &397169322893853401 MonoBehaviour: m_ObjectHideFlags: 0 @@ -371,11 +402,6 @@ MonoBehaviour: crouchHeightMultiplier: 0.5 jumpForce: 10 gravityMultiplier: 1 - legsPosition: {fileID: 2033391409425088012} - legsRadius: 0.2 - groundMask: - serializedVersion: 2 - m_Bits: 64 isCrouching: 0 gravityVelocity: {x: 0, y: 0, z: 0} grounded: 0 diff --git a/Assets/Scripts/Player/GroundDetector.cs b/Assets/Scripts/Player/GroundDetector.cs index f85e015..83837fc 100644 --- a/Assets/Scripts/Player/GroundDetector.cs +++ b/Assets/Scripts/Player/GroundDetector.cs @@ -2,13 +2,14 @@ using UnityEngine; public class GroundDetector : MonoBehaviour { + public LayerMask groundMask; public bool onGround { get; private set; } = false; - void OnTriggerEnter(Collider other) { - if (other.CompareTag("Ground")) onGround = true; + public void OnTriggerEnter(Collider other) { + if ((1 << other.gameObject.layer & groundMask) != 0) onGround = true; } void OnTriggerStay(Collider other) { OnTriggerEnter(other); } void OnTriggerExit(Collider other) { - if (other.CompareTag("Ground")) onGround = false; + if ((1 << other.gameObject.layer & groundMask) != 0) onGround = false; } } diff --git a/Assets/Scripts/Player/PlayerMovement.cs b/Assets/Scripts/Player/PlayerMovement.cs index 2ba3731..5348631 100644 --- a/Assets/Scripts/Player/PlayerMovement.cs +++ b/Assets/Scripts/Player/PlayerMovement.cs @@ -10,9 +10,6 @@ public class PlayerMovement : MonoBehaviour [Header("Vertical movement")] public float jumpForce = 1f; public float gravityMultiplier = 1f; - public Transform legsPosition; - public float legsRadius = 0.5f; - public LayerMask groundMask; [Header("Debug info")] [SerializeField] bool isCrouching = false; From 415cd4876938fc29b19a9b44714d5afdaf3d2aeb Mon Sep 17 00:00:00 2001 From: KOSMOGOR Date: Thu, 24 Apr 2025 14:31:28 +0300 Subject: [PATCH 3/7] update: changed classes to structs fix: DeployMenu render order --- Assets/Scenes/DeployMenu.unity | 51 ++++++++++++++++++++++++-- Assets/Scripts/Game/GameController.cs | 4 +- Assets/Scripts/Game/LevelController.cs | 2 +- 3 files changed, 51 insertions(+), 6 deletions(-) diff --git a/Assets/Scenes/DeployMenu.unity b/Assets/Scenes/DeployMenu.unity index 943df56..07ed19a 100644 --- a/Assets/Scenes/DeployMenu.unity +++ b/Assets/Scenes/DeployMenu.unity @@ -187,6 +187,7 @@ GameObject: - component: {fileID: 297816041} - component: {fileID: 297816040} - component: {fileID: 297816039} + - component: {fileID: 297816042} m_Layer: 0 m_Name: Main Camera m_TagString: MainCamera @@ -268,6 +269,50 @@ Transform: m_Children: [] m_Father: {fileID: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &297816042 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 297816038} + 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_AllowHDROutput: 1 + m_UseScreenCoordOverride: 0 + m_ScreenSizeOverride: {x: 0, y: 0, z: 0, w: 0} + m_ScreenCoordScaleBias: {x: 0, y: 0, z: 0, w: 0} + m_RequiresDepthTexture: 0 + m_RequiresColorTexture: 0 + m_Version: 2 + m_TaaSettings: + m_Quality: 3 + m_FrameInfluence: 0.1 + m_JitterScale: 1 + m_MipBias: 0 + m_VarianceClampScale: 0.9 + m_ContrastAdaptiveSharpening: 0 --- !u!1 &902991209 GameObject: m_ObjectHideFlags: 0 @@ -1517,7 +1562,7 @@ Canvas: m_OverrideSorting: 0 m_OverridePixelPerfect: 0 m_SortingBucketNormalizedSize: 0 - m_VertexColorAlwaysGammaSpace: 0 + m_VertexColorAlwaysGammaSpace: 1 m_AdditionalShaderChannelsFlag: 25 m_UpdateRectTransformForStandalone: 0 m_SortingLayerID: 0 @@ -1535,9 +1580,9 @@ RectTransform: m_LocalScale: {x: 0, y: 0, z: 0} m_ConstrainProportionsScale: 0 m_Children: - - {fileID: 1925245531} - - {fileID: 1563110562} - {fileID: 1421874234} + - {fileID: 1563110562} + - {fileID: 1925245531} m_Father: {fileID: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} diff --git a/Assets/Scripts/Game/GameController.cs b/Assets/Scripts/Game/GameController.cs index 09aeeb3..2da7d2e 100644 --- a/Assets/Scripts/Game/GameController.cs +++ b/Assets/Scripts/Game/GameController.cs @@ -32,12 +32,12 @@ public class GameController : MonoBehaviour } public void OnLevelClear(string sceneName, float timeSpent) { - + } } [Serializable] -public class LevelInfo { +public struct LevelInfo { public SceneAsset scene; public int hp; public int maxHp; diff --git a/Assets/Scripts/Game/LevelController.cs b/Assets/Scripts/Game/LevelController.cs index b820eb6..43d462d 100644 --- a/Assets/Scripts/Game/LevelController.cs +++ b/Assets/Scripts/Game/LevelController.cs @@ -40,7 +40,7 @@ public class LevelController : MonoBehaviour } [Serializable] -public class SpawnPointInfo { +public struct SpawnPointInfo { public Transform transform; public float radius; } From 202cdb5702de0139937a3e7972694093da6da0c9 Mon Sep 17 00:00:00 2001 From: KOSMOGOR Date: Thu, 24 Apr 2025 15:54:50 +0300 Subject: [PATCH 4/7] add: now enemies properly spawn on deploy --- Assets/Prefabs/GameController.prefab | 3 + Assets/Prefabs/LevelController.prefab | 3 +- Assets/Scenes/Level1.unity | 134 ++++++++++++++++++++++++ Assets/Scripts/Game/DeployController.cs | 5 + Assets/Scripts/Game/GameController.cs | 41 ++++++-- Assets/Scripts/Game/LevelController.cs | 2 +- 6 files changed, 180 insertions(+), 8 deletions(-) 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); From dc6707f2a92a398d22dee32b80718caf6f505b06 Mon Sep 17 00:00:00 2001 From: KOSMOGOR Date: Fri, 25 Apr 2025 13:40:23 +0300 Subject: [PATCH 5/7] add: Player script with hp add: player death handling and OnLevelFailed event --- Assets/Prefabs/Player.prefab | 15 +++++++++++++++ Assets/Scripts/Enemies/EyeEnemy.cs | 14 ++++++++++++++ Assets/Scripts/Enemies/EyeEnemy.cs.meta | 2 ++ Assets/Scripts/Game/DeployController.cs | 3 +-- Assets/Scripts/Game/GameController.cs | 15 +++++++++++++++ Assets/Scripts/Game/LevelController.cs | 9 ++++++--- Assets/Scripts/Player/CameraMovement.cs | 3 +-- Assets/Scripts/Player/Player.cs | 19 +++++++++++++++++++ Assets/Scripts/Player/Player.cs.meta | 2 ++ 9 files changed, 75 insertions(+), 7 deletions(-) create mode 100644 Assets/Scripts/Enemies/EyeEnemy.cs create mode 100644 Assets/Scripts/Enemies/EyeEnemy.cs.meta create mode 100644 Assets/Scripts/Player/Player.cs create mode 100644 Assets/Scripts/Player/Player.cs.meta diff --git a/Assets/Prefabs/Player.prefab b/Assets/Prefabs/Player.prefab index a8e85b2..95eed42 100644 --- a/Assets/Prefabs/Player.prefab +++ b/Assets/Prefabs/Player.prefab @@ -251,6 +251,7 @@ GameObject: - component: {fileID: 7857072580326449292} - component: {fileID: 1437407097293080706} - component: {fileID: 8985924327125149956} + - component: {fileID: 3824427059318413399} - component: {fileID: 397169322893853401} - component: {fileID: 1198108720433238150} - component: {fileID: 3263211181679880648} @@ -384,6 +385,20 @@ Rigidbody: m_Interpolate: 0 m_Constraints: 80 m_CollisionDetection: 0 +--- !u!114 &3824427059318413399 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 9016311960615966999} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f9b2638aeb16f76429ff062f38f6d0be, type: 3} + m_Name: + m_EditorClassIdentifier: + maxHp: 100 + hp: 0 --- !u!114 &397169322893853401 MonoBehaviour: m_ObjectHideFlags: 0 diff --git a/Assets/Scripts/Enemies/EyeEnemy.cs b/Assets/Scripts/Enemies/EyeEnemy.cs new file mode 100644 index 0000000..3d20223 --- /dev/null +++ b/Assets/Scripts/Enemies/EyeEnemy.cs @@ -0,0 +1,14 @@ +using UnityEngine; + +public class EyeEnemy : Enemy +{ + public float _hp = 100; + + void Start() { + hp = _hp; + } + + void Update() { + + } +} diff --git a/Assets/Scripts/Enemies/EyeEnemy.cs.meta b/Assets/Scripts/Enemies/EyeEnemy.cs.meta new file mode 100644 index 0000000..48848fd --- /dev/null +++ b/Assets/Scripts/Enemies/EyeEnemy.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 48cddee1e4d4837418957a7b4e6315c8 \ No newline at end of file diff --git a/Assets/Scripts/Game/DeployController.cs b/Assets/Scripts/Game/DeployController.cs index 94f20b3..5fcf31f 100644 --- a/Assets/Scripts/Game/DeployController.cs +++ b/Assets/Scripts/Game/DeployController.cs @@ -4,8 +4,7 @@ using UnityEngine.SceneManagement; public class DeployController : MonoBehaviour { public void Start() { - Cursor.lockState = CursorLockMode.None; - Cursor.visible = true; + GameController.SetCursorState(true); } public void Deploy(string sceneName) { diff --git a/Assets/Scripts/Game/GameController.cs b/Assets/Scripts/Game/GameController.cs index e5405f8..e208dd2 100644 --- a/Assets/Scripts/Game/GameController.cs +++ b/Assets/Scripts/Game/GameController.cs @@ -3,11 +3,13 @@ using System.Collections.Generic; using System.Linq; using UnityEditor; using UnityEngine; +using UnityEngine.SceneManagement; using Random = UnityEngine.Random; public class GameController : MonoBehaviour { public static GameController i; + public SceneAsset deployScene; public List levels; public List enemies; @@ -47,6 +49,10 @@ public class GameController : MonoBehaviour } + public void OnLevelFailed(string sceneName, float timeSpent) { + + } + EnemyInfo SelectEnemyWeighted() { float sumWeights = enemies.Sum(enemy => enemy.weight); float r = Random.Range(0, sumWeights); @@ -57,6 +63,15 @@ public class GameController : MonoBehaviour } return enemies[^1]; } + + public void LoadDeployScene() { + SceneManager.LoadScene(deployScene.name); + } + + public static void SetCursorState(bool locked) { + Cursor.lockState = locked ? CursorLockMode.Locked : CursorLockMode.None; + Cursor.visible = !locked; + } } [Serializable] diff --git a/Assets/Scripts/Game/LevelController.cs b/Assets/Scripts/Game/LevelController.cs index b1909dd..364031f 100644 --- a/Assets/Scripts/Game/LevelController.cs +++ b/Assets/Scripts/Game/LevelController.cs @@ -1,14 +1,12 @@ using System; using System.Collections.Generic; using System.Linq; -using UnityEditor; using UnityEngine; using UnityEngine.SceneManagement; using Random = UnityEngine.Random; public class LevelController : MonoBehaviour { - public SceneAsset deployScene; public List spawnPoints; List aliveEnemies; @@ -33,10 +31,15 @@ public class LevelController : MonoBehaviour public void Update() { if (aliveEnemies.All(enemy => enemy == null)) { GameController.i.OnLevelClear(SceneManager.GetActiveScene().name, timeSpent); - SceneManager.LoadScene(deployScene.name); + GameController.i.LoadDeployScene(); } timeSpent += Time.deltaTime; } + + public void OnPlayerDie() { + GameController.i.OnLevelFailed(SceneManager.GetActiveScene().name, timeSpent); + GameController.i.LoadDeployScene(); + } } [Serializable] diff --git a/Assets/Scripts/Player/CameraMovement.cs b/Assets/Scripts/Player/CameraMovement.cs index c3dac25..8571103 100644 --- a/Assets/Scripts/Player/CameraMovement.cs +++ b/Assets/Scripts/Player/CameraMovement.cs @@ -12,8 +12,7 @@ public class CameraMovement : MonoBehaviour void Start() { cam = GetComponentInChildren(); - Cursor.lockState = CursorLockMode.Locked; - Cursor.visible = false; + GameController.SetCursorState(true); } void Update() { diff --git a/Assets/Scripts/Player/Player.cs b/Assets/Scripts/Player/Player.cs new file mode 100644 index 0000000..32d0c33 --- /dev/null +++ b/Assets/Scripts/Player/Player.cs @@ -0,0 +1,19 @@ +using UnityEngine; + +public class Player : MonoBehaviour +{ + public float maxHp = 100; + + [SerializeField] float hp; + + void Start() { + hp = maxHp; + } + + public void DealDamage(float damage) { + hp -= damage; + if (hp <= 0) { + FindAnyObjectByType().OnPlayerDie(); + } + } +} diff --git a/Assets/Scripts/Player/Player.cs.meta b/Assets/Scripts/Player/Player.cs.meta new file mode 100644 index 0000000..031c66d --- /dev/null +++ b/Assets/Scripts/Player/Player.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: f9b2638aeb16f76429ff062f38f6d0be \ No newline at end of file From 1b106e4e183713af73b02ff8808e081ef7ac6b1b Mon Sep 17 00:00:00 2001 From: KOSMOGOR Date: Fri, 25 Apr 2025 14:47:48 +0300 Subject: [PATCH 6/7] add: EyeEnemy proper functionality --- Assets/Prefabs/Enemies/EnemyBullet.prefab | 154 ++++++++++++++++++ .../Prefabs/Enemies/EnemyBullet.prefab.meta | 7 + Assets/Prefabs/Enemies/Eye_Enemy1.prefab | 18 +- Assets/Prefabs/Player.prefab | 2 +- Assets/Prefabs/{ => Weapons}/Bullet.prefab | 0 .../Prefabs/{ => Weapons}/Bullet.prefab.meta | 0 Assets/Scenes/Level1.unity | 16 ++ .../Scripts/Enemies/EnemyBulletProjectile.cs | 30 ++++ .../Enemies/EnemyBulletProjectile.cs.meta | 2 + Assets/Scripts/Enemies/EyeEnemy.cs | 24 ++- Assets/Scripts/Game/DeployController.cs | 2 +- Assets/Scripts/Player/GroundDetector.cs | 2 + 12 files changed, 249 insertions(+), 8 deletions(-) create mode 100644 Assets/Prefabs/Enemies/EnemyBullet.prefab create mode 100644 Assets/Prefabs/Enemies/EnemyBullet.prefab.meta rename Assets/Prefabs/{ => Weapons}/Bullet.prefab (100%) rename Assets/Prefabs/{ => Weapons}/Bullet.prefab.meta (100%) create mode 100644 Assets/Scripts/Enemies/EnemyBulletProjectile.cs create mode 100644 Assets/Scripts/Enemies/EnemyBulletProjectile.cs.meta diff --git a/Assets/Prefabs/Enemies/EnemyBullet.prefab b/Assets/Prefabs/Enemies/EnemyBullet.prefab new file mode 100644 index 0000000..34a2dd5 --- /dev/null +++ b/Assets/Prefabs/Enemies/EnemyBullet.prefab @@ -0,0 +1,154 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &1562924000103655330 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2987293529414042391} + - component: {fileID: 3266538827119481022} + - component: {fileID: 3277822925141770390} + - component: {fileID: -8958570174584186611} + - component: {fileID: 8393546946202406891} + - component: {fileID: 9210136651646905660} + m_Layer: 0 + m_Name: EnemyBullet + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2987293529414042391 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1562924000103655330} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0.1, y: 0.1, z: 0.2} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!33 &3266538827119481022 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1562924000103655330} + m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0} +--- !u!23 &3277822925141770390 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1562924000103655330} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 + m_SmallMeshCulling: 1 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 7ced48a396ccf7045919ead8355ab8c6, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!54 &-8958570174584186611 +Rigidbody: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1562924000103655330} + serializedVersion: 4 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_CenterOfMass: {x: 0, y: 0, z: 0} + m_InertiaTensor: {x: 1, y: 1, z: 1} + m_InertiaRotation: {x: 0, y: 0, z: 0, w: 1} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ImplicitCom: 1 + m_ImplicitTensor: 1 + m_UseGravity: 0 + m_IsKinematic: 0 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 2 +--- !u!135 &8393546946202406891 +SphereCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1562924000103655330} + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_IsTrigger: 1 + m_ProvidesContacts: 0 + m_Enabled: 1 + serializedVersion: 3 + m_Radius: 0.5 + m_Center: {x: 0, y: 0, z: 0} +--- !u!114 &9210136651646905660 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1562924000103655330} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 8d7536bbb5cbf394b8ec742b12cb0b87, type: 3} + m_Name: + m_EditorClassIdentifier: + speed: 5 + damage: 1 + timeToLive: 5 diff --git a/Assets/Prefabs/Enemies/EnemyBullet.prefab.meta b/Assets/Prefabs/Enemies/EnemyBullet.prefab.meta new file mode 100644 index 0000000..e269fda --- /dev/null +++ b/Assets/Prefabs/Enemies/EnemyBullet.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 6a9f72b16f60d5047974eb5893b0326a +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Prefabs/Enemies/Eye_Enemy1.prefab b/Assets/Prefabs/Enemies/Eye_Enemy1.prefab index 2fddd51..699e474 100644 --- a/Assets/Prefabs/Enemies/Eye_Enemy1.prefab +++ b/Assets/Prefabs/Enemies/Eye_Enemy1.prefab @@ -80,7 +80,7 @@ PrefabInstance: addedObject: {fileID: 4157182199899525086} - targetCorrespondingSourceObject: {fileID: 919132149155446097, guid: 81be7b02df0db07479a8e1a9dd56f618, type: 3} insertIndex: -1 - addedObject: {fileID: -3280827978807638765} + addedObject: {fileID: 285488036582896095} m_SourcePrefab: {fileID: 100100000, guid: 81be7b02df0db07479a8e1a9dd56f618, type: 3} --- !u!1 &3602081654026665026 stripped GameObject: @@ -137,7 +137,7 @@ Rigidbody: m_Interpolate: 0 m_Constraints: 112 m_CollisionDetection: 0 ---- !u!114 &-3280827978807638765 +--- !u!114 &285488036582896095 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -146,7 +146,19 @@ MonoBehaviour: m_GameObject: {fileID: 3602081654026665026} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 46894d927b8e6654487b876457ca8974, type: 3} + m_Script: {fileID: 11500000, guid: 48cddee1e4d4837418957a7b4e6315c8, type: 3} m_Name: m_EditorClassIdentifier: hp: 100 + projectilePrefab: {fileID: 1562924000103655330, guid: 6a9f72b16f60d5047974eb5893b0326a, type: 3} + projectileSpawnPosition: {fileID: 8051388752729122526} + attackRange: 10 + fireRate: 1 + offsetDistance: 1.5 + currentDelay: 0 + target: {fileID: 0} +--- !u!4 &8051388752729122526 stripped +Transform: + m_CorrespondingSourceObject: {fileID: -3278615484307183667, guid: 81be7b02df0db07479a8e1a9dd56f618, type: 3} + m_PrefabInstance: {fileID: 4412476501240889619} + m_PrefabAsset: {fileID: 0} diff --git a/Assets/Prefabs/Player.prefab b/Assets/Prefabs/Player.prefab index 95eed42..d4bca41 100644 --- a/Assets/Prefabs/Player.prefab +++ b/Assets/Prefabs/Player.prefab @@ -257,7 +257,7 @@ GameObject: - component: {fileID: 3263211181679880648} m_Layer: 0 m_Name: Player - m_TagString: Untagged + m_TagString: Player m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 diff --git a/Assets/Prefabs/Bullet.prefab b/Assets/Prefabs/Weapons/Bullet.prefab similarity index 100% rename from Assets/Prefabs/Bullet.prefab rename to Assets/Prefabs/Weapons/Bullet.prefab diff --git a/Assets/Prefabs/Bullet.prefab.meta b/Assets/Prefabs/Weapons/Bullet.prefab.meta similarity index 100% rename from Assets/Prefabs/Bullet.prefab.meta rename to Assets/Prefabs/Weapons/Bullet.prefab.meta diff --git a/Assets/Scenes/Level1.unity b/Assets/Scenes/Level1.unity index f046bb5..13a322a 100644 --- a/Assets/Scenes/Level1.unity +++ b/Assets/Scenes/Level1.unity @@ -136,6 +136,10 @@ PrefabInstance: propertyPath: m_Name value: Eye_Enemy1 (1) objectReference: {fileID: 0} + - target: {fileID: 3602081654026665026, guid: 7ab59219438e4a241affd5e9441d9d9f, type: 3} + propertyPath: m_IsActive + value: 1 + objectReference: {fileID: 0} - target: {fileID: 4230844338806302456, guid: 7ab59219438e4a241affd5e9441d9d9f, type: 3} propertyPath: m_LocalPosition.x value: 7 @@ -549,6 +553,10 @@ PrefabInstance: propertyPath: m_Name value: Eye_Enemy1 (3) objectReference: {fileID: 0} + - target: {fileID: 3602081654026665026, guid: 7ab59219438e4a241affd5e9441d9d9f, type: 3} + propertyPath: m_IsActive + value: 1 + objectReference: {fileID: 0} - target: {fileID: 4230844338806302456, guid: 7ab59219438e4a241affd5e9441d9d9f, type: 3} propertyPath: m_LocalPosition.x value: -7 @@ -779,6 +787,10 @@ PrefabInstance: propertyPath: m_Name value: Eye_Enemy1 (2) objectReference: {fileID: 0} + - target: {fileID: 3602081654026665026, guid: 7ab59219438e4a241affd5e9441d9d9f, type: 3} + propertyPath: m_IsActive + value: 1 + objectReference: {fileID: 0} - target: {fileID: 4230844338806302456, guid: 7ab59219438e4a241affd5e9441d9d9f, type: 3} propertyPath: m_LocalPosition.x value: 0 @@ -1441,6 +1453,10 @@ PrefabInstance: propertyPath: m_Name value: Eye_Enemy1 objectReference: {fileID: 0} + - target: {fileID: 3602081654026665026, guid: 7ab59219438e4a241affd5e9441d9d9f, type: 3} + propertyPath: m_IsActive + value: 1 + objectReference: {fileID: 0} - target: {fileID: 4230844338806302456, guid: 7ab59219438e4a241affd5e9441d9d9f, type: 3} propertyPath: m_LocalPosition.x value: 0 diff --git a/Assets/Scripts/Enemies/EnemyBulletProjectile.cs b/Assets/Scripts/Enemies/EnemyBulletProjectile.cs new file mode 100644 index 0000000..a97c20e --- /dev/null +++ b/Assets/Scripts/Enemies/EnemyBulletProjectile.cs @@ -0,0 +1,30 @@ +using UnityEngine; + +public class EnemyBulletProjectile : MonoBehaviour +{ + public float speed = 1f; + public float damage = 20f; + public float timeToLive = 5f; + + float currentTime = 0; + + Rigidbody rb; + + void Start() { + rb = GetComponent(); + rb.linearVelocity = transform.forward * speed; + } + + void Update() { + currentTime += Time.deltaTime; + if (currentTime >= timeToLive) Destroy(gameObject); + } + + void OnTriggerEnter(Collider other) { + if (other.gameObject.CompareTag("Player")) { + Player player = other.GetComponent(); + player.DealDamage(damage); + } + Destroy(gameObject); + } +} diff --git a/Assets/Scripts/Enemies/EnemyBulletProjectile.cs.meta b/Assets/Scripts/Enemies/EnemyBulletProjectile.cs.meta new file mode 100644 index 0000000..3ecc76c --- /dev/null +++ b/Assets/Scripts/Enemies/EnemyBulletProjectile.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 8d7536bbb5cbf394b8ec742b12cb0b87 \ No newline at end of file diff --git a/Assets/Scripts/Enemies/EyeEnemy.cs b/Assets/Scripts/Enemies/EyeEnemy.cs index 3d20223..bed8e15 100644 --- a/Assets/Scripts/Enemies/EyeEnemy.cs +++ b/Assets/Scripts/Enemies/EyeEnemy.cs @@ -2,13 +2,31 @@ using UnityEngine; public class EyeEnemy : Enemy { - public float _hp = 100; + public GameObject projectilePrefab; + public Transform projectileSpawnPosition; + public float attackRange = 10f; + public float fireRate = 1f; + public float offsetDistance = 1f; + + [SerializeField] float currentDelay = 0; + + [SerializeField] Player target; void Start() { - hp = _hp; + target = FindFirstObjectByType(); } void Update() { - + if (fireRate != 0) currentDelay = Mathf.Clamp(currentDelay += Time.deltaTime, 0, 1 / fireRate); + Vector3 offset = (target.transform.position - projectileSpawnPosition.position).normalized * offsetDistance; + bool doShoot = false; + if (Physics.Raycast(projectileSpawnPosition.position + offset, offset, out RaycastHit hit, attackRange)) { + if (hit.transform.CompareTag("Player")) doShoot = true; + } + if (doShoot && (fireRate == 0 || currentDelay >= 1 / fireRate)) { + GameObject projectile = Instantiate(projectilePrefab, projectileSpawnPosition.position + offset, transform.rotation); + projectile.transform.LookAt(target.transform); + currentDelay = 0; + } } } diff --git a/Assets/Scripts/Game/DeployController.cs b/Assets/Scripts/Game/DeployController.cs index 5fcf31f..9748fdf 100644 --- a/Assets/Scripts/Game/DeployController.cs +++ b/Assets/Scripts/Game/DeployController.cs @@ -4,7 +4,7 @@ using UnityEngine.SceneManagement; public class DeployController : MonoBehaviour { public void Start() { - GameController.SetCursorState(true); + GameController.SetCursorState(false); } public void Deploy(string sceneName) { diff --git a/Assets/Scripts/Player/GroundDetector.cs b/Assets/Scripts/Player/GroundDetector.cs index 83837fc..d77847b 100644 --- a/Assets/Scripts/Player/GroundDetector.cs +++ b/Assets/Scripts/Player/GroundDetector.cs @@ -7,9 +7,11 @@ public class GroundDetector : MonoBehaviour public void OnTriggerEnter(Collider other) { if ((1 << other.gameObject.layer & groundMask) != 0) onGround = true; + // onGround = true; } void OnTriggerStay(Collider other) { OnTriggerEnter(other); } void OnTriggerExit(Collider other) { if ((1 << other.gameObject.layer & groundMask) != 0) onGround = false; + // onGround = false; } } From df5602dc00b2666e7fe38c77fad8dfada5e3e053 Mon Sep 17 00:00:00 2001 From: KOSMOGOR Date: Sat, 26 Apr 2025 13:53:06 +0300 Subject: [PATCH 7/7] add: functional riffle and inventory for bullets --- Assets/Prefabs/Player.prefab | 87 ++++- Assets/Prefabs/Weapons/Pistol_0.1.prefab | 13 +- Assets/Prefabs/Weapons/Rifle_0.3.prefab | 79 +++- Assets/Scenes/TestScene.unity | 443 +++------------------- Assets/Scripts/Game/GameController.cs | 22 +- Assets/Scripts/Player/Rifle.cs | 21 + Assets/Scripts/Player/Rifle.cs.meta | 2 + Assets/Scripts/Player/WeaponController.cs | 7 +- 8 files changed, 258 insertions(+), 416 deletions(-) create mode 100644 Assets/Scripts/Player/Rifle.cs create mode 100644 Assets/Scripts/Player/Rifle.cs.meta diff --git a/Assets/Prefabs/Player.prefab b/Assets/Prefabs/Player.prefab index d4bca41..840080a 100644 --- a/Assets/Prefabs/Player.prefab +++ b/Assets/Prefabs/Player.prefab @@ -133,6 +133,7 @@ Transform: m_ConstrainProportionsScale: 0 m_Children: - {fileID: 3053641561535516023} + - {fileID: 7306251229952926972} m_Father: {fileID: 6890030909251295590} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!20 &1094126809165627842 @@ -458,22 +459,6 @@ PrefabInstance: serializedVersion: 3 m_TransformParent: {fileID: 4506534449155536579} m_Modifications: - - target: {fileID: 1042172676018165636, guid: af6264663cfc3ba499db761a90d861ca, type: 3} - propertyPath: m_LocalRotation.w - value: 0.7071068 - objectReference: {fileID: 0} - - target: {fileID: 1042172676018165636, guid: af6264663cfc3ba499db761a90d861ca, type: 3} - propertyPath: m_LocalRotation.y - value: 0.7071068 - objectReference: {fileID: 0} - - target: {fileID: 1042172676018165636, guid: af6264663cfc3ba499db761a90d861ca, type: 3} - propertyPath: m_LocalEulerAnglesHint.y - value: 90 - objectReference: {fileID: 0} - - target: {fileID: 1587861691790886941, guid: af6264663cfc3ba499db761a90d861ca, type: 3} - propertyPath: m_Name - value: Muzzle - objectReference: {fileID: 0} - target: {fileID: 2812489602185112801, guid: af6264663cfc3ba499db761a90d861ca, type: 3} propertyPath: m_Name value: Pistol_0.1 @@ -528,3 +513,73 @@ Transform: m_CorrespondingSourceObject: {fileID: 3191971078612809307, guid: af6264663cfc3ba499db761a90d861ca, type: 3} m_PrefabInstance: {fileID: 444904299868781356} m_PrefabAsset: {fileID: 0} +--- !u!1001 &6803844382836373506 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + serializedVersion: 3 + m_TransformParent: {fileID: 4506534449155536579} + m_Modifications: + - target: {fileID: 1283704224102497885, guid: a8be43ab8737b9b4bb440fd60a5e6ce5, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1283704224102497885, guid: a8be43ab8737b9b4bb440fd60a5e6ce5, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 90 + objectReference: {fileID: 0} + - target: {fileID: 3477561828804200004, guid: a8be43ab8737b9b4bb440fd60a5e6ce5, type: 3} + propertyPath: m_Name + value: Rifle_0.3 + objectReference: {fileID: 0} + - target: {fileID: 4253958408851774718, guid: a8be43ab8737b9b4bb440fd60a5e6ce5, type: 3} + propertyPath: m_LocalPosition.x + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 4253958408851774718, guid: a8be43ab8737b9b4bb440fd60a5e6ce5, type: 3} + propertyPath: m_LocalPosition.y + value: -0.3 + objectReference: {fileID: 0} + - target: {fileID: 4253958408851774718, guid: a8be43ab8737b9b4bb440fd60a5e6ce5, type: 3} + propertyPath: m_LocalPosition.z + value: 1.5 + objectReference: {fileID: 0} + - target: {fileID: 4253958408851774718, guid: a8be43ab8737b9b4bb440fd60a5e6ce5, type: 3} + propertyPath: m_LocalRotation.w + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 4253958408851774718, guid: a8be43ab8737b9b4bb440fd60a5e6ce5, type: 3} + propertyPath: m_LocalRotation.x + value: -0.5 + objectReference: {fileID: 0} + - target: {fileID: 4253958408851774718, guid: a8be43ab8737b9b4bb440fd60a5e6ce5, type: 3} + propertyPath: m_LocalRotation.y + value: -0.5 + objectReference: {fileID: 0} + - target: {fileID: 4253958408851774718, guid: a8be43ab8737b9b4bb440fd60a5e6ce5, type: 3} + propertyPath: m_LocalRotation.z + value: -0.5 + objectReference: {fileID: 0} + - target: {fileID: 4253958408851774718, guid: a8be43ab8737b9b4bb440fd60a5e6ce5, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: -90 + objectReference: {fileID: 0} + - target: {fileID: 4253958408851774718, guid: a8be43ab8737b9b4bb440fd60a5e6ce5, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: -90 + objectReference: {fileID: 0} + - target: {fileID: 4253958408851774718, guid: a8be43ab8737b9b4bb440fd60a5e6ce5, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: a8be43ab8737b9b4bb440fd60a5e6ce5, type: 3} +--- !u!4 &7306251229952926972 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 4253958408851774718, guid: a8be43ab8737b9b4bb440fd60a5e6ce5, type: 3} + m_PrefabInstance: {fileID: 6803844382836373506} + m_PrefabAsset: {fileID: 0} diff --git a/Assets/Prefabs/Weapons/Pistol_0.1.prefab b/Assets/Prefabs/Weapons/Pistol_0.1.prefab index 841594e..67e9bd1 100644 --- a/Assets/Prefabs/Weapons/Pistol_0.1.prefab +++ b/Assets/Prefabs/Weapons/Pistol_0.1.prefab @@ -10,7 +10,7 @@ GameObject: m_Component: - component: {fileID: 1042172676018165636} m_Layer: 0 - m_Name: muzzle + m_Name: Muzzle m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 @@ -24,13 +24,13 @@ Transform: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1587861691790886941} serializedVersion: 2 - m_LocalRotation: {x: 0, y: 1, z: 0, w: 0} + m_LocalRotation: {x: 0, y: 0.7071068, z: 0, w: 0.7071068} m_LocalPosition: {x: 0.035, y: -0.0003, z: -0.0015} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 3191971078612809307} - m_LocalEulerAnglesHint: {x: 0, y: 180, z: 0} + m_LocalEulerAnglesHint: {x: 0, y: 90, z: 0} --- !u!1001 &3154368798760636848 PrefabInstance: m_ObjectHideFlags: 0 @@ -53,15 +53,15 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: -8679921383154817045, guid: d734c466a893eb24080a9ca70b7b501d, type: 3} propertyPath: m_LocalPosition.x - value: 0 + value: 0.5 objectReference: {fileID: 0} - target: {fileID: -8679921383154817045, guid: d734c466a893eb24080a9ca70b7b501d, type: 3} propertyPath: m_LocalPosition.y - value: 0 + value: -0.2 objectReference: {fileID: 0} - target: {fileID: -8679921383154817045, guid: d734c466a893eb24080a9ca70b7b501d, type: 3} propertyPath: m_LocalPosition.z - value: 0 + value: 1.25 objectReference: {fileID: 0} - target: {fileID: -8679921383154817045, guid: d734c466a893eb24080a9ca70b7b501d, type: 3} propertyPath: m_LocalRotation.w @@ -142,6 +142,7 @@ MonoBehaviour: projectilePrefab: {fileID: 1562924000103655330, guid: bfe7100930f24fd52b5b66832f59cfa8, type: 3} spawnPosition: {fileID: 1042172676018165636} fireRate: 1 + currentDelay: 0 --- !u!4 &3191971078612809307 stripped Transform: m_CorrespondingSourceObject: {fileID: -8679921383154817045, guid: d734c466a893eb24080a9ca70b7b501d, type: 3} diff --git a/Assets/Prefabs/Weapons/Rifle_0.3.prefab b/Assets/Prefabs/Weapons/Rifle_0.3.prefab index 95d1ac2..e465517 100644 --- a/Assets/Prefabs/Weapons/Rifle_0.3.prefab +++ b/Assets/Prefabs/Weapons/Rifle_0.3.prefab @@ -1,5 +1,36 @@ %YAML 1.1 %TAG !u! tag:unity3d.com,2011: +--- !u!1 &7460370745949417932 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1283704224102497885} + m_Layer: 0 + m_Name: Muzzle + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1283704224102497885 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7460370745949417932} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0.7071068, z: 0, w: 0.7071068} + m_LocalPosition: {x: 0.06, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 4253958408851774718} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1001 &4360506843749432085 PrefabInstance: m_ObjectHideFlags: 0 @@ -8,6 +39,18 @@ PrefabInstance: serializedVersion: 3 m_TransformParent: {fileID: 0} m_Modifications: + - target: {fileID: -8679921383154817045, guid: 873975b0a04c6cf40968163e886b6680, type: 3} + propertyPath: m_LocalScale.x + value: 15 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 873975b0a04c6cf40968163e886b6680, type: 3} + propertyPath: m_LocalScale.y + value: 15 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 873975b0a04c6cf40968163e886b6680, type: 3} + propertyPath: m_LocalScale.z + value: 15 + objectReference: {fileID: 0} - target: {fileID: -8679921383154817045, guid: 873975b0a04c6cf40968163e886b6680, type: 3} propertyPath: m_LocalPosition.x value: 0 @@ -54,6 +97,38 @@ PrefabInstance: objectReference: {fileID: 0} m_RemovedComponents: [] m_RemovedGameObjects: [] - m_AddedGameObjects: [] - m_AddedComponents: [] + m_AddedGameObjects: + - targetCorrespondingSourceObject: {fileID: -8679921383154817045, guid: 873975b0a04c6cf40968163e886b6680, type: 3} + insertIndex: -1 + addedObject: {fileID: 1283704224102497885} + m_AddedComponents: + - targetCorrespondingSourceObject: {fileID: 919132149155446097, guid: 873975b0a04c6cf40968163e886b6680, type: 3} + insertIndex: -1 + addedObject: {fileID: 1683623121582132765} m_SourcePrefab: {fileID: 100100000, guid: 873975b0a04c6cf40968163e886b6680, type: 3} +--- !u!1 &3477561828804200004 stripped +GameObject: + m_CorrespondingSourceObject: {fileID: 919132149155446097, guid: 873975b0a04c6cf40968163e886b6680, type: 3} + m_PrefabInstance: {fileID: 4360506843749432085} + m_PrefabAsset: {fileID: 0} +--- !u!114 &1683623121582132765 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3477561828804200004} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4cc7bc1baad25a9459ee673b6d502363, type: 3} + m_Name: + m_EditorClassIdentifier: + projectilePrefab: {fileID: 1562924000103655330, guid: bfe7100930f24fd52b5b66832f59cfa8, type: 3} + spawnPosition: {fileID: 1283704224102497885} + fireRate: 3 + currentDelay: 0 +--- !u!4 &4253958408851774718 stripped +Transform: + m_CorrespondingSourceObject: {fileID: -8679921383154817045, guid: 873975b0a04c6cf40968163e886b6680, type: 3} + m_PrefabInstance: {fileID: 4360506843749432085} + m_PrefabAsset: {fileID: 0} diff --git a/Assets/Scenes/TestScene.unity b/Assets/Scenes/TestScene.unity index 2d89581..4d61b3c 100644 --- a/Assets/Scenes/TestScene.unity +++ b/Assets/Scenes/TestScene.unity @@ -119,388 +119,63 @@ NavMeshSettings: debug: m_Flags: 0 m_NavMeshData: {fileID: 0} ---- !u!1 &353004301 -GameObject: +--- !u!1001 &1529331689 +PrefabInstance: m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 353004305} - - component: {fileID: 353004304} - - component: {fileID: 353004303} - - component: {fileID: 353004302} - - component: {fileID: 353004306} - m_Layer: 0 - m_Name: Enemy - m_TagString: Enemy - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!65 &353004302 -BoxCollider: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 353004301} - m_Material: {fileID: 0} - m_IncludeLayers: - serializedVersion: 2 - m_Bits: 0 - m_ExcludeLayers: - serializedVersion: 2 - m_Bits: 0 - m_LayerOverridePriority: 0 - m_IsTrigger: 0 - m_ProvidesContacts: 0 - m_Enabled: 1 - serializedVersion: 3 - m_Size: {x: 1, y: 1, z: 1} - m_Center: {x: 0, y: 0, z: 0} ---- !u!23 &353004303 -MeshRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 353004301} - m_Enabled: 1 - m_CastShadows: 1 - m_ReceiveShadows: 1 - m_DynamicOccludee: 1 - m_StaticShadowCaster: 0 - m_MotionVectors: 1 - m_LightProbeUsage: 1 - m_ReflectionProbeUsage: 1 - m_RayTracingMode: 2 - m_RayTraceProcedural: 0 - m_RayTracingAccelStructBuildFlagsOverride: 0 - m_RayTracingAccelStructBuildFlags: 1 - m_SmallMeshCulling: 1 - m_RenderingLayerMask: 1 - m_RendererPriority: 0 - m_Materials: - - {fileID: 2100000, guid: 31321ba15b8f8eb4c954353edc038b1d, type: 2} - m_StaticBatchInfo: - firstSubMesh: 0 - subMeshCount: 0 - m_StaticBatchRoot: {fileID: 0} - m_ProbeAnchor: {fileID: 0} - m_LightProbeVolumeOverride: {fileID: 0} - m_ScaleInLightmap: 1 - m_ReceiveGI: 1 - m_PreserveUVs: 0 - m_IgnoreNormalsForChartDetection: 0 - m_ImportantGI: 0 - m_StitchLightmapSeams: 1 - m_SelectedEditorRenderState: 3 - m_MinimumChartSize: 4 - m_AutoUVMaxDistance: 0.5 - m_AutoUVMaxAngle: 89 - m_LightmapParameters: {fileID: 0} - m_SortingLayerID: 0 - m_SortingLayer: 0 - m_SortingOrder: 0 - m_AdditionalVertexStreams: {fileID: 0} ---- !u!33 &353004304 -MeshFilter: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 353004301} - m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} ---- !u!4 &353004305 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 353004301} serializedVersion: 2 - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 2, z: 4} - m_LocalScale: {x: 1, y: 2, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 0} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &353004306 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 353004301} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 46894d927b8e6654487b876457ca8974, type: 3} - m_Name: - m_EditorClassIdentifier: - hp: 100 ---- !u!1 &851709644 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 851709645} - - component: {fileID: 851709648} - - component: {fileID: 851709647} - - component: {fileID: 851709646} - m_Layer: 0 - m_Name: Pistol - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &851709645 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 851709644} - serializedVersion: 2 - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: 0.5, y: -0.5, z: 0.5} - m_LocalScale: {x: 0.2, y: 0.2, z: 0.5} - m_ConstrainProportionsScale: 0 - m_Children: - - {fileID: 1183564512} - m_Father: {fileID: 1039096618} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &851709646 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 851709644} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 9b5e56940d7855caeb2d584265db0624, type: 3} - m_Name: - m_EditorClassIdentifier: - projectilePrefab: {fileID: 1562924000103655330, guid: bfe7100930f24fd52b5b66832f59cfa8, type: 3} - spawnPosition: {fileID: 1183564512} - fireRate: 1 ---- !u!23 &851709647 -MeshRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 851709644} - m_Enabled: 1 - m_CastShadows: 1 - m_ReceiveShadows: 1 - m_DynamicOccludee: 1 - m_StaticShadowCaster: 0 - m_MotionVectors: 1 - m_LightProbeUsage: 1 - m_ReflectionProbeUsage: 1 - m_RayTracingMode: 2 - m_RayTraceProcedural: 0 - m_RayTracingAccelStructBuildFlagsOverride: 0 - m_RayTracingAccelStructBuildFlags: 1 - m_SmallMeshCulling: 1 - m_RenderingLayerMask: 1 - m_RendererPriority: 0 - m_Materials: - - {fileID: 2100000, guid: 31321ba15b8f8eb4c954353edc038b1d, type: 2} - m_StaticBatchInfo: - firstSubMesh: 0 - subMeshCount: 0 - m_StaticBatchRoot: {fileID: 0} - m_ProbeAnchor: {fileID: 0} - m_LightProbeVolumeOverride: {fileID: 0} - m_ScaleInLightmap: 1 - m_ReceiveGI: 1 - m_PreserveUVs: 0 - m_IgnoreNormalsForChartDetection: 0 - m_ImportantGI: 0 - m_StitchLightmapSeams: 1 - m_SelectedEditorRenderState: 3 - m_MinimumChartSize: 4 - m_AutoUVMaxDistance: 0.5 - m_AutoUVMaxAngle: 89 - m_LightmapParameters: {fileID: 0} - m_SortingLayerID: 0 - m_SortingLayer: 0 - m_SortingOrder: 0 - m_AdditionalVertexStreams: {fileID: 0} ---- !u!33 &851709648 -MeshFilter: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 851709644} - m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} ---- !u!4 &1039096618 stripped -Transform: - m_CorrespondingSourceObject: {fileID: 4506534449155536579, guid: 53e225dcb536a6f46b5844bb8db07fe4, type: 3} - m_PrefabInstance: {fileID: 3997104640432974468} - m_PrefabAsset: {fileID: 0} ---- !u!1 &1183564511 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1183564512} - m_Layer: 0 - m_Name: Muzzle - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &1183564512 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1183564511} - serializedVersion: 2 - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0.5} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 851709645} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &1560783767 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1560783769} - - component: {fileID: 1560783768} - - component: {fileID: 1560783770} - m_Layer: 0 - m_Name: Directional Light - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!108 &1560783768 -Light: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1560783767} - m_Enabled: 0 - serializedVersion: 11 - m_Type: 1 - m_Color: {r: 1, g: 0.95686275, b: 0.8392157, a: 1} - m_Intensity: 1 - m_Range: 10 - m_SpotAngle: 30 - m_InnerSpotAngle: 21.80208 - m_CookieSize: 10 - m_Shadows: - m_Type: 2 - m_Resolution: -1 - m_CustomResolution: -1 - m_Strength: 1 - m_Bias: 0.05 - m_NormalBias: 0.4 - m_NearPlane: 0.2 - m_CullingMatrixOverride: - e00: 1 - e01: 0 - e02: 0 - e03: 0 - e10: 0 - e11: 1 - e12: 0 - e13: 0 - e20: 0 - e21: 0 - e22: 1 - e23: 0 - e30: 0 - e31: 0 - e32: 0 - e33: 1 - m_UseCullingMatrixOverride: 0 - m_Cookie: {fileID: 0} - m_DrawHalo: 0 - m_Flare: {fileID: 0} - m_RenderMode: 0 - m_CullingMask: - serializedVersion: 2 - m_Bits: 4294967295 - m_RenderingLayerMask: 1 - m_Lightmapping: 4 - m_LightShadowCasterMode: 0 - m_AreaSize: {x: 1, y: 1} - m_BounceIntensity: 1 - m_ColorTemperature: 6570 - m_UseColorTemperature: 0 - m_BoundingSphereOverride: {x: 0, y: 0, z: 0, w: 0} - m_UseBoundingSphereOverride: 0 - m_UseViewFrustumForShadowCasterCull: 1 - m_ForceVisible: 0 - m_ShadowRadius: 0 - m_ShadowAngle: 0 - m_LightUnit: 1 - m_LuxAtDistance: 1 - m_EnableSpotReflector: 1 ---- !u!4 &1560783769 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1560783767} - serializedVersion: 2 - m_LocalRotation: {x: 0.40821788, y: -0.23456968, z: 0.10938163, w: 0.8754261} - m_LocalPosition: {x: 0, y: 3, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 0} - m_LocalEulerAnglesHint: {x: 50, y: -30, z: 0} ---- !u!114 &1560783770 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1560783767} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 474bcb49853aa07438625e644c072ee6, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Version: 3 - m_UsePipelineSettings: 1 - m_AdditionalLightsShadowResolutionTier: 2 - m_LightLayerMask: 1 - m_RenderingLayers: 1 - m_CustomShadowLayers: 0 - m_ShadowLayerMask: 1 - m_ShadowRenderingLayers: 1 - m_LightCookieSize: {x: 1, y: 1} - m_LightCookieOffset: {x: 0, y: 0} - m_SoftShadowQuality: 0 + m_Modification: + serializedVersion: 3 + m_TransformParent: {fileID: 0} + m_Modifications: + - target: {fileID: 4174800862365466133, guid: c70b322607b9da64382c966f9fdf41b1, type: 3} + propertyPath: m_LocalPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4174800862365466133, guid: c70b322607b9da64382c966f9fdf41b1, type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4174800862365466133, guid: c70b322607b9da64382c966f9fdf41b1, type: 3} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4174800862365466133, guid: c70b322607b9da64382c966f9fdf41b1, type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 4174800862365466133, guid: c70b322607b9da64382c966f9fdf41b1, type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4174800862365466133, guid: c70b322607b9da64382c966f9fdf41b1, type: 3} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4174800862365466133, guid: c70b322607b9da64382c966f9fdf41b1, type: 3} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4174800862365466133, guid: c70b322607b9da64382c966f9fdf41b1, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4174800862365466133, guid: c70b322607b9da64382c966f9fdf41b1, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4174800862365466133, guid: c70b322607b9da64382c966f9fdf41b1, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 8523789084967070956, guid: c70b322607b9da64382c966f9fdf41b1, type: 3} + propertyPath: m_Name + value: GameController + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: c70b322607b9da64382c966f9fdf41b1, type: 3} --- !u!1 &1692628187 GameObject: m_ObjectHideFlags: 0 @@ -663,17 +338,13 @@ PrefabInstance: objectReference: {fileID: 0} m_RemovedComponents: [] m_RemovedGameObjects: [] - m_AddedGameObjects: - - targetCorrespondingSourceObject: {fileID: 4506534449155536579, guid: 53e225dcb536a6f46b5844bb8db07fe4, type: 3} - insertIndex: -1 - addedObject: {fileID: 851709645} + m_AddedGameObjects: [] m_AddedComponents: [] m_SourcePrefab: {fileID: 100100000, guid: 53e225dcb536a6f46b5844bb8db07fe4, type: 3} --- !u!1660057539 &9223372036854775807 SceneRoots: m_ObjectHideFlags: 0 m_Roots: - - {fileID: 1560783769} - {fileID: 1692628191} - {fileID: 3997104640432974468} - - {fileID: 353004305} + - {fileID: 1529331689} diff --git a/Assets/Scripts/Game/GameController.cs b/Assets/Scripts/Game/GameController.cs index e208dd2..fb4aedf 100644 --- a/Assets/Scripts/Game/GameController.cs +++ b/Assets/Scripts/Game/GameController.cs @@ -12,6 +12,7 @@ public class GameController : MonoBehaviour public SceneAsset deployScene; public List levels; public List enemies; + public Dictionary inventory = new(); public void Start() { if (i) { Destroy(gameObject); return; } @@ -25,7 +26,10 @@ public class GameController : MonoBehaviour levels.ForEach(li => { AddEnemyInLevel(SelectEnemyWeighted().prefab, li.scene.name); }); - + foreach (BulletType i in Enum.GetValues(typeof(BulletType))) { + if (i == BulletType.None) continue; + inventory[i] = 10; + } } public Dictionary PopEnemies(string sceneName) { @@ -72,6 +76,18 @@ public class GameController : MonoBehaviour Cursor.lockState = locked ? CursorLockMode.Locked : CursorLockMode.None; Cursor.visible = !locked; } + + public int GetBulletCount(BulletType bulletType) { + return inventory[bulletType]; + } + + public bool ConsumeBullet(BulletType bulletType, int n = 1) { + if (inventory[bulletType] >= n) { + inventory[bulletType] -= n; + return true; + } + return false; + } } [Serializable] @@ -79,11 +95,11 @@ public struct LevelInfo { public SceneAsset scene; public int hp; public int maxHp; - public FactoryType factory; + public BulletType factory; public Dictionary enemies; } -public enum FactoryType { +public enum BulletType { None, Rifle, Rocket, diff --git a/Assets/Scripts/Player/Rifle.cs b/Assets/Scripts/Player/Rifle.cs new file mode 100644 index 0000000..bd3196f --- /dev/null +++ b/Assets/Scripts/Player/Rifle.cs @@ -0,0 +1,21 @@ +using UnityEngine; + +public class Rifle : Weapon +{ + public GameObject projectilePrefab; + public Transform spawnPosition; + public float fireRate = 3f; + + [SerializeField] float currentDelay = 0; + + public override void Shoot(bool keyDown, bool keyHold) { + if (keyHold && (fireRate == 0 || currentDelay >= 1 / fireRate) && GameController.i.ConsumeBullet(BulletType.Rifle)) { + Instantiate(projectilePrefab, spawnPosition.position, spawnPosition.rotation); + currentDelay = 0; + } + } + + void Update() { + if (fireRate != 0) currentDelay = Mathf.Clamp(currentDelay += Time.deltaTime, 0, 1 / fireRate); + } +} diff --git a/Assets/Scripts/Player/Rifle.cs.meta b/Assets/Scripts/Player/Rifle.cs.meta new file mode 100644 index 0000000..bb4eece --- /dev/null +++ b/Assets/Scripts/Player/Rifle.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 4cc7bc1baad25a9459ee673b6d502363 \ No newline at end of file diff --git a/Assets/Scripts/Player/WeaponController.cs b/Assets/Scripts/Player/WeaponController.cs index 874f070..1ae598b 100644 --- a/Assets/Scripts/Player/WeaponController.cs +++ b/Assets/Scripts/Player/WeaponController.cs @@ -9,11 +9,12 @@ public class WeaponController : MonoBehaviour void Start() { weapons = GetComponentsInChildren(); - if (weapons.Length > currentWeapon) weapons[currentWeapon].SetWeaponState(true); + for (int i = 0; i < weapons.Length; ++i) weapons[i].SetWeaponState(i == currentWeapon); } void Update() { - ChangeActiveWeapon((currentWeapon + (int)Input.mouseScrollDelta.y) % weapons.Length); + if (weapons.Length == 0) return; + ChangeActiveWeapon((currentWeapon + (int)Input.mouseScrollDelta.y + weapons.Length) % weapons.Length); CheckButtonsForChangeWeapon(); if (Input.GetMouseButton(0) && weapons[currentWeapon].isActive) weapons[currentWeapon].Shoot(Input.GetMouseButtonDown(0), Input.GetMouseButton(0)); } @@ -28,7 +29,7 @@ public class WeaponController : MonoBehaviour void ChangeActiveWeapon(int ind) { if (ind < 0 || ind >= weapons.Length || ind == currentWeapon) return; weapons[currentWeapon].SetWeaponState(false); - weapons[ind].SetWeaponState(false); + weapons[ind].SetWeaponState(true); currentWeapon = ind; } }