InputSystem
- 플레이어의 키 입력은 InputSystem을 이용했다.

TopDownController
- Move, Look, Fire같은 이벤트들을
TopDownController 에 저장한 뒤 각각의 엔티티들이 상속하게 했다. (재사용성 UP)
using System;
using UnityEngine;
public class TopDownController : MonoBehaviour
{
public event Action<Vector2> OnMoveEvent;
public event Action<Vector2> OnLookEvent;
protected virtual void Awake()
{
}
public void CallMoveEvent(Vector2 dir)
{
OnMoveEvent?.Invoke(dir);
}
public void CallLookEvent(Vector2 dir)
{
OnLookEvent?.Invoke(dir);
}
}
이동
using System;
using UnityEngine;
using UnityEngine.InputSystem;
public class PlayerInputController : TopDownController
{
private Camera camera;
protected override void Awake()
{
base.Awake();
camera = Camera.main; // mainCamera 태그를 가진 카메라의 정보를 받아옴
}
public void OnMove(InputValue value)
{
Vector2 moveInput = value.Get<Vector2>().normalized;
CallMoveEvent(moveInput);
}
public void OnLook(InputValue value)
{
// 정규화를 하면 안됨 -> 캐릭터의 위치 기준에서 마우스 위치에 따라 왼쪽 오른쪽을 결정하기 때문에
Vector2 newAim = value.Get<Vector2>();
Vector2 worldPos = camera.ScreenToWorldPoint(newAim);
// 플레이어와 마우스 포인터의 차이를 구한 뒤 정규화(플레이어가 바라볼 방향 구함)
newAim = (worldPos - (Vector2)transform.position).normalized;
CallLookEvent(newAim);
}
}
using System;
using UnityEngine;
public class TopDownMovement : MonoBehaviour
{
private TopDownController controller;
private Rigidbody2D rigid;
private Vector2 movementDir = Vector2.zero;
private void Awake()
{
controller = GetComponent<TopDownController>();
rigid = GetComponent<Rigidbody2D>();
}
private void Start()
{
controller.OnMoveEvent += Move;
}
private void Move(Vector2 dir)
{
movementDir = dir;
}
private void ApplyMovement(Vector2 dir) // 실제로 이동을 하는 함수
{
// 스탯 적용
dir *= 5;
rigid.velocity = dir;
}
private void FixedUpdate()
{
ApplyMovement(movementDir);
}
}
플립
using System;
using UnityEngine;
public class TopDownAimRotation : MonoBehaviour
{
[SerializeField] private SpriteRenderer armRenderer; // 화살 뒤집기
[SerializeField] private Transform armPivot;
[SerializeField] private SpriteRenderer charactorRenderer; // 에임에따라 캐릭터가 뒤집혀야함
private TopDownController controller;
private void Awake()
{
controller = GetComponent<TopDownController>();
}
private void Start()
{
controller.OnLookEvent += OnAim;
}
private void OnAim(Vector2 direction)
{
RotateArm(direction);
}
private void RotateArm(Vector2 direction)
{
// 캐릭터에서 몬스터를 바라보는 각도를 구함
float rotZ = Mathf.Atan2(direction.y, direction.x) * Mathf.Rad2Deg;
// 바라본 방향으로 캐릭터 Flip
charactorRenderer.flipX = Mathf.Abs(rotZ) > 90f;
// armRenderer.flipY = charactorRenderer.flipX; // y축도 같이 뒤집음
// z축 회전
armPivot.rotation = Quaternion.Euler(0, 0, rotZ);
}
}