[UNITY] 유니티로 2D 액션 게임 만들기 2 (플레이어 캐릭터 만들기 3 / 공격 방향 설정)

2025. 3. 25. 17:00유니티 Unity/액션게임만들기

반응형

 

지난번 플레이어 캐릭터 이동에 관한 포스팅에 이어 이번에는 공격 방향 설정에 대해 남겨본다.



** 지난 포스팅 : 캐릭터 이동
https://ggbt.tistory.com/21


 

 

 

 

원래는 공격 관련한 내용을 쓰려고 했으나,
공격을 할 때 어느 방향으로 공격할 것인지를 생각하다보니 캐릭터가 이동할 때 해당 방향을 눈으로 볼 수 있게끔 만들어두는 것이 좋을 것 같다는 생각이 들었다.​

그래서 이번 포스팅에서는 캐릭터를 이동할 때 이동하는 방향으로 화살표 모양의 UI 가 캐릭터 주변에 표시되게 만들어보려고 한다.

그래서 먼저 화살표 이미지를 하나 구해보도록 하자.
이번에도 Kenney 사이트에서 이미지를 구해왔다.

 

https://kenney.nl/assets/cursor-pixel-pack

 

 

다양한 모양의 화살표를 사용할 수 있으니 마음에 드는 것으로 골라보자.
본 포스팅에서는 아래의 이미지를 사용한다.


일반적으로 아는 화살표 모양이라 식별이 용이해서 이걸로 선택했다.

 

 

 

 

Apple 맥북 에어 13 M2 - 노트북 | 쿠팡

쿠팡에서 Apple 맥북 에어 13 M2 구매하고 더 많은 혜택을 받으세요! 지금 할인중인 다른 노트북 제품도 바로 쿠팡에서 확인할 수 있습니다.

www.coupang.com

 



유니티로 2D 액션 게임 만들기

캐릭터의 이동 방향 표시하기

 


이동 방향을 표시할 스프라이트 추가하기

앞서 Kenney 사이트에서 다운로드했던 화살표 스프라이트를 유니티 프로젝트 창으로 끌어넣어주고,
해당 스프라이트를 플레이어의 자식으로 넣어준다.​

그 전에 Player 게임오브젝트의 하위에 있는 자식오브젝트들을 빈 게임오브젝트를 하나 만들어서 그 안으로 다 이동시키자.​

이것을
이런 식으로 변경해주자



그리고 화살표가 위치할 게임오브젝트를 Player 게임오브젝트 하위에 만들어준다.
먼저 빈 게임오브젝트를 하나 만들어서 MoveCursor 라고 이름 짖고,
그 아래에 2D Sprite 를 하나 만들어준다.

2D Sprite 를 하나 만들자


그리고 Sprite Renderer - Sprite 를 아까의 화살표 스프라이트로 변경해준다.
스프라이트를 변경해주고, 언제 어느 상황에서든 화면에 보일 수 있게 Order In Layer 를 11로 설정.​

그리고 그냥 사용하기에는 스프라이트의 크기가 크니까 MoveCursor Transform 의 Scale 을 xyz 모두 0.5 로 수정해주고,
화살표가 캐릭터 스프라이트와 겹치니까 Y 좌표를 0.15 로 수정해서 옮긴다.
(좀 있다 스크립트로 화살표의 위치를 조절할거라 굳이 옮기지 않아도 상관없다)


이미지 스프라이트의 준비는 이걸로 끝.
다음은 화살표가 이동 방향을 가리키도록 스크립트를 작성한다.



PlayerMovement.cs 스크립트 수정


PlayerMovement.cs  파일을 열고 스크립트를 수정해준다.​

먼저 앞서 만든 MoveCursor 라는 게임오브젝트를 캐릭터가 이동하는 방향에 맞춰서 움직일 것이기 때문에, 

이 게임오브젝트를 컨트롤할 수 있도록 Transform 변수 하나를 추가해준다.



