UNITY/크레이지아케이드 모작

캐릭터 움직임 구현

2zreal 2024. 7. 18. 23:38

오늘은 간단하게 캐릭터 움직을 구현함.

 

각 방향별로 멈추는 모습이 다르기 때문에 Idle을 4개를 만들었다.

 

벽 충돌은 collider는 모두 가지고 있고 rigidbody2D를 한 객체가 가지고 있어야 적용됨.

 

중력은 필요 없기 때문에 scale 0으로 설정.

Freeze Rotation Z축은 사용안함.

 

Idle_Down을 디폴트로 설정.

using UnityEngine;

public class PlayerController : MonoBehaviour
{
    public float speed = 3.0f;
    private Animator animator;

    public string idleLeftAnime = "IdleLeft";
    public string idleRightAnime = "IdleRight";
    public string idleUpAnime = "IdleUp";
    public string idleDownAnime = "IdleDown";
    public string moveLeftAnime = "MoveLeft";
    public string moveRightAnime = "MoveRight";
    public string moveUpAnime = "MoveUp";
    public string moveDownAnime = "MoveDown";

    private string nowAnime = "";
    private string oldAnime = "";

    private Vector3 lastMovement = Vector3.zero;
    private Rigidbody2D rb;

    float horizontal = 0f;
    float vertical = 0f;

    public GameObject Balloon;

    void Start()
    {
        animator = GetComponent<Animator>();
        rb = GetComponent<Rigidbody2D>();
        if (rb == null)
        {
            rb = gameObject.AddComponent<Rigidbody2D>();
            rb.constraints = RigidbodyConstraints2D.FreezeRotation;
        }
        nowAnime = idleDownAnime;
        oldAnime = idleDownAnime;
    }

    void Update()
    {
        horizontal = Input.GetAxisRaw("Horizontal");
        vertical = Input.GetAxisRaw("Vertical");

        
        if (Mathf.Abs(horizontal) > Mathf.Abs(vertical))// 대각선 이동 방지
        {
            vertical = 0;
        }
        else
        {
            horizontal = 0;
        }

        if(Input.GetKeyDown(KeyCode.Space))//스페이스바 물풍선 생성
        {
            Instantiate(Balloon, transform.position, Quaternion.identity);
        }
    }

    void FixedUpdate()
    {
        Vector2 movement = new Vector2(horizontal, vertical).normalized * speed * Time.fixedDeltaTime;
        rb.MovePosition(rb.position + movement);

        animator.speed =  ((speed-1)*0.2f)+1;//속도가 빨라지면 애니메이션 속도도 증가!

        if (movement != Vector2.zero)//움직임이 있다면
        {
            lastMovement = movement;//멈추는 로직을 구현하기 위해 사용

            if (horizontal != 0)
            {
                if (horizontal > 0)
                {
                    nowAnime = moveRightAnime;
                }
                else
                {
                    nowAnime = moveLeftAnime;
                }
            }
            else if (vertical != 0)
            {
                if (vertical > 0)
                {
                    nowAnime = moveUpAnime;
                }
                else
                {
                    nowAnime = moveDownAnime;
                }
            }
        }
        else//움직임이 없다면
        {
            if (Mathf.Abs(lastMovement.x) > Mathf.Abs(lastMovement.y))//이전 움직임을 보고 판단
            {
                if (lastMovement.x > 0)
                {
                    nowAnime = idleRightAnime;
                }
                else
                {
                    nowAnime = idleLeftAnime;
                }
            }
            else
            {
                if (lastMovement.y > 0)
                {
                    nowAnime = idleUpAnime;
                }
                else
                {
                    nowAnime = idleDownAnime;
                }
            }
        }

        if (nowAnime != oldAnime)//애니메이션이 바뀌면 Play
        {
            oldAnime = nowAnime;
            animator.Play(nowAnime);
        }
    }
}