TIL 25.02.19 - 개인과제_1

강진규·2025년 2월 19일

Today I Learned

목록 보기
16/34
post-thumbnail

[ 개인과제 ]

ZEP은 사용자들이 캐릭터를 조작하며 맵에서 상호작용 할 수 있는 가상 공간 플랫폼입니다.
이번 과제를 통해 게임 스타일의 맵과 상호작용을 기반으로 한 창의적인
2D 미니 게임을 제작해봅시다.

1단 나는 저번 개인 과제에서 필수 기능을 다 구현하지 못했다.
그래서 이번에도 목표는 필수 기능 다하기로 정했다.


[ 필수 기능 ]

  • 캐릭터 이동 및 맵 탐색
  • 미니 게임 실행
  • 점수 시스템
  • 게임 종료 및 복귀
  • 카메라 추적 기능

[ 캐릭터 이동 및 맵 탐색 ]

대부분 강의에서 다 했던 부분들이라 거의 그대로 사용했는데, 이동 부분은
강의 마지막에서 다뤘던 INPUT ASSET을 사용해서 구현했다.
그리고 마우스를 안쓰고 방향키로만으로 플레이어의 이동과 보는 방향을 구현했다.

발생했던 문제

  • 기존 코드는 마우스의 방향에 따라 플레이어의 보는 방향이 결정이 되었는데
    그게 아니였기 때문에 플레이어의 보는 방향을 정해줘야됬다.
  • 플레이어의 입력 방향에 따라 스프라이트를 변경해줘야 되는데
    이게 입력방향의 반대로 적용이 되었고, 위아래의 방향은 filp을 사용 할 수가 없었다.

해결

  • 코드를 보면 direction이 vetor2.zero일때
    그러니까 플레이어의 입력이 없었을때 lastDirection에 direction을 넣어줬다.
    이로 인해 기존에 입력했던 방향에 따라 플레이어의 보는 방향도 고정 할 수 있었다.
private void Movement(Vector2 direction)
{
    if (direction != Vector2.zero)
    {
        lastDirection = direction;
    }

    direction = direction * stat.Speed;

    rigid.velocity = direction;
}
  • 반대로 적용되는 부분은 코드를 수정해서 쉽게 해결할 수 있었다(그냥 비교 연산자를 잘못 썻다)
    위 아래 방향 스프라이트는 입력된 direction.y에 따라 스프라이트를 변경해주었다.
    여기서도 마찬가지로 기존 바라보던 방향을 적용하여 입력이 없을때를 표현해줬다.
private void Rotate(Vector2 direction)
{
    if (direction == Vector2.zero)
    {
        direction = lastDirection;
    }

    bool filpX = direction.x > 0f;
    bool filpUp = direction.y > 0f;
    bool filpDown = direction.y < 0f;

    characterRenderer.sprite = LeftRight;

    if (filpX != isFilpX)
    {
        isFilpX = filpX;
        characterRenderer.flipX = isFilpX;
    }

    if (filpUp)
    {
        characterRenderer.sprite = Up;
    }

    if (filpDown)
    {
        characterRenderer.sprite = Down;
    }
}

[ 카메라 추적 기능 ]

이 부분도 기존 강의에서 사용했던걸 수정해서 사용했다.
다른 점이 있다면, 기존 코드는 x의 +쪽만 해서 추적했는데
그게 아니고 사방향으로 추적하게 바꿨다.

발생했던 문제

  • 한쪽 방향만이 아니고 사방향으로 추적을 해야되는데 그 것을 하는데 어려움을 겪었다.
    처음에는 단순히 y 쪽도 추가해서 했는데 잘 안됬다.

해결

  • 얼마전 배웠던 Lerp를 사용했다. 이걸 사용하면 원하는 방향으로 자연스럽게 이동시킬수 있다.
    targetPos를 사용하여 플레이어를 타겟으로 설정해주었다.
    카메라 위치와 플레이어 위치 간의 차를 offset으로 정해주고
    Lerp의 도착점으로 사용할 targetPos에 더해주었다.
public Transform target;
public float Speed = 5.0f;

private Vector3 offset;

private Vector3 targetPos;

private void Start()
{
    if (target == null) return;

    offset = transform.position - target.position;
}

private void Update()
{
    if (target == null) return;

    targetPos = target.position + offset;
    transform.position = Vector3.Lerp(transform.position, targetPos, Speed * Time.deltaTime);
}

[ 결과 ]

원하는 대로 잘 구현이 되어서 다행이다.
그래고 플레이어 캐릭터가 애니메이션을 사용하는 방식으로 만든게 아니기 때문에
조금 더 수월했던 것 같다.

0개의 댓글