그리고 이동에 맞춰 화살표가 움직이도록 함수를 하나 작성해보자.
MoveCursor() 라는 이름의 함수를 작성해보았다.


    private void MoveCursor(Vector3 dir)
    {
        // 화살표 방향을 이동 방향으로 회전
        float angle = Mathf.Atan2(dir.y, dir.x) * Mathf.Rad2Deg;
        moveCursorTr.rotation = Quaternion.Euler(new Vector3(0f, 0f, angle));

        // 화살표를 플레이어의 이동 방향에 맞게 위치 변경하기
        float distanceFromPlayer = 1f;
        moveCursorTr.position = playerTr.position + (dir * distanceFromPlayer);
    }


화살표의 위치와 방향을 설정해야하기 때문에 캐릭터를 이동할 때의 방향값을 받아와야 한다.
그래서 MoveCursor() 함수에 매개변수 Vector3를 하나 넣어준다.

MoveCursor(Vector3 dir)

MoveCursor(Vector3 dir) 의 매개변수 dir 에 들어갈 값은, 사용자가 방향키 입력을 중지했을 때의 방향값이 된다.
그 방향값을 저장하기 위한 변수 하나를 추가하자.​

private Vector3 lastDirection = Vector3.right;


기본 방향은 오른쪽으로 해두었다.​

그리고 Update() 문의 캐릭터 이동 코드를 따로 함수로 빼주고, 코드도 수정해준다.


    private void Update()
    {
        MoveControl();
    }

    private void MoveControl()
    {
        // GetAxis로 입력 값 받기 (360도 움직임 가능)
        float horizontal = Input.GetAxis("Horizontal");
        float vertical = Input.GetAxis("Vertical");

        Vector3 moveDirection = new Vector3(horizontal, vertical, 0);

        if (moveDirection.sqrMagnitude > 0.01f) // 이동 입력이 있을 때 (벡터의 크기가 0.01 이상일 때)
        {
            moveDirection.Normalize(); // 이동 방향 벡터 정규화
            playerTr.position += moveDirection * moveSpeed * Time.deltaTime; // 플레이어 이동

            lastDirection = moveDirection; // 마지막 이동 방향 갱신
        }

        // 입력이 없을 때 마지막 방향으로 커서를 유지
        MoveCursor(lastDirection);
    }


​여기까지 코드가 작성되었다면 테스트 플레이.



방향키 입력으로 이동하는 방향에 따라 화살표도 함께 움직이는 것을 볼 수 있다.

** 혹시나 화살표의 방향이 다른 방향을 가리킨다면,
MoveCursor 의 자식오브젝트인 Sprite 게임오브젝트의 Transform Rotation.z 를 조절해서 방향을 맞춰주면 된다.

나는 -90으로 해줬다


테스트를 하다보면 키입력을 마쳤을 때 화살표가 내가 생각한 방향에서 멈추지 않고 조금 이동하는 경우가 있다.​

아마 키보드로 조작을 하다보니 마지막 방향값이 상하좌우 중 하나로 입력되서 그런 오동작을 하는 것으로 보인다.​

나중에는 안드로이드로 빌드할 생각이라 가상조이스틱을 넣을 예정인데, 가상조이스틱을 사용하면 이 문제가 해결될 것이라 예상된다. 
(예상일 뿐.. 나중에 테스트 해봐야 알 듯하다)




여기까지 공격 방향을 설정하기 위한 방향키 입력에 따라 움직이는 화살표를 만들어보았다.
다음 포스팅에서는 입력한 방향 즉, 화살표 방향으로 공격하는 로직을 만들어보기로 한다.


끝.

 

 

 

Apple 맥북 에어 13 M2 - 노트북 | 쿠팡

쿠팡에서 Apple 맥북 에어 13 M2 구매하고 더 많은 혜택을 받으세요! 지금 할인중인 다른 노트북 제품도 바로 쿠팡에서 확인할 수 있습니다.

www.coupang.com

쿠팡파트너스 활동을 통해 일정수수료를 받을 수 있음

반응형