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