UI 자동화를 위해 바인딩 기능 구현
- 유니티 에셋 인증 오류로 meta 재생성
This commit is contained in:
@@ -0,0 +1,128 @@
|
||||
using System.Collections;
|
||||
using UnityEngine.InputSystem;
|
||||
using UnityEngine;
|
||||
using UnityEngine.InputSystem.Interactions;
|
||||
|
||||
// Using simple actions with callbacks.
|
||||
public class SimpleController_UsingActions : MonoBehaviour
|
||||
{
|
||||
public float moveSpeed;
|
||||
public float rotateSpeed;
|
||||
public float burstSpeed;
|
||||
public GameObject projectile;
|
||||
|
||||
public InputAction moveAction;
|
||||
public InputAction lookAction;
|
||||
public InputAction fireAction;
|
||||
|
||||
private bool m_Charging;
|
||||
|
||||
private Vector2 m_Rotation;
|
||||
|
||||
public void Awake()
|
||||
{
|
||||
// We could use `fireAction.triggered` in Update() but that makes it more difficult to
|
||||
// implement the charging mechanism. So instead we use the `started`, `performed`, and
|
||||
// `canceled` callbacks to run the firing logic right from within the action.
|
||||
|
||||
fireAction.performed +=
|
||||
ctx =>
|
||||
{
|
||||
if (ctx.interaction is SlowTapInteraction)
|
||||
{
|
||||
StartCoroutine(BurstFire((int)(ctx.duration * burstSpeed)));
|
||||
}
|
||||
else
|
||||
{
|
||||
Fire();
|
||||
}
|
||||
m_Charging = false;
|
||||
};
|
||||
fireAction.started +=
|
||||
ctx =>
|
||||
{
|
||||
if (ctx.interaction is SlowTapInteraction)
|
||||
m_Charging = true;
|
||||
};
|
||||
fireAction.canceled +=
|
||||
ctx =>
|
||||
{
|
||||
m_Charging = false;
|
||||
};
|
||||
}
|
||||
|
||||
public void OnEnable()
|
||||
{
|
||||
moveAction.Enable();
|
||||
lookAction.Enable();
|
||||
fireAction.Enable();
|
||||
}
|
||||
|
||||
public void OnDisable()
|
||||
{
|
||||
moveAction.Disable();
|
||||
lookAction.Disable();
|
||||
fireAction.Disable();
|
||||
}
|
||||
|
||||
public void OnGUI()
|
||||
{
|
||||
if (m_Charging)
|
||||
GUI.Label(new Rect(100, 100, 200, 100), "Charging...");
|
||||
}
|
||||
|
||||
public void Update()
|
||||
{
|
||||
var look = lookAction.ReadValue<Vector2>();
|
||||
var move = moveAction.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;
|
||||
var 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);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user