InputSystem

Untitled

TopDownController

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);
    }
}