public class TopDownController : MonoBehaviour
{
public event Action<Vector2> OnMoveEvent;
public event Action<Vector2> OnLookEvent;
// 키보드를 움직일 때의 발생하는 이벤트
public void CallMoveEvent(Vector2 direction)
{
OnMoveEvent?.Invoke(direction);
}
// 마우스를 움직일 때의 발생하는 이벤트
public void CallLookEvent(Vector2 direction)
{
OnLookEvent?.Invoke(direction);
}
}
public void OnMove(InputValue value)
{
// 해당 value를 받아서 처리
Vector2 moveInput = value.Get<Vector2>().normalized;
CallMoveEvent(moveInput);
}
public void OnLook(InputValue value)
{
Vector2 newAim = value.Get<Vector2>();
// 월드 좌표를 화면 좌표로 변경하여 저장
// 전체 위치가 아닌 에서의 위치로 봐야하기 때문에
Vector2 worldPos = camera.ScreenToWorldPoint(newAim);
// transform.position의 경우에는 Vector3이므로 Vector2로 변경 후 정규화
newAim = (worldPos - (Vector2)transform.position).normalized;
CallLookEvent(newAim);
}
private void Start()
{
controller.OnLookEvent += OnAim;
}
private void OnAim(Vector2 direction)
{
RotateArm(direction);
}
private void RotateArm(Vector2 direction)
{
// Mathf.Atan()으로 해당 Radian값을 알아냄
// Radian값에 Mathf.Rad2Def를 곱셈하여 Degree값으로 변환하여 사용
float rotZ = Mathf.Atan2(direction.y, direction.x) * Mathf.Rad2Deg;
// 절대값으로 전체 180도 중에 절반 90로 중심으로 좌우 반전을 시킴
characterRenderer.flipX = Mathf.Abs(rotZ) > 90f;
armPivot.rotation = Quaternion.Euler(0, 0, rotZ);
}
설명: 키보드, 마우스 말고 다른 콘솔 기기를 사용할 때 따로 지정하지 않고 사용할 수 있게 함
사용:
1. 각 기능에 관하여 델리게이트(Action)를 제네릭타입인 매개변수를 지정 후 생성 해준다.
2. 해당 Actions에 기능 Move, Look, Fire는 앞에 On을 붙여 메서드를 생성하여 매개변수로 해당 InputValue 타입을 받아 해당 값을 처리한다.
3. 후 다른 CS에서 해당 CS정보를 받아와서 구현 처리하는 메서드를 생성하고 해당 델리게이트에 추가 처리 해준다.
public void OnMove(InputValue value)
{
Vector2 moveInput = value.Get<Vector2>().normalized;
CallMoveEvent(moveInput);
}
설명: 직선으로 가는 것이 아닌 대각선으로 방향 벡터를 표준화하여 길이를 1로 만들어 처리를 하기 쉽게 만드는 것이다.
사용: VectorValue.normalized;
// 월드 좌표를 화면 좌표로 변경하여 저장
// 전체 위치가 아닌 화면에서의 위치로 봐야하기 때문에
Vector2 worldPos = camera.ScreenToWorldPoint(newAim);
설명: 마우스의 경우에는 WorldSpace(월드좌표)에 있으므로 Camera의 ScreenToWorldPoint(벡터값)로 화면 좌표로 변경하여 마우스의 좌표로 다른 처리를 할 수있게 함
사용: camera.ScreenToWorldPoint(VectorValue);
// Mathf.Atan()으로 해당 Radian값을 알아냄
// Radian값에 Mathf.Rad2Def를 곱셈하여 Degree값으로 변환하여 사용
float rotZ = Mathf.Atan2(direction.y, direction.x) * Mathf.Rad2Deg;
설명: 해당 스크립트를 Component한 객체가 다른 오브젝트와의 각도를 알아내기 위해 사용함
사용: Mathf.Atan2(VectorValue.y, VectorValue.x) * Mathf.Rad2Deg;
1. Input System: 다른 콘솔의 사용처를 편하게 설정 할 수 있음
2. normalized: 방향 벡터의 길이를 1로 변경
3. camera.ScreenToWorldPoint(VectorValue): 월드 좌표를 화면좌표로 변경
4. Mathf.Atan2, Mathf.Rad2Deg: 해당 위치의 각도를 알아냄
1. 없음
1. 없음