slimecing

a fighting game featuring slimes and swords
Log | Files | Refs | README

SimpleController_UsingPlayerInput.cs (3561B)


      1 using System.Collections;
      2 using UnityEngine;
      3 using UnityEngine.InputSystem;
      4 using UnityEngine.InputSystem.Interactions;
      5 
      6 // Use a separate PlayerInput component for setting up input.
      7 public class SimpleController_UsingPlayerInput : MonoBehaviour
      8 {
      9     public float moveSpeed;
     10     public float rotateSpeed;
     11     public float burstSpeed;
     12     public GameObject projectile;
     13 
     14     private bool m_Charging;
     15     private Vector2 m_Rotation;
     16     private Vector2 m_Look;
     17     private Vector2 m_Move;
     18 
     19     public void OnMove(InputAction.CallbackContext context)
     20     {
     21         m_Move = context.ReadValue<Vector2>();
     22     }
     23 
     24     public void OnLook(InputAction.CallbackContext context)
     25     {
     26         m_Look = context.ReadValue<Vector2>();
     27     }
     28 
     29     public void OnFire(InputAction.CallbackContext context)
     30     {
     31         switch (context.phase)
     32         {
     33             case InputActionPhase.Performed:
     34                 if (context.interaction is SlowTapInteraction)
     35                 {
     36                     StartCoroutine(BurstFire((int)(context.duration * burstSpeed)));
     37                 }
     38                 else
     39                 {
     40                     Fire();
     41                 }
     42                 m_Charging = false;
     43                 break;
     44 
     45             case InputActionPhase.Started:
     46                 if (context.interaction is SlowTapInteraction)
     47                     m_Charging = true;
     48                 break;
     49 
     50             case InputActionPhase.Canceled:
     51                 m_Charging = false;
     52                 break;
     53         }
     54     }
     55 
     56     public void OnGUI()
     57     {
     58         if (m_Charging)
     59             GUI.Label(new Rect(100, 100, 200, 100), "Charging...");
     60     }
     61 
     62     public void Update()
     63     {
     64         // Update orientation first, then move. Otherwise move orientation will lag
     65         // behind by one frame.
     66         Look(m_Look);
     67         Move(m_Move);
     68     }
     69 
     70     private void Move(Vector2 direction)
     71     {
     72         if (direction.sqrMagnitude < 0.01)
     73             return;
     74         var scaledMoveSpeed = moveSpeed * Time.deltaTime;
     75         // For simplicity's sake, we just keep movement in a single plane here. Rotate
     76         // direction according to world Y rotation of player.
     77         var move = Quaternion.Euler(0, transform.eulerAngles.y, 0) * new Vector3(direction.x, 0, direction.y);
     78         transform.position += move * scaledMoveSpeed;
     79     }
     80 
     81     private void Look(Vector2 rotate)
     82     {
     83         if (rotate.sqrMagnitude < 0.01)
     84             return;
     85         var scaledRotateSpeed = rotateSpeed * Time.deltaTime;
     86         m_Rotation.y += rotate.x * scaledRotateSpeed;
     87         m_Rotation.x = Mathf.Clamp(m_Rotation.x - rotate.y * scaledRotateSpeed, -89, 89);
     88         transform.localEulerAngles = m_Rotation;
     89     }
     90 
     91     private IEnumerator BurstFire(int burstAmount)
     92     {
     93         for (var i = 0; i < burstAmount; ++i)
     94         {
     95             Fire();
     96             yield return new WaitForSeconds(0.1f);
     97         }
     98     }
     99 
    100     private void Fire()
    101     {
    102         var transform = this.transform;
    103         var newProjectile = Instantiate(projectile);
    104         newProjectile.transform.position = transform.position + transform.forward * 0.6f;
    105         newProjectile.transform.rotation = transform.rotation;
    106         const int size = 1;
    107         newProjectile.transform.localScale *= size;
    108         newProjectile.GetComponent<Rigidbody>().mass = Mathf.Pow(size, 3);
    109         newProjectile.GetComponent<Rigidbody>().AddForce(transform.forward * 20f, ForceMode.Impulse);
    110         newProjectile.GetComponent<MeshRenderer>().material.color =
    111             new Color(Random.value, Random.value, Random.value, 1.0f);
    112     }
    113 }