using System.Collections; using System.Collections.Generic; using UnityEngine; public class PlayerController : MonoBehaviour{ [HideInInspector] public Vector2 lastCheckpoint; public SpriteRenderer[] deathDisable; public float speed; public float airSpeed; [HideInInspector] public bool grappled; [HideInInspector] public bool ableToGrapple; [Header("Jump")] public float jumpForce; public float groundDetectionRadius; public LayerMask whatIsGround; [Space(10)] public GameObject death; public Transform gun; public Transform firePos; LineRenderer line; bool dead; bool moving; bool jump; bool isGrounded; Rigidbody2D rb2d; Shoot shoot; // Start is called before the first frame update void Start(){ AudioManager.instance.Play("Theme"); shoot = GetComponent(); rb2d = GetComponent(); line = GetComponent(); lastCheckpoint = transform.position; } // Update is called once per frame void Update(){ if (!dead){ Vector2 mousePos = Camera.main.ScreenToWorldPoint(Input.mousePosition) - transform.position; float rotZ = Mathf.Atan2(mousePos.y, mousePos.x) * Mathf.Rad2Deg; gun.transform.rotation = Quaternion.Euler(0f, 0f, rotZ); isGrounded = Physics2D.OverlapCircle(transform.position, groundDetectionRadius, whatIsGround); if (Input.GetKeyDown(KeyCode.Space) && isGrounded) jump = true; } } void LateUpdate(){ line.SetPosition(0, firePos.position); } private void OnDrawGizmosSelected(){ Gizmos.DrawWireSphere(transform.position, groundDetectionRadius); } void FixedUpdate(){ if (!dead){ if (!moving && isGrounded){ float fixedVelocity = rb2d.angularVelocity; fixedVelocity *= .98f; rb2d.angularVelocity = fixedVelocity; } float h = Input.GetAxisRaw("Horizontal"); if (h != 0){ moving = true; }else{ moving = false; } if (isGrounded && !grappled){ rb2d.AddForce(Vector2.right * speed * h); float limitedSpeed = Mathf.Clamp(rb2d.velocity.x, -speed, speed); rb2d.velocity = new Vector2(limitedSpeed, rb2d.velocity.y); }else if (!grappled){ rb2d.AddForce(Vector2.right * airSpeed * h); float limitedSpeed = Mathf.Clamp(rb2d.velocity.x, -airSpeed, airSpeed); rb2d.velocity = new Vector2(limitedSpeed, rb2d.velocity.y); } if (Input.GetMouseButton(0) && !ableToGrapple){ shoot.Fire(); } if (jump){ rb2d.velocity = new Vector2(rb2d.velocity.x, 0); rb2d.AddForce(Vector2.up * jumpForce, ForceMode2D.Impulse); jump = false; } } } void OnParticleCollision(GameObject col){ Instantiate(death, transform.position, Quaternion.identity); Die(); } void OnCollisionEnter2D(Collision2D col){ if(col.gameObject.tag == "Death"){ Instantiate(death, transform.position, Quaternion.identity); Die(); } } void Die(){ foreach(SpriteRenderer s in deathDisable){ s.enabled = false; } GetComponent().isTrigger = true; Invoke("Respawn", 2f); dead = true; rb2d.bodyType = RigidbodyType2D.Static; } void Respawn(){ transform.position = lastCheckpoint; foreach (SpriteRenderer s in deathDisable){ s.enabled = true; } GetComponent().isTrigger = false; rb2d.bodyType = RigidbodyType2D.Dynamic; rb2d.velocity = Vector2.zero; dead = false; } }