From 7c5cab538816c3e9ca01e71cef26f8ec5478c609 Mon Sep 17 00:00:00 2001 From: hanifmz07 <13521157@std.stei.itb.ac.id> Date: Sat, 11 May 2024 14:01:17 +0700 Subject: [PATCH] refactor: refactor speed and damage behaviour --- .../Assets/Code/Scripts/BaseBehaviour.cs | 16 +++++ .../Assets/Code/Scripts/BaseBehaviour.cs.meta | 11 ++++ .../Code/Scripts/BaseWeaponController.cs | 15 +++++ .../Code/Scripts/BaseWeaponController.cs.meta | 11 ++++ .../Assets/Code/Scripts/FPSController.cs | 15 +++-- .../Assets/Code/Scripts/Gun/GunSystem.cs | 10 +-- .../Code/Scripts/Gun/ShortWeaponController.cs | 7 +- .../Code/Scripts/Gun/SwordController.cs | 7 +- .../Assets/Code/Scripts/Mobs/KingBehaviour.cs | 64 ++++++++++++++++--- .../Code/Scripts/Pet/PetAttackerBehaviour.cs | 7 +- .../Code/Scripts/Pet/PetFollowerBehaviour.cs | 7 +- .../Assets/Level/Scenes/TestJup3.unity | 25 +++++++- 12 files changed, 164 insertions(+), 31 deletions(-) create mode 100644 IF3210-2024-Unity-AFK/Assets/Code/Scripts/BaseBehaviour.cs create mode 100644 IF3210-2024-Unity-AFK/Assets/Code/Scripts/BaseBehaviour.cs.meta create mode 100644 IF3210-2024-Unity-AFK/Assets/Code/Scripts/BaseWeaponController.cs create mode 100644 IF3210-2024-Unity-AFK/Assets/Code/Scripts/BaseWeaponController.cs.meta diff --git a/IF3210-2024-Unity-AFK/Assets/Code/Scripts/BaseBehaviour.cs b/IF3210-2024-Unity-AFK/Assets/Code/Scripts/BaseBehaviour.cs new file mode 100644 index 00000000..a925c788 --- /dev/null +++ b/IF3210-2024-Unity-AFK/Assets/Code/Scripts/BaseBehaviour.cs @@ -0,0 +1,16 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +public class BaseBehaviour : MonoBehaviour +{ + + protected bool isSpeedCrippled; + protected float speedCrippleMultiplier; + + public void adjustCripplingSpeed(bool isCrippled, float speedMultiplier) + { + isSpeedCrippled = isCrippled; + speedCrippleMultiplier = speedMultiplier; + } +} diff --git a/IF3210-2024-Unity-AFK/Assets/Code/Scripts/BaseBehaviour.cs.meta b/IF3210-2024-Unity-AFK/Assets/Code/Scripts/BaseBehaviour.cs.meta new file mode 100644 index 00000000..232dc214 --- /dev/null +++ b/IF3210-2024-Unity-AFK/Assets/Code/Scripts/BaseBehaviour.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 70238c8911501ff41b6e55d55907f8b0 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/IF3210-2024-Unity-AFK/Assets/Code/Scripts/BaseWeaponController.cs b/IF3210-2024-Unity-AFK/Assets/Code/Scripts/BaseWeaponController.cs new file mode 100644 index 00000000..1992932c --- /dev/null +++ b/IF3210-2024-Unity-AFK/Assets/Code/Scripts/BaseWeaponController.cs @@ -0,0 +1,15 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +public class BaseWeaponController : MonoBehaviour +{ + protected bool isDamageCrippled; + protected float damageCrippledMultiplier; + + public void adjustCripplingDamage(bool isCrippled, float damageMultiplier) + { + isDamageCrippled = isCrippled; + damageCrippledMultiplier = damageMultiplier; + } +} diff --git a/IF3210-2024-Unity-AFK/Assets/Code/Scripts/BaseWeaponController.cs.meta b/IF3210-2024-Unity-AFK/Assets/Code/Scripts/BaseWeaponController.cs.meta new file mode 100644 index 00000000..f8486a18 --- /dev/null +++ b/IF3210-2024-Unity-AFK/Assets/Code/Scripts/BaseWeaponController.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 2a07891f144b83641b2ab05039edc900 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/IF3210-2024-Unity-AFK/Assets/Code/Scripts/FPSController.cs b/IF3210-2024-Unity-AFK/Assets/Code/Scripts/FPSController.cs index 47832d30..95deac67 100644 --- a/IF3210-2024-Unity-AFK/Assets/Code/Scripts/FPSController.cs +++ b/IF3210-2024-Unity-AFK/Assets/Code/Scripts/FPSController.cs @@ -4,7 +4,7 @@ using UnityEngine; using UnityEngine.InputSystem; [RequireComponent(typeof(CharacterController))] -public class FPSController : MonoBehaviour +public class FPSController : BaseBehaviour { public Camera playerCamera; public float walkSpeed = 6f; @@ -13,6 +13,8 @@ public class FPSController : MonoBehaviour public float gravity = 10f; public int money = 1000000; // change (if needed) + private float finalWalkSpeed, finalRunSpeed; + public float lookSpeed = 2f; public float lookXLimit = 45f; @@ -66,10 +68,6 @@ public class FPSController : MonoBehaviour HandleMovement(); HandleRotation(); - //if (Input.GetKeyDown(KeyCode.P)) - // GameObject.Find("Controller").GetComponent<PetController>().AddPetHeal(); - //if (Input.GetKeyDown(KeyCode.L)) - // GameObject.Find("Controller").GetComponent<PetController>().AddPetAttack(); } private void OnEnable() @@ -99,9 +97,12 @@ public class FPSController : MonoBehaviour Vector3 forward = transform.TransformDirection(Vector3.forward); Vector3 right = transform.TransformDirection(Vector3.right); + finalRunSpeed = base.isSpeedCrippled ? runSpeed * base.speedCrippleMultiplier : runSpeed; + finalWalkSpeed = base.isSpeedCrippled ? walkSpeed * base.speedCrippleMultiplier : walkSpeed; + bool isRunning = Input.GetKey(KeyCode.LeftShift); - float curSpeedX = canMove ? (isRunning ? runSpeed : walkSpeed) * Input.GetAxis("Vertical") : 0; - float curSpeedY = canMove ? (isRunning ? runSpeed : walkSpeed) * Input.GetAxis("Horizontal") : 0; + float curSpeedX = canMove ? (isRunning ? finalRunSpeed : finalWalkSpeed) * Input.GetAxis("Vertical") : 0; + float curSpeedY = canMove ? (isRunning ? finalRunSpeed : finalWalkSpeed) * Input.GetAxis("Horizontal") : 0; float movementDirectionY = moveDirection.y; moveDirection = (forward * curSpeedX) + (right * curSpeedY); diff --git a/IF3210-2024-Unity-AFK/Assets/Code/Scripts/Gun/GunSystem.cs b/IF3210-2024-Unity-AFK/Assets/Code/Scripts/Gun/GunSystem.cs index 747a6d32..1e41dd70 100644 --- a/IF3210-2024-Unity-AFK/Assets/Code/Scripts/Gun/GunSystem.cs +++ b/IF3210-2024-Unity-AFK/Assets/Code/Scripts/Gun/GunSystem.cs @@ -3,13 +3,14 @@ using System.Collections; using UnityEngine; using TMPro; -public class GunSystem : MonoBehaviour +public class GunSystem : BaseWeaponController { // Gun Stats public float timeBetweenShooting, spread, range, reloadTime, timeBetweenShots; public bool allowButtonHold, ShootingMultipleAtOnce; public int magazineSize, bulletsPerTap, baseDamage, damage; + private int finalDamage; int bulletsLeft, bulletsShot; bool shooting, readyToShoot, reloading; @@ -59,6 +60,7 @@ public class GunSystem : MonoBehaviour private void Update() { + finalDamage = base.isDamageCrippled ? (int) (damage * base.damageCrippledMultiplier) : damage; if (IsGamePaused) return; UserInput(); @@ -78,7 +80,7 @@ public class GunSystem : MonoBehaviour Shoot(); } - if (bulletsLeft <= 0 && shooting && !reloading) + if (bulletsLeft <= 0 && shooting && !reloading) ; PlayOutOfAmmo(); } @@ -127,7 +129,7 @@ public class GunSystem : MonoBehaviour int enemyLayer = 8; if (rayhit.collider.gameObject.layer == enemyLayer) { - rayhit.collider.GetComponent<CombatBehavior>().TakeDamage(damage); + rayhit.collider.GetComponent<CombatBehavior>().TakeDamage(finalDamage); Instantiate(enemyEffect, rayhit.point, Quaternion.Euler(0, 180, 0)); hit = true; } @@ -152,9 +154,9 @@ public class GunSystem : MonoBehaviour hit = false; } PlayShootSound(); + Invoke("ResetShot", timeBetweenShooting); } - Invoke("ResetShot", timeBetweenShooting); if (bulletsShot > 0 && bulletsLeft > 0) Invoke("Shoot", timeBetweenShots); diff --git a/IF3210-2024-Unity-AFK/Assets/Code/Scripts/Gun/ShortWeaponController.cs b/IF3210-2024-Unity-AFK/Assets/Code/Scripts/Gun/ShortWeaponController.cs index b688bb00..a464c4c6 100644 --- a/IF3210-2024-Unity-AFK/Assets/Code/Scripts/Gun/ShortWeaponController.cs +++ b/IF3210-2024-Unity-AFK/Assets/Code/Scripts/Gun/ShortWeaponController.cs @@ -2,7 +2,7 @@ using System.Collections; using System.Collections.Generic; using UnityEngine; -public class ShortWeaponController : MonoBehaviour +public class ShortWeaponController : BaseWeaponController { private float weaponLength; public int baseDamage; @@ -27,6 +27,9 @@ public class ShortWeaponController : MonoBehaviour // Update is called once per frame void Update() { + + int FinalWeaponDamage = base.isDamageCrippled ? (int) (WeaponDamage * base.damageCrippledMultiplier) : WeaponDamage; + if (!canAttack) { cooldownTimer += Time.deltaTime; @@ -72,7 +75,7 @@ public class ShortWeaponController : MonoBehaviour { canAttack = false; Debug.Log("hitt"); - targetCombatBehavior.TakeDamage(WeaponDamage); + targetCombatBehavior.TakeDamage(FinalWeaponDamage); Debug.Log("target health: " + targetCombatBehavior.health); } } diff --git a/IF3210-2024-Unity-AFK/Assets/Code/Scripts/Gun/SwordController.cs b/IF3210-2024-Unity-AFK/Assets/Code/Scripts/Gun/SwordController.cs index b4d99db5..68b784c5 100644 --- a/IF3210-2024-Unity-AFK/Assets/Code/Scripts/Gun/SwordController.cs +++ b/IF3210-2024-Unity-AFK/Assets/Code/Scripts/Gun/SwordController.cs @@ -3,7 +3,7 @@ using System.Collections.Generic; using JetBrains.Annotations; using UnityEngine; -public class SwordController : MonoBehaviour +public class SwordController : BaseWeaponController { [SerializeField] private float cooldown = 0.5f; @@ -18,10 +18,13 @@ public class SwordController : MonoBehaviour public int damage; + private int finalDamage; + private bool canAttack = true; void Update() { + finalDamage = base.isDamageCrippled? (int) (damage * base.damageCrippledMultiplier) : damage; if (Input.GetMouseButton(0)) { if (canAttack) @@ -57,7 +60,7 @@ public class SwordController : MonoBehaviour if (rayhit.collider.gameObject.layer == enemyLayer) { GameObject enemy = rayhit.collider.gameObject; - enemy.GetComponent<CombatBehavior>().TakeDamage(damage); + enemy.GetComponent<CombatBehavior>().TakeDamage(finalDamage); Debug.Log("Sword hit enemy"); } } diff --git a/IF3210-2024-Unity-AFK/Assets/Code/Scripts/Mobs/KingBehaviour.cs b/IF3210-2024-Unity-AFK/Assets/Code/Scripts/Mobs/KingBehaviour.cs index cce4225e..6ffebac4 100644 --- a/IF3210-2024-Unity-AFK/Assets/Code/Scripts/Mobs/KingBehaviour.cs +++ b/IF3210-2024-Unity-AFK/Assets/Code/Scripts/Mobs/KingBehaviour.cs @@ -23,9 +23,11 @@ public class KingBehaviour : MonoBehaviour public float speed = 1.0f; public float spawnKerocoCooldown = 15.0f; + public GameObject[] playerWeapons; + private float crippleCooldownTimer = 0f; public float crippleCooldownDuration = 1f; - private bool isCrippleActive = true; + private bool isCrippleDamageActive = true; private GameObject enemyController; CharacterController movementController; @@ -50,6 +52,7 @@ public class KingBehaviour : MonoBehaviour void Update() { Collider[] hitCollidersArea = Physics.OverlapSphere(transform.position, attackArea, targetLayer); + Collider[] hitCrippleArea = Physics.OverlapSphere(transform.position, crippleAttackRange, targetLayer); if (hitCollidersArea.Length > 0) { // Chase the enemy and attack @@ -65,25 +68,70 @@ public class KingBehaviour : MonoBehaviour timer(); - Collider[] hitCrippleArea = Physics.OverlapSphere(transform.position, crippleAttackRange, targetLayer); - if (isCrippleActive) + if (isCrippleDamageActive) { - isCrippleActive = false; + isCrippleDamageActive = false; crippleCooldownTimer = 0f; for (int i = 0; i < hitCrippleArea.Length; i++) { if (!hitCrippleArea[i].GetComponent<CombatBehavior>()) { - if (!hitCrippleArea[i].GetComponent<CombatBehavior>()) + hitCrippleArea[i].GetComponent<CombatBehavior>().TakeDamage(crippleDamage); + } + } + } + + // Check cripple area + GameObject[] players = GameObject.FindGameObjectsWithTag("Player"); + + foreach (GameObject player in players) + { + Debug.Log(player.name); + float distance = Vector3.Distance(transform.position, player.transform.position); + if (distance <= crippleAttackRange) + { + + // Cripple Speed + if (player.GetComponent<BaseBehaviour>()) + { + player.GetComponent<BaseBehaviour>().adjustCripplingSpeed(true, slownessMultiplier); + } + + // Cripple Attack Power + if (player.Equals(MainPlayer)) + { + foreach (GameObject weapon in playerWeapons) { - continue; + weapon.GetComponent<BaseWeaponController>().adjustCripplingDamage(true, weaknessMultiplier); + } + + } + + } + else + { + + // Cripple Speed + if (player.GetComponent<BaseBehaviour>()) + { + player.GetComponent<BaseBehaviour>().adjustCripplingSpeed(false, 1.0f); + } + + // Cripple Attack Power + if (player.Equals(MainPlayer)) + { + + foreach (GameObject weapon in playerWeapons) + { + weapon.GetComponent<BaseWeaponController>().adjustCripplingDamage(false, 1.0f); } - hitCrippleArea[i].GetComponent<CombatBehavior>().TakeDamage(crippleDamage); } } } + + ReloadAnimation(); } @@ -168,7 +216,7 @@ public class KingBehaviour : MonoBehaviour crippleCooldownTimer += Time.deltaTime; if (crippleCooldownTimer >= crippleCooldownDuration) { - isCrippleActive = true; + isCrippleDamageActive = true; } } diff --git a/IF3210-2024-Unity-AFK/Assets/Code/Scripts/Pet/PetAttackerBehaviour.cs b/IF3210-2024-Unity-AFK/Assets/Code/Scripts/Pet/PetAttackerBehaviour.cs index 0a99fe4e..151e9238 100644 --- a/IF3210-2024-Unity-AFK/Assets/Code/Scripts/Pet/PetAttackerBehaviour.cs +++ b/IF3210-2024-Unity-AFK/Assets/Code/Scripts/Pet/PetAttackerBehaviour.cs @@ -3,13 +3,14 @@ using System.Collections.Generic; using UnityEngine; using UnityEngine.AI; -public class PetAttackerBehaviour : MonoBehaviour +public class PetAttackerBehaviour : BaseBehaviour { public Transform owner; public Transform mouth; public float attackDistance = 1.5f; // Distance at which the pet will attack enemies public float attackArea = 10f; // Area in which the pet will chase enemies to attack private float speed; + public LayerMask enemyLayer; private NavMeshAgent agent; @@ -37,7 +38,7 @@ public class PetAttackerBehaviour : MonoBehaviour if (distanceToOwner > attackArea) { agent.SetDestination(owner.position); - agent.speed = speed; + agent.speed = isSpeedCrippled ? speed * speedCrippleMultiplier : speed; petAnimator.SetBool(moveAnimation, true); petAnimator.SetBool(idleAnimation, false); petAnimator.SetBool(attackAnimation, false); @@ -52,7 +53,7 @@ public class PetAttackerBehaviour : MonoBehaviour { // Move towards the enemy agent.SetDestination(hitCollidersArea[0].transform.position); - agent.speed = speed; + agent.speed = isSpeedCrippled ? speed * speedCrippleMultiplier : speed; petAnimator.SetBool(moveAnimation, true); petAnimator.SetBool(idleAnimation, false); petAnimator.SetBool(attackAnimation, false); diff --git a/IF3210-2024-Unity-AFK/Assets/Code/Scripts/Pet/PetFollowerBehaviour.cs b/IF3210-2024-Unity-AFK/Assets/Code/Scripts/Pet/PetFollowerBehaviour.cs index 4f571756..8800e708 100644 --- a/IF3210-2024-Unity-AFK/Assets/Code/Scripts/Pet/PetFollowerBehaviour.cs +++ b/IF3210-2024-Unity-AFK/Assets/Code/Scripts/Pet/PetFollowerBehaviour.cs @@ -2,7 +2,7 @@ using System.Collections.Generic; using UnityEngine; using UnityEngine.AI; -public class PetFollowerBehaviour : MonoBehaviour { +public class PetFollowerBehaviour : BaseBehaviour { public Transform target; public float distanceToStop = 2f; protected float speed; @@ -20,8 +20,9 @@ public class PetFollowerBehaviour : MonoBehaviour { protected virtual void Update() { - // set the speed and destination - agent.speed = speed; + // set the speed and destination + agent.speed = base.isSpeedCrippled ? speed * base.speedCrippleMultiplier : speed; + agent.SetDestination(target.position); float distanceToTarget = Vector3.Distance(transform.position, target.position); diff --git a/IF3210-2024-Unity-AFK/Assets/Level/Scenes/TestJup3.unity b/IF3210-2024-Unity-AFK/Assets/Level/Scenes/TestJup3.unity index cf9b01b4..dd29d2c3 100644 --- a/IF3210-2024-Unity-AFK/Assets/Level/Scenes/TestJup3.unity +++ b/IF3210-2024-Unity-AFK/Assets/Level/Scenes/TestJup3.unity @@ -6460,8 +6460,24 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 348045508547534544, guid: c98aeaa500ff50d48ac11ae3f232869a, type: 3} propertyPath: spawnKerocoCooldown - value: 300 + value: 1000 objectReference: {fileID: 0} + - target: {fileID: 348045508547534544, guid: c98aeaa500ff50d48ac11ae3f232869a, type: 3} + propertyPath: playerWeapons.Array.size + value: 3 + objectReference: {fileID: 0} + - target: {fileID: 348045508547534544, guid: c98aeaa500ff50d48ac11ae3f232869a, type: 3} + propertyPath: playerWeapons.Array.data[0] + value: + objectReference: {fileID: 236008272} + - target: {fileID: 348045508547534544, guid: c98aeaa500ff50d48ac11ae3f232869a, type: 3} + propertyPath: playerWeapons.Array.data[1] + value: + objectReference: {fileID: 705761236} + - target: {fileID: 348045508547534544, guid: c98aeaa500ff50d48ac11ae3f232869a, type: 3} + propertyPath: playerWeapons.Array.data[2] + value: + objectReference: {fileID: 8450388614318271695} - target: {fileID: 356863305189137741, guid: c98aeaa500ff50d48ac11ae3f232869a, type: 3} propertyPath: m_Layer value: 8 @@ -16532,6 +16548,10 @@ PrefabInstance: serializedVersion: 3 m_TransformParent: {fileID: 0} m_Modifications: + - target: {fileID: 1811799765733253915, guid: 190a7c8932647e14eaf2c5935c71bca7, type: 3} + propertyPath: m_TagString + value: Weapon + objectReference: {fileID: 0} - target: {fileID: 2241956317736864890, guid: 190a7c8932647e14eaf2c5935c71bca7, type: 3} propertyPath: owner value: @@ -17414,7 +17434,8 @@ PrefabInstance: value: objectReference: {fileID: 294113754} m_RemovedComponents: [] - m_RemovedGameObjects: [] + m_RemovedGameObjects: + - {fileID: 2535268216919818447, guid: 96674196a45debf4ba0a3fada63f2b22, type: 3} m_AddedGameObjects: [] m_AddedComponents: - targetCorrespondingSourceObject: {fileID: 3639945069243096317, guid: 96674196a45debf4ba0a3fada63f2b22, type: 3} -- GitLab