using UnityEngine; using System.Collections; using UnityEngine.UI; #if UNITY_EDITOR using UnityEditor; #endif public class PlayerController : MonoBehaviour { [Header("Keybinds")] public KeyCode forwardKey = KeyCode.W; public KeyCode backwardKey = KeyCode.S; public KeyCode leftKey = KeyCode.A; public KeyCode rightKey = KeyCode.D; [Header("Speed")] public float speed = 5; public float curSpeed = 0f; public bool canMove = true; [Header("Dash")] public float dashSpeed = 10; public float dashDuration = 0.3f; // Dash duration public float dashCooldown = 2f; public KeyCode dashKey = KeyCode.LeftShift; public bool canDash = true; public float dashCooldownTimer = 0f; public ParticleSystem particleSystem; public Transform particleTransform; [Header("Lives")] public string enemyTag = "Enemy"; public float invulnerabilityTimeSeconds = 0.25f; public int lives = 3; public ParticleSystem bloodParticleSystem; [Header("Audio")] public AudioSource metalPipe; [Header("Player Object")] public Rigidbody rb; private float lastHit = 0f; void Start() { if (!TryGetComponent(out rb)) { Debug.LogError("Rigidbody not found!"); enabled = false; // Disable script if Rigidbody is missing. } else { rb.freezeRotation = true; } } void Update() { curSpeed = speed; Vector3 moveDirection = GetPlayerDirection().normalized; if (Input.GetKey(dashKey) && canDash) { StartCoroutine(Dash()); } else if (canMove) { rb.velocity = new Vector3( moveDirection.x * curSpeed, rb.velocity.y, moveDirection.z * curSpeed ); } } IEnumerator Dash() { canMove = false; canDash = false; Vector3 dashDirection = GetPlayerDirection().normalized; rb.velocity = dashDirection * dashSpeed; particleSystem.Play(); particleTransform.SetLocalPositionAndRotation(dashDirection * -1.5f, particleTransform.localRotation); yield return new WaitForSeconds(dashDuration); particleSystem.Stop(); rb.velocity = Vector3.zero; canMove = true; yield return new WaitForSeconds(dashCooldown); canDash = true; } Vector3 GetPlayerDirection() { float horizontal = 0f; float vertical = 0f; if (Input.GetKey(rightKey)) horizontal += 1f; if (Input.GetKey(leftKey)) horizontal -= 1f; if (Input.GetKey(forwardKey)) vertical += 1f; if (Input.GetKey(backwardKey)) vertical -= 1f; return new Vector3(horizontal, 0, vertical); } void OnCollisionEnter(Collision collision) { bool collidedWithEnemy = collision.gameObject.CompareTag(enemyTag); bool isInvulnerable = invulnerabilityTimeSeconds >= Time.time - lastHit; if (collidedWithEnemy && !isInvulnerable) { HandlePlayerHit(); } } void HandlePlayerHit() { lives--; if (lives <= 0) { ExitGame(); } bloodParticleSystem.Play(); lastHit = Time.time; metalPipe.Play(); // Play damage sound effect // Update visual feedback (if any) for losing a life, e.g. hearts } void ExitGame() { #if UNITY_EDITOR EditorApplication.ExitPlaymode(); #endif Application.Quit(); } }