From 1869fa75842dfae1407501f54c84b2bf0a222bbe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C5=A1a=20Ceviel?= Date: Tue, 24 Feb 2026 09:18:49 +0300 Subject: [PATCH] full playable game --- .../Gameplay/Character/Stats/HealthBuff.cs | 16 + .../Character/Stats/HealthBuff.cs.meta | 3 + Assets/Code/Gameplay/Enemy/SimpleEnemy.cs | 28 +- Assets/Code/Gameplay/Weapons/WeaponBase.cs | 18 +- Assets/Code/UI/GameUI.cs | 87 + Assets/Code/UI/GameUI.cs.meta | 3 + .../Resources/Audio/Music/GameplayTheme.wav | 3 + .../Audio/Music/GameplayTheme.wav.meta | 23 + Assets/Resources/Audio/SFX/AK47.meta | 8 + .../Resources/Audio/SFX/AK47/ak47_empty.wav | 3 + .../Audio/SFX/AK47/ak47_empty.wav.meta | 23 + .../Resources/Audio/SFX/AK47/ak47_reload.wav | 3 + .../Audio/SFX/AK47/ak47_reload.wav.meta | 23 + Assets/Resources/Audio/SFX/AK47/ak47_shot.wav | 3 + .../Audio/SFX/AK47/ak47_shot.wav.meta | 23 + Assets/Resources/Audio/SFX/Glock.meta | 8 + .../Audio/SFX/Glock/glock_clipout.wav | 3 + .../Audio/SFX/Glock/glock_clipout.wav.meta | 23 + .../Audio/SFX/Glock/glock_reload.wav | 3 + .../Audio/SFX/Glock/glock_reload.wav.meta | 23 + .../Resources/Audio/SFX/Glock/glock_shot.wav | 3 + .../Audio/SFX/Glock/glock_shot.wav.meta | 23 + Assets/Resources/Audio/SFX/M16A4.meta | 8 + .../Resources/Audio/SFX/M16A4/m16a4_empty.wav | 3 + .../Audio/SFX/M16A4/m16a4_empty.wav.meta | 23 + .../Audio/SFX/M16A4/m16a4_reload.wav | 3 + .../Audio/SFX/M16A4/m16a4_reload.wav.meta | 23 + .../Resources/Audio/SFX/M16A4/m16a4_shot.wav | 3 + .../Audio/SFX/M16A4/m16a4_shot.wav.meta | 23 + Assets/Resources/Materials/Enemy.mat | 137 + Assets/Resources/Materials/Enemy.mat.meta | 8 + Assets/Resources/Materials/HealthBuff.mat | 137 + .../Resources/Materials/HealthBuff.mat.meta | 8 + Assets/Resources/Meshes/bullet.glb | Bin 0 -> 28260 bytes Assets/Resources/Meshes/bullet.glb.meta | 32 + Assets/Resources/Prefabs/AK47.prefab | 9 +- Assets/Resources/Prefabs/AK47_Enemy.prefab | 1288 +++++++++ .../Resources/Prefabs/AK47_Enemy.prefab.meta | 7 + Assets/Resources/Prefabs/Bullet.prefab | 318 ++- Assets/Resources/Prefabs/Enemy_AK47.prefab | 222 ++ .../Resources/Prefabs/Enemy_AK47.prefab.meta | 7 + Assets/Resources/Prefabs/Enemy_M16A4.prefab | 222 ++ .../Resources/Prefabs/Enemy_M16A4.prefab.meta | 7 + Assets/Resources/Prefabs/Enemy_Pistol.prefab | 222 ++ .../Prefabs/Enemy_Pistol.prefab.meta | 7 + Assets/Resources/Prefabs/HealthBuff.prefab | 156 ++ .../Resources/Prefabs/HealthBuff.prefab.meta | 7 + Assets/Resources/Prefabs/M16A4.prefab | 11 +- Assets/Resources/Prefabs/M16A4_Enemy.prefab | 2323 +++++++++++++++++ .../Resources/Prefabs/M16A4_Enemy.prefab.meta | 7 + Assets/Resources/Prefabs/Pistol.prefab | 12 +- Assets/Resources/Prefabs/Pistol_Enemy.prefab | 550 ++++ .../Prefabs/Pistol_Enemy.prefab.meta | 7 + Assets/Resources/Scenes/Gameplay.unity | 1469 ++++++++++- Assets/Resources/Scenes/MainMenu.unity | 2 +- ProjectSettings/ProjectSettings.asset | 4 +- 56 files changed, 7581 insertions(+), 37 deletions(-) create mode 100644 Assets/Code/Gameplay/Character/Stats/HealthBuff.cs create mode 100644 Assets/Code/Gameplay/Character/Stats/HealthBuff.cs.meta create mode 100644 Assets/Code/UI/GameUI.cs create mode 100644 Assets/Code/UI/GameUI.cs.meta create mode 100644 Assets/Resources/Audio/Music/GameplayTheme.wav create mode 100644 Assets/Resources/Audio/Music/GameplayTheme.wav.meta create mode 100644 Assets/Resources/Audio/SFX/AK47.meta create mode 100644 Assets/Resources/Audio/SFX/AK47/ak47_empty.wav create mode 100644 Assets/Resources/Audio/SFX/AK47/ak47_empty.wav.meta create mode 100644 Assets/Resources/Audio/SFX/AK47/ak47_reload.wav create mode 100644 Assets/Resources/Audio/SFX/AK47/ak47_reload.wav.meta create mode 100644 Assets/Resources/Audio/SFX/AK47/ak47_shot.wav create mode 100644 Assets/Resources/Audio/SFX/AK47/ak47_shot.wav.meta create mode 100644 Assets/Resources/Audio/SFX/Glock.meta create mode 100644 Assets/Resources/Audio/SFX/Glock/glock_clipout.wav create mode 100644 Assets/Resources/Audio/SFX/Glock/glock_clipout.wav.meta create mode 100644 Assets/Resources/Audio/SFX/Glock/glock_reload.wav create mode 100644 Assets/Resources/Audio/SFX/Glock/glock_reload.wav.meta create mode 100644 Assets/Resources/Audio/SFX/Glock/glock_shot.wav create mode 100644 Assets/Resources/Audio/SFX/Glock/glock_shot.wav.meta create mode 100644 Assets/Resources/Audio/SFX/M16A4.meta create mode 100644 Assets/Resources/Audio/SFX/M16A4/m16a4_empty.wav create mode 100644 Assets/Resources/Audio/SFX/M16A4/m16a4_empty.wav.meta create mode 100644 Assets/Resources/Audio/SFX/M16A4/m16a4_reload.wav create mode 100644 Assets/Resources/Audio/SFX/M16A4/m16a4_reload.wav.meta create mode 100644 Assets/Resources/Audio/SFX/M16A4/m16a4_shot.wav create mode 100644 Assets/Resources/Audio/SFX/M16A4/m16a4_shot.wav.meta create mode 100644 Assets/Resources/Materials/Enemy.mat create mode 100644 Assets/Resources/Materials/Enemy.mat.meta create mode 100644 Assets/Resources/Materials/HealthBuff.mat create mode 100644 Assets/Resources/Materials/HealthBuff.mat.meta create mode 100644 Assets/Resources/Meshes/bullet.glb create mode 100644 Assets/Resources/Meshes/bullet.glb.meta create mode 100644 Assets/Resources/Prefabs/AK47_Enemy.prefab create mode 100644 Assets/Resources/Prefabs/AK47_Enemy.prefab.meta create mode 100644 Assets/Resources/Prefabs/Enemy_AK47.prefab create mode 100644 Assets/Resources/Prefabs/Enemy_AK47.prefab.meta create mode 100644 Assets/Resources/Prefabs/Enemy_M16A4.prefab create mode 100644 Assets/Resources/Prefabs/Enemy_M16A4.prefab.meta create mode 100644 Assets/Resources/Prefabs/Enemy_Pistol.prefab create mode 100644 Assets/Resources/Prefabs/Enemy_Pistol.prefab.meta create mode 100644 Assets/Resources/Prefabs/HealthBuff.prefab create mode 100644 Assets/Resources/Prefabs/HealthBuff.prefab.meta create mode 100644 Assets/Resources/Prefabs/M16A4_Enemy.prefab create mode 100644 Assets/Resources/Prefabs/M16A4_Enemy.prefab.meta create mode 100644 Assets/Resources/Prefabs/Pistol_Enemy.prefab create mode 100644 Assets/Resources/Prefabs/Pistol_Enemy.prefab.meta diff --git a/Assets/Code/Gameplay/Character/Stats/HealthBuff.cs b/Assets/Code/Gameplay/Character/Stats/HealthBuff.cs new file mode 100644 index 0000000..0223534 --- /dev/null +++ b/Assets/Code/Gameplay/Character/Stats/HealthBuff.cs @@ -0,0 +1,16 @@ +using UnityEngine; + +namespace Code.Gameplay.Character.Stats +{ + public class HealthBuff : MonoBehaviour + { + [SerializeField] private int healthBuff = 50; + private void OnTriggerEnter(Collider other) + { + if (!other.CompareTag("Player")) return; + var health = other.GetComponent(); + health?.Heal(healthBuff); + Destroy(gameObject); + } + } +} \ No newline at end of file diff --git a/Assets/Code/Gameplay/Character/Stats/HealthBuff.cs.meta b/Assets/Code/Gameplay/Character/Stats/HealthBuff.cs.meta new file mode 100644 index 0000000..b5c3cbb --- /dev/null +++ b/Assets/Code/Gameplay/Character/Stats/HealthBuff.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: d0c628fd85b24cb1ad9748bba030feaa +timeCreated: 1771912003 \ No newline at end of file diff --git a/Assets/Code/Gameplay/Enemy/SimpleEnemy.cs b/Assets/Code/Gameplay/Enemy/SimpleEnemy.cs index a5e77a0..7fc3302 100644 --- a/Assets/Code/Gameplay/Enemy/SimpleEnemy.cs +++ b/Assets/Code/Gameplay/Enemy/SimpleEnemy.cs @@ -10,6 +10,7 @@ namespace Code.Gameplay.Enemy { [SerializeField] private HealthSystem healthSystem; [SerializeField] private WeaponBase weapon; + [SerializeField] private Transform weaponPoint; [SerializeField] private Transform firePoint; [SerializeField] private Transform target; @@ -40,6 +41,15 @@ namespace Code.Gameplay.Enemy private void Start() { + if (weapon) + { + var weaponGo = Instantiate(weapon.gameObject, weaponPoint); + weapon = weaponGo.GetComponent(); + weapon._firePoint = firePoint.transform; + weapon.Reload(); + attackCooldown = weapon.FireRate + 0.01f; + } + if (healthSystem != null) { healthSystem.OnDied += HandleDeath; @@ -110,17 +120,20 @@ namespace Code.Gameplay.Enemy if (!HasLineOfSight()) return; lastAttackTime = Time.time; - weapon.Shoot(); + if (weapon.CurrentAmmo <= 0) + weapon.Reload(); + else + weapon.StartShooting(); } private bool HasLineOfSight() { if (target == null) return false; - var direction = (target.position - firePoint.position).normalized; - var distance = Vector3.Distance(firePoint.position, target.position); + var direction = (target.position - weaponPoint.position).normalized; + var distance = Vector3.Distance(weaponPoint.position, target.position); - if (Physics.Raycast(firePoint.position, direction, out var hit, distance, obstacleMask)) + if (Physics.Raycast(weaponPoint.position, direction, out var hit, distance, obstacleMask)) { return hit.collider.transform == target; } @@ -131,8 +144,11 @@ namespace Code.Gameplay.Enemy private void HandleDeath() { enabled = false; - - Destroy(gameObject, 2f); + + var healthGo = Instantiate(Resources.Load("Prefabs/HealthBuff").gameObject); + healthGo.transform.position = new Vector3(transform.position.x, transform.position.y - 1, transform.position.z); + + Destroy(gameObject, 1); } public void TakeDamage(float damage) diff --git a/Assets/Code/Gameplay/Weapons/WeaponBase.cs b/Assets/Code/Gameplay/Weapons/WeaponBase.cs index 172a825..2c0ae0f 100644 --- a/Assets/Code/Gameplay/Weapons/WeaponBase.cs +++ b/Assets/Code/Gameplay/Weapons/WeaponBase.cs @@ -21,7 +21,7 @@ namespace Code.Gameplay.Weapons [SerializeField] protected float reloadTime = 1.5f; [SerializeField] protected float spreadAngle = 1f; - private Transform _firePoint; + public Transform _firePoint; [SerializeField] protected GameObject bulletPrefab; [SerializeField] protected ParticleSystem muzzleFlash; [SerializeField] protected AudioClip shootSound; @@ -32,12 +32,15 @@ namespace Code.Gameplay.Weapons protected bool isShooting; protected bool isReloading; protected float lastShotTime; + protected float lastShotTryTime; public WeaponType Type => weaponType; public int CurrentAmmo => currentAmmo; public int ReserveAmmo => reserveAmmo; public int MagazineSize => magazineSize; public bool IsReloading => isReloading; + public float FireRate => fireRate; + public string WeaponName => weaponName; protected virtual void Awake() { @@ -50,21 +53,23 @@ namespace Code.Gameplay.Weapons protected virtual void Start() { - _firePoint = FindFirstObjectByType().transform; + if (!_firePoint) + _firePoint = FindFirstObjectByType().transform; } public virtual void Shoot() { if (isReloading) return; + + if (Time.time - lastShotTime < fireRate) + return; + if (currentAmmo <= 0) { PlayEmptySound(); return; } - if (Time.time - lastShotTime < fireRate) - return; - switch (fireMode) { case FireMode.SemiAutomatic: @@ -160,6 +165,9 @@ namespace Code.Gameplay.Weapons protected virtual void PlayEmptySound() { + if (Time.time - lastShotTryTime < fireRate) + return; + lastShotTryTime = Time.time; if (emptySound != null) audioSource.PlayOneShot(emptySound); } diff --git a/Assets/Code/UI/GameUI.cs b/Assets/Code/UI/GameUI.cs new file mode 100644 index 0000000..85a6bd2 --- /dev/null +++ b/Assets/Code/UI/GameUI.cs @@ -0,0 +1,87 @@ +using TMPro; +using UnityEngine; +using Code.Gameplay.Character.Core; +using Code.Gameplay.Character.Inventory; +using Code.Gameplay.Character.Stats; + +namespace Code.UI +{ + public class GameUI : MonoBehaviour + { + [SerializeField] private TMP_Text weaponNameText; + [SerializeField] private TMP_Text healthText; + [SerializeField] private TMP_Text ammoText; + + [SerializeField] private string weaponNameFormat = "CURRENT WEAPON: {0}"; + [SerializeField] private string healthFormat = "HP: {0}/{1}"; + [SerializeField] private string ammoFormat = "AMMO: {0}/{1}"; + + private CharacterProvider _player; + private HealthSystem _playerHealth; + private WeaponInventory _weaponInventory; + + private void Start() + { + _player = FindFirstObjectByType(); + + if (_player != null) + { + _playerHealth = _player.GetComponent(); + _weaponInventory = _player.GetComponent(); + } + + if (_playerHealth != null) + { + _playerHealth.OnHealthChanged += UpdateHealth; + } + } + + private void Update() + { + UpdateWeaponName(); + UpdateHealth(); + UpdateAmmo(); + } + + private void UpdateWeaponName() + { + if (weaponNameText == null || _weaponInventory?.CurrentWeapon == null) return; + + var weaponName = _weaponInventory.CurrentWeapon.WeaponName; + weaponNameText.text = string.Format(weaponNameFormat, weaponName.ToUpper()); + } + + private void UpdateHealth() + { + if (healthText == null || _playerHealth == null) return; + + healthText.text = string.Format(healthFormat, + _playerHealth.CurrentHealth, + _playerHealth.MaxHealth); + } + + private void UpdateHealth(float current, float max) + { + if (healthText == null) return; + healthText.text = string.Format(healthFormat, current, max); + } + + private void UpdateAmmo() + { + if (ammoText == null || _weaponInventory?.CurrentWeapon == null) return; + + var weapon = _weaponInventory.CurrentWeapon; + ammoText.text = string.Format(ammoFormat, + weapon.CurrentAmmo, + weapon.ReserveAmmo); + } + + private void OnDestroy() + { + if (_playerHealth != null) + { + _playerHealth.OnHealthChanged -= UpdateHealth; + } + } + } +} \ No newline at end of file diff --git a/Assets/Code/UI/GameUI.cs.meta b/Assets/Code/UI/GameUI.cs.meta new file mode 100644 index 0000000..cb59517 --- /dev/null +++ b/Assets/Code/UI/GameUI.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 178d0870793f4cee961b9e91b88f88ae +timeCreated: 1771875966 \ No newline at end of file diff --git a/Assets/Resources/Audio/Music/GameplayTheme.wav b/Assets/Resources/Audio/Music/GameplayTheme.wav new file mode 100644 index 0000000..1456b0a --- /dev/null +++ b/Assets/Resources/Audio/Music/GameplayTheme.wav @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:165da21b3463bc772e7b627ad055737d5f49a2bcf36cfd50af3e7b164e816e6a +size 34976544 diff --git a/Assets/Resources/Audio/Music/GameplayTheme.wav.meta b/Assets/Resources/Audio/Music/GameplayTheme.wav.meta new file mode 100644 index 0000000..2d4f20b --- /dev/null +++ b/Assets/Resources/Audio/Music/GameplayTheme.wav.meta @@ -0,0 +1,23 @@ +fileFormatVersion: 2 +guid: d8bb0b5a8a6b4901f9a7bdba027603b1 +AudioImporter: + externalObjects: {} + serializedVersion: 8 + defaultSettings: + serializedVersion: 2 + loadType: 0 + sampleRateSetting: 0 + sampleRateOverride: 44100 + compressionFormat: 1 + quality: 1 + conversionMode: 0 + preloadAudioData: 0 + platformSettingOverrides: {} + forceToMono: 0 + normalize: 1 + loadInBackground: 0 + ambisonic: 0 + 3D: 1 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Resources/Audio/SFX/AK47.meta b/Assets/Resources/Audio/SFX/AK47.meta new file mode 100644 index 0000000..f1847c6 --- /dev/null +++ b/Assets/Resources/Audio/SFX/AK47.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 31206e9553a043d44a6af26745bfd2ad +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Resources/Audio/SFX/AK47/ak47_empty.wav b/Assets/Resources/Audio/SFX/AK47/ak47_empty.wav new file mode 100644 index 0000000..9c117a2 --- /dev/null +++ b/Assets/Resources/Audio/SFX/AK47/ak47_empty.wav @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a0b3f12b2b4230bc2e0d025e1ed6ae302340f36111d21ac26b253d9d97cb06e0 +size 14176 diff --git a/Assets/Resources/Audio/SFX/AK47/ak47_empty.wav.meta b/Assets/Resources/Audio/SFX/AK47/ak47_empty.wav.meta new file mode 100644 index 0000000..ca353f2 --- /dev/null +++ b/Assets/Resources/Audio/SFX/AK47/ak47_empty.wav.meta @@ -0,0 +1,23 @@ +fileFormatVersion: 2 +guid: 0ffbe0005b3d1c926aea0521b76ae39a +AudioImporter: + externalObjects: {} + serializedVersion: 8 + defaultSettings: + serializedVersion: 2 + loadType: 0 + sampleRateSetting: 0 + sampleRateOverride: 44100 + compressionFormat: 1 + quality: 1 + conversionMode: 0 + preloadAudioData: 0 + platformSettingOverrides: {} + forceToMono: 0 + normalize: 1 + loadInBackground: 0 + ambisonic: 0 + 3D: 1 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Resources/Audio/SFX/AK47/ak47_reload.wav b/Assets/Resources/Audio/SFX/AK47/ak47_reload.wav new file mode 100644 index 0000000..9c117a2 --- /dev/null +++ b/Assets/Resources/Audio/SFX/AK47/ak47_reload.wav @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a0b3f12b2b4230bc2e0d025e1ed6ae302340f36111d21ac26b253d9d97cb06e0 +size 14176 diff --git a/Assets/Resources/Audio/SFX/AK47/ak47_reload.wav.meta b/Assets/Resources/Audio/SFX/AK47/ak47_reload.wav.meta new file mode 100644 index 0000000..bcb5814 --- /dev/null +++ b/Assets/Resources/Audio/SFX/AK47/ak47_reload.wav.meta @@ -0,0 +1,23 @@ +fileFormatVersion: 2 +guid: 4cd7e66d60f83bfba89826bb8918067a +AudioImporter: + externalObjects: {} + serializedVersion: 8 + defaultSettings: + serializedVersion: 2 + loadType: 0 + sampleRateSetting: 0 + sampleRateOverride: 44100 + compressionFormat: 1 + quality: 1 + conversionMode: 0 + preloadAudioData: 0 + platformSettingOverrides: {} + forceToMono: 0 + normalize: 1 + loadInBackground: 0 + ambisonic: 0 + 3D: 1 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Resources/Audio/SFX/AK47/ak47_shot.wav b/Assets/Resources/Audio/SFX/AK47/ak47_shot.wav new file mode 100644 index 0000000..bcae2a8 --- /dev/null +++ b/Assets/Resources/Audio/SFX/AK47/ak47_shot.wav @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a62cb9e8aaeea11de4d8e41fbdaff911eb86a57dd583ac8d1734d5aabff11547 +size 432020 diff --git a/Assets/Resources/Audio/SFX/AK47/ak47_shot.wav.meta b/Assets/Resources/Audio/SFX/AK47/ak47_shot.wav.meta new file mode 100644 index 0000000..bb7df7a --- /dev/null +++ b/Assets/Resources/Audio/SFX/AK47/ak47_shot.wav.meta @@ -0,0 +1,23 @@ +fileFormatVersion: 2 +guid: f7982eed87945acd2b7f8aaeac8b4410 +AudioImporter: + externalObjects: {} + serializedVersion: 8 + defaultSettings: + serializedVersion: 2 + loadType: 0 + sampleRateSetting: 0 + sampleRateOverride: 44100 + compressionFormat: 1 + quality: 1 + conversionMode: 0 + preloadAudioData: 0 + platformSettingOverrides: {} + forceToMono: 0 + normalize: 1 + loadInBackground: 0 + ambisonic: 0 + 3D: 1 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Resources/Audio/SFX/Glock.meta b/Assets/Resources/Audio/SFX/Glock.meta new file mode 100644 index 0000000..219b70e --- /dev/null +++ b/Assets/Resources/Audio/SFX/Glock.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: b56f7c795fe12d23eb45d2444ac602c5 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Resources/Audio/SFX/Glock/glock_clipout.wav b/Assets/Resources/Audio/SFX/Glock/glock_clipout.wav new file mode 100644 index 0000000..6dd743d --- /dev/null +++ b/Assets/Resources/Audio/SFX/Glock/glock_clipout.wav @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c5cf643fa381293dd9c73723abd4b36575c44b96960f62e9be68e72df4a8b0e0 +size 26616 diff --git a/Assets/Resources/Audio/SFX/Glock/glock_clipout.wav.meta b/Assets/Resources/Audio/SFX/Glock/glock_clipout.wav.meta new file mode 100644 index 0000000..a8ba4d8 --- /dev/null +++ b/Assets/Resources/Audio/SFX/Glock/glock_clipout.wav.meta @@ -0,0 +1,23 @@ +fileFormatVersion: 2 +guid: f54145915c606728e80c8b4f21e7fee2 +AudioImporter: + externalObjects: {} + serializedVersion: 8 + defaultSettings: + serializedVersion: 2 + loadType: 0 + sampleRateSetting: 0 + sampleRateOverride: 44100 + compressionFormat: 1 + quality: 1 + conversionMode: 0 + preloadAudioData: 0 + platformSettingOverrides: {} + forceToMono: 0 + normalize: 1 + loadInBackground: 0 + ambisonic: 0 + 3D: 1 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Resources/Audio/SFX/Glock/glock_reload.wav b/Assets/Resources/Audio/SFX/Glock/glock_reload.wav new file mode 100644 index 0000000..3ad2efa --- /dev/null +++ b/Assets/Resources/Audio/SFX/Glock/glock_reload.wav @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1e19d9d707f2d36880da2e305b1bd05b6424f8a03d9726f73ad4f403e804cfc4 +size 123308 diff --git a/Assets/Resources/Audio/SFX/Glock/glock_reload.wav.meta b/Assets/Resources/Audio/SFX/Glock/glock_reload.wav.meta new file mode 100644 index 0000000..25900e3 --- /dev/null +++ b/Assets/Resources/Audio/SFX/Glock/glock_reload.wav.meta @@ -0,0 +1,23 @@ +fileFormatVersion: 2 +guid: c7160a7936d12d5a7a30a579030e012c +AudioImporter: + externalObjects: {} + serializedVersion: 8 + defaultSettings: + serializedVersion: 2 + loadType: 0 + sampleRateSetting: 0 + sampleRateOverride: 44100 + compressionFormat: 1 + quality: 1 + conversionMode: 0 + preloadAudioData: 0 + platformSettingOverrides: {} + forceToMono: 0 + normalize: 1 + loadInBackground: 0 + ambisonic: 0 + 3D: 1 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Resources/Audio/SFX/Glock/glock_shot.wav b/Assets/Resources/Audio/SFX/Glock/glock_shot.wav new file mode 100644 index 0000000..77eed20 --- /dev/null +++ b/Assets/Resources/Audio/SFX/Glock/glock_shot.wav @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e930557a07eedb5945abcc30f8961274f6538aecf8b0168879c377cce4acb796 +size 337060 diff --git a/Assets/Resources/Audio/SFX/Glock/glock_shot.wav.meta b/Assets/Resources/Audio/SFX/Glock/glock_shot.wav.meta new file mode 100644 index 0000000..19a38af --- /dev/null +++ b/Assets/Resources/Audio/SFX/Glock/glock_shot.wav.meta @@ -0,0 +1,23 @@ +fileFormatVersion: 2 +guid: f82df265c24e323649097242085e3716 +AudioImporter: + externalObjects: {} + serializedVersion: 8 + defaultSettings: + serializedVersion: 2 + loadType: 0 + sampleRateSetting: 0 + sampleRateOverride: 44100 + compressionFormat: 1 + quality: 1 + conversionMode: 0 + preloadAudioData: 0 + platformSettingOverrides: {} + forceToMono: 0 + normalize: 1 + loadInBackground: 0 + ambisonic: 0 + 3D: 1 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Resources/Audio/SFX/M16A4.meta b/Assets/Resources/Audio/SFX/M16A4.meta new file mode 100644 index 0000000..df38086 --- /dev/null +++ b/Assets/Resources/Audio/SFX/M16A4.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 51a6b38acd7f034ce8c353d22dccedf2 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Resources/Audio/SFX/M16A4/m16a4_empty.wav b/Assets/Resources/Audio/SFX/M16A4/m16a4_empty.wav new file mode 100644 index 0000000..26e3531 --- /dev/null +++ b/Assets/Resources/Audio/SFX/M16A4/m16a4_empty.wav @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:abfd1b39c3f5e8e9be02eafe819b960996c0a41ee1f2cc0246736db059169313 +size 25288 diff --git a/Assets/Resources/Audio/SFX/M16A4/m16a4_empty.wav.meta b/Assets/Resources/Audio/SFX/M16A4/m16a4_empty.wav.meta new file mode 100644 index 0000000..5c381c3 --- /dev/null +++ b/Assets/Resources/Audio/SFX/M16A4/m16a4_empty.wav.meta @@ -0,0 +1,23 @@ +fileFormatVersion: 2 +guid: 4c0adc0bced2e645f89a3d7ec6dbfa47 +AudioImporter: + externalObjects: {} + serializedVersion: 8 + defaultSettings: + serializedVersion: 2 + loadType: 0 + sampleRateSetting: 0 + sampleRateOverride: 44100 + compressionFormat: 1 + quality: 1 + conversionMode: 0 + preloadAudioData: 0 + platformSettingOverrides: {} + forceToMono: 0 + normalize: 1 + loadInBackground: 0 + ambisonic: 0 + 3D: 1 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Resources/Audio/SFX/M16A4/m16a4_reload.wav b/Assets/Resources/Audio/SFX/M16A4/m16a4_reload.wav new file mode 100644 index 0000000..11c844f --- /dev/null +++ b/Assets/Resources/Audio/SFX/M16A4/m16a4_reload.wav @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f5cb2e1f9399dd2f4db255699b4ebe4d7ebea91c6699aa235c766a3bbfa072c8 +size 44144 diff --git a/Assets/Resources/Audio/SFX/M16A4/m16a4_reload.wav.meta b/Assets/Resources/Audio/SFX/M16A4/m16a4_reload.wav.meta new file mode 100644 index 0000000..d8a2e44 --- /dev/null +++ b/Assets/Resources/Audio/SFX/M16A4/m16a4_reload.wav.meta @@ -0,0 +1,23 @@ +fileFormatVersion: 2 +guid: db8f9b9ab21ad9c86a8fe76f85f733ff +AudioImporter: + externalObjects: {} + serializedVersion: 8 + defaultSettings: + serializedVersion: 2 + loadType: 0 + sampleRateSetting: 0 + sampleRateOverride: 44100 + compressionFormat: 1 + quality: 1 + conversionMode: 0 + preloadAudioData: 0 + platformSettingOverrides: {} + forceToMono: 0 + normalize: 1 + loadInBackground: 0 + ambisonic: 0 + 3D: 1 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Resources/Audio/SFX/M16A4/m16a4_shot.wav b/Assets/Resources/Audio/SFX/M16A4/m16a4_shot.wav new file mode 100644 index 0000000..29dd6bf --- /dev/null +++ b/Assets/Resources/Audio/SFX/M16A4/m16a4_shot.wav @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:80087a9b76496e38a2d2612b607892a92a4f7f9d9db50c37a2a1bebe8dbda15e +size 396944 diff --git a/Assets/Resources/Audio/SFX/M16A4/m16a4_shot.wav.meta b/Assets/Resources/Audio/SFX/M16A4/m16a4_shot.wav.meta new file mode 100644 index 0000000..5dfc5b0 --- /dev/null +++ b/Assets/Resources/Audio/SFX/M16A4/m16a4_shot.wav.meta @@ -0,0 +1,23 @@ +fileFormatVersion: 2 +guid: 31c092994e27cd8f19a1269fad37fcd9 +AudioImporter: + externalObjects: {} + serializedVersion: 8 + defaultSettings: + serializedVersion: 2 + loadType: 0 + sampleRateSetting: 0 + sampleRateOverride: 44100 + compressionFormat: 1 + quality: 1 + conversionMode: 0 + preloadAudioData: 0 + platformSettingOverrides: {} + forceToMono: 0 + normalize: 1 + loadInBackground: 0 + ambisonic: 0 + 3D: 1 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Resources/Materials/Enemy.mat b/Assets/Resources/Materials/Enemy.mat new file mode 100644 index 0000000..c98f377 --- /dev/null +++ b/Assets/Resources/Materials/Enemy.mat @@ -0,0 +1,137 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &-4431400938246330188 +MonoBehaviour: + m_ObjectHideFlags: 11 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: d0353a89b1f911e48b9e16bdc9f2e058, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.RenderPipelines.Universal.Editor::UnityEditor.Rendering.Universal.AssetVersion + version: 10 +--- !u!21 &2100000 +Material: + serializedVersion: 8 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Enemy + m_Shader: {fileID: 4800000, guid: 933532a4fcc9baf4fa0491de14d08ed7, type: 3} + m_Parent: {fileID: 0} + m_ModifiedSerializedProperties: 0 + m_ValidKeywords: [] + m_InvalidKeywords: [] + m_LightmapFlags: 4 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: + RenderType: Opaque + disabledShaderPasses: + - MOTIONVECTORS + m_LockedProperties: + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _BaseMap: + m_Texture: {fileID: 10309, guid: 0000000000000000f000000000000000, type: 0} + m_Scale: {x: 2, y: 2} + m_Offset: {x: 0, y: 0} + - _BumpMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailAlbedoMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailMask: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailNormalMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _EmissionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MainTex: + m_Texture: {fileID: 10309, guid: 0000000000000000f000000000000000, type: 0} + m_Scale: {x: 2, y: 2} + m_Offset: {x: 0, y: 0} + - _MetallicGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _OcclusionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _ParallaxMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _SpecGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - unity_Lightmaps: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - unity_LightmapsInd: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - unity_ShadowMasks: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Ints: [] + m_Floats: + - _AddPrecomputedVelocity: 0 + - _AlphaClip: 0 + - _AlphaToMask: 0 + - _Blend: 0 + - _BlendModePreserveSpecular: 1 + - _BumpScale: 1 + - _ClearCoatMask: 0 + - _ClearCoatSmoothness: 0 + - _Cull: 2 + - _Cutoff: 0.5 + - _DetailAlbedoMapScale: 1 + - _DetailNormalMapScale: 1 + - _DstBlend: 0 + - _DstBlendAlpha: 0 + - _EnvironmentReflections: 1 + - _GlossMapScale: 0 + - _Glossiness: 0 + - _GlossyReflections: 0 + - _Metallic: 0 + - _OcclusionStrength: 1 + - _Parallax: 0.005 + - _QueueOffset: 0 + - _ReceiveShadows: 1 + - _Smoothness: 0.5 + - _SmoothnessTextureChannel: 0 + - _SpecularHighlights: 1 + - _SrcBlend: 1 + - _SrcBlendAlpha: 1 + - _Surface: 0 + - _WorkflowMode: 1 + - _XRMotionVectorsPass: 1 + - _ZWrite: 1 + m_Colors: + - _BaseColor: {r: 1, g: 0, b: 0, a: 1} + - _Color: {r: 1, g: 0, b: 0, a: 1} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} + - _SpecColor: {r: 0.19999996, g: 0.19999996, b: 0.19999996, a: 1} + m_BuildTextureStacks: [] + m_AllowLocking: 1 diff --git a/Assets/Resources/Materials/Enemy.mat.meta b/Assets/Resources/Materials/Enemy.mat.meta new file mode 100644 index 0000000..53ccd37 --- /dev/null +++ b/Assets/Resources/Materials/Enemy.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 07309b4e16d5b4f5485210cc69009b55 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 2100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Resources/Materials/HealthBuff.mat b/Assets/Resources/Materials/HealthBuff.mat new file mode 100644 index 0000000..05faaa8 --- /dev/null +++ b/Assets/Resources/Materials/HealthBuff.mat @@ -0,0 +1,137 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 8 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: HealthBuff + m_Shader: {fileID: 4800000, guid: 933532a4fcc9baf4fa0491de14d08ed7, type: 3} + m_Parent: {fileID: 0} + m_ModifiedSerializedProperties: 0 + m_ValidKeywords: [] + m_InvalidKeywords: [] + m_LightmapFlags: 4 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: + RenderType: Opaque + disabledShaderPasses: + - MOTIONVECTORS + m_LockedProperties: + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _BaseMap: + m_Texture: {fileID: 10309, guid: 0000000000000000f000000000000000, type: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _BumpMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailAlbedoMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailMask: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailNormalMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _EmissionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MainTex: + m_Texture: {fileID: 10309, guid: 0000000000000000f000000000000000, type: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MetallicGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _OcclusionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _ParallaxMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _SpecGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - unity_Lightmaps: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - unity_LightmapsInd: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - unity_ShadowMasks: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Ints: [] + m_Floats: + - _AddPrecomputedVelocity: 0 + - _AlphaClip: 0 + - _AlphaToMask: 0 + - _Blend: 0 + - _BlendModePreserveSpecular: 1 + - _BumpScale: 1 + - _ClearCoatMask: 0 + - _ClearCoatSmoothness: 0 + - _Cull: 2 + - _Cutoff: 0.5 + - _DetailAlbedoMapScale: 1 + - _DetailNormalMapScale: 1 + - _DstBlend: 0 + - _DstBlendAlpha: 0 + - _EnvironmentReflections: 1 + - _GlossMapScale: 0 + - _Glossiness: 0 + - _GlossyReflections: 0 + - _Metallic: 0 + - _OcclusionStrength: 1 + - _Parallax: 0.005 + - _QueueOffset: 0 + - _ReceiveShadows: 1 + - _Smoothness: 0.5 + - _SmoothnessTextureChannel: 0 + - _SpecularHighlights: 1 + - _SrcBlend: 1 + - _SrcBlendAlpha: 1 + - _Surface: 0 + - _WorkflowMode: 1 + - _XRMotionVectorsPass: 1 + - _ZWrite: 1 + m_Colors: + - _BaseColor: {r: 0.8712342, g: 0.8867924, b: 0.56470275, a: 1} + - _Color: {r: 0.8712342, g: 0.8867924, b: 0.56470275, a: 1} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} + - _SpecColor: {r: 0.19999996, g: 0.19999996, b: 0.19999996, a: 1} + m_BuildTextureStacks: [] + m_AllowLocking: 1 +--- !u!114 &4230149012898837269 +MonoBehaviour: + m_ObjectHideFlags: 11 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: d0353a89b1f911e48b9e16bdc9f2e058, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.RenderPipelines.Universal.Editor::UnityEditor.Rendering.Universal.AssetVersion + version: 10 diff --git a/Assets/Resources/Materials/HealthBuff.mat.meta b/Assets/Resources/Materials/HealthBuff.mat.meta new file mode 100644 index 0000000..7afaa11 --- /dev/null +++ b/Assets/Resources/Materials/HealthBuff.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: b356ab723da64d6f987e9cea57a7a7d6 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 2100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Resources/Meshes/bullet.glb b/Assets/Resources/Meshes/bullet.glb new file mode 100644 index 0000000000000000000000000000000000000000..9179b71f8e9b1f6078eafa915836c8c7ed4913b7 GIT binary patch literal 28260 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