diff options
Diffstat (limited to 'Assets/Samples/Input System/1.14.0/Simple Demo/SimpleController_UsingActionAsset.cs')
-rw-r--r-- | Assets/Samples/Input System/1.14.0/Simple Demo/SimpleController_UsingActionAsset.cs | 117 |
1 files changed, 117 insertions, 0 deletions
diff --git a/Assets/Samples/Input System/1.14.0/Simple Demo/SimpleController_UsingActionAsset.cs b/Assets/Samples/Input System/1.14.0/Simple Demo/SimpleController_UsingActionAsset.cs new file mode 100644 index 0000000..4e2da50 --- /dev/null +++ b/Assets/Samples/Input System/1.14.0/Simple Demo/SimpleController_UsingActionAsset.cs @@ -0,0 +1,117 @@ +using System.Collections; +using UnityEngine; +using UnityEngine.InputSystem.Interactions; + +// Use action set asset instead of lose InputActions directly on component. +public class SimpleController_UsingActionAsset : MonoBehaviour +{ + public float moveSpeed; + public float rotateSpeed; + public float burstSpeed; + public GameObject projectile; + + private SimpleControls m_Controls; + private bool m_Charging; + private Vector2 m_Rotation; + + public void Awake() + { + m_Controls = new SimpleControls(); + + m_Controls.gameplay.fire.performed += + ctx => + { + if (ctx.interaction is SlowTapInteraction) + { + StartCoroutine(BurstFire((int)(ctx.duration * burstSpeed))); + } + else + { + Fire(); + } + m_Charging = false; + }; + m_Controls.gameplay.fire.started += + ctx => + { + if (ctx.interaction is SlowTapInteraction) + m_Charging = true; + }; + m_Controls.gameplay.fire.canceled += + ctx => + { + m_Charging = false; + }; + } + + public void OnEnable() + { + m_Controls.Enable(); + } + + public void OnDisable() + { + m_Controls.Disable(); + } + + public void OnGUI() + { + if (m_Charging) + GUI.Label(new Rect(100, 100, 200, 100), "Charging..."); + } + + public void Update() + { + var look = m_Controls.gameplay.look.ReadValue<Vector2>(); + var move = m_Controls.gameplay.move.ReadValue<Vector2>(); + + // Update orientation first, then move. Otherwise move orientation will lag + // behind by one frame. + Look(look); + Move(move); + } + + private void Move(Vector2 direction) + { + if (direction.sqrMagnitude < 0.01) + return; + var scaledMoveSpeed = moveSpeed * Time.deltaTime; + // For simplicity's sake, we just keep movement in a single plane here. Rotate + // direction according to world Y rotation of player. + var move = Quaternion.Euler(0, transform.eulerAngles.y, 0) * new Vector3(direction.x, 0, direction.y); + transform.position += move * scaledMoveSpeed; + } + + private void Look(Vector2 rotate) + { + if (rotate.sqrMagnitude < 0.01) + return; + var scaledRotateSpeed = rotateSpeed * Time.deltaTime; + m_Rotation.y += rotate.x * scaledRotateSpeed; + m_Rotation.x = Mathf.Clamp(m_Rotation.x - rotate.y * scaledRotateSpeed, -89, 89); + transform.localEulerAngles = m_Rotation; + } + + private IEnumerator BurstFire(int burstAmount) + { + for (var i = 0; i < burstAmount; ++i) + { + Fire(); + yield return new WaitForSeconds(0.1f); + } + } + + private void Fire() + { + var transform = this.transform; + var newProjectile = Instantiate(projectile); + newProjectile.transform.position = transform.position + transform.forward * 0.6f; + newProjectile.transform.rotation = transform.rotation; + const int size = 1; + newProjectile.transform.localScale *= size; + newProjectile.GetComponent<Rigidbody>().mass = Mathf.Pow(size, 3); + newProjectile.GetComponent<Rigidbody>().AddForce(transform.forward * 20f, ForceMode.Impulse); + newProjectile.GetComponent<MeshRenderer>().material.color = + new Color(Random.value, Random.value, Random.value, 1.0f); + } +} |