다른 분들과 합칠 때 하이어라키를 비우지 않으면 meta 데이터로 인해 충돌이 날 가능성이 높아지기 때문에 한 명이 Scene을 미리 만들어두고, 서로 작업할 때 본인 이름파일을 생성하여 Prefabs로  인스턴스화 하기로 했다.

일단 기능 구현을 먼저 해놓고 꾸미는 것은 나중에 하기로 했다.

 

<게임 시작 화면> - StartButton 만들기

Button 컴포넌트는 Sprites에서는 작동이 안되며 UI에서만 실행되기 때문에 Image를 선택하여 버튼을 생성해준다.

StartButton script를 만들고 버튼을 눌렀을 때, MainGame씬으로 넘어가도록 한다.

public class StartScene : MonoBehaviour
{
    public void GameStart()
    {
        SceneManager.LoadScene("MainGame");
    }
}

 

 

<UI> - Timer

UI에서 Text를 추가한 뒤, GameManager에서 시간이 계속해서 흐르도록 Update에서 Time.deltaTime을 사용한다.

public Time timeTxt;
float time;

void Update()
{
    time += Time.deltaTime;
    timeTxt.text = time.ToString();
}

time GameObject 자기 자신을 time에 넣어주어 게임 화면에 시간을 띄운다. 이 부분은 GameManager를 건들기 때문에 일단 방법만 작성해놓고 스크럼 때 조율하기로 했다.

 

 

<게임 종료 화면>

게임 종료 화면 역시 UI로 만들지 Scene으로 만들지 조율이 필요하기 때문에 스크럼 때 회의 후 진행하기로 했다.

 

 

맡은 부분이 상대적으로 쉬워서 다른 분들을 돕거나 디자인을 해볼 생각이다. 개인과제 때 현재 시간 띄우기, 캐릭터 선택창, 이름 바꾸기 등 선택구현도 시도해보아서 많은 도움이 된 것 같다.

스크립트 간의 상속과 접근 제한자 등의 이해가 필요하기 때문에 주말에는 C# 문법 부분을 노션에 정리하며 다시 한 번 복습해볼 생각이다.

'부트캠프 > Study' 카테고리의 다른 글

<Unity> 숙련 - 2D 게임 개발(5)  (0) 2023.12.10
<Unity> 숙련 - 2D 게임 개발(4)  (0) 2023.12.08
벡터(Vecter)  (0) 2023.11.29
ScreenToWorldPoint와 WorldtoScreenPoint의 차이  (0) 2023.11.28
<Unity> 입문 - 2D 게임 개발(3)  (1) 2023.11.28

이번 팀과제는 추억의 게임 중 한 가지를 선택하여 현대적인 버전으로 재현하기이다.

우리팀은 닷지(Dodge) 게임을 바탕으로 공격 기능을 추가하여 Vampire Survivors 느낌으로 기획했다.

  • S.A (Starting Assignments)

현대인들을 타겟층으로 기획했으며, 우주 테마로 컨셉을 잡았다.

 

  • Wire Frame

캐릭터 만들기

Asset에서 캐릭터 그림파일을 추가한 뒤, 빈 오브젝트에 이미지를 넣어준다.

 

이미지 파일의 크기를 조절하는 방법에는 여러가지 방법이 있다.

  • Main Camera - Camera Size 조절

카메라 사이즈가 커지면 캐릭터가 작아보이는 것을 이용한다.

 

  • Scale값 조절

 

  • PPU값 조절

 

 

캐릭터 이동

캐릭터 이동은 이전 글 중 <Unity> 입문 - 2D 게임 개발(2)의 입력과 캐릭터 이동 부분을 참고하자.

Legacy 형태는 짧지만 객체지향에 위배되는 코드이기 때문에 지양하는 것이 좋으며, Input System 방식의 객체지향 형식으로 코드를 쓰는 것이 좋다. 그러나 간단하게 테스트용으로 쓰이기도 하므로 알아두는 것이 좋다.

 

방 만들기

방 만들기 역시 <Unity> 입문 - 2D 게임 개발(3)의 타일맵 부분을 참고하면 된다.

캐릭터의 Rigidbody 2D와 타일의 Collider가 충돌이 일어나면 실제 물리 충돌이 일어나는데 그로 인해 캐릭터가 빙글빙글 도는 현상이 일어난다. 그것을 방지하기 위해 Rigidbody 2D - Constraints - Freeze Rotation의 Z을 체크해준다.

 

타일맵을 찍을 때 Edit - Preference - Tile Palette에서 기본툴 외의 다른 툴들을 추가해서 사용할 수 있다.

 

캐릭터 애니메이션 추가

애니메이터 창을 열어 기본 상태 애니메이션에 걷는 애니메이션을 추가해준 뒤, 서로 연결해준다.

 

Stand에서 Walk로 가는 Transition을 클릭하여 Has Exit Time 체크를 해제하고, Conditions를 추가해서 Walk를 true로 바꿔준다.

 

Walk에서 Stand로 가는 Transition 마찬가지로 Has Exit Time 체크를 해제하고, 이번엔 Walk를 false로 바꿔준다.

Has Exit Time는 종료 시점을 활성화하는 옵션으로 종료 시점의 비율만큼 애니메이션이 재생된 후에 다음 상태로 전이된다. 즉시 재생시키고 싶다면 비활성화 해야한다.

 

이제 위에서 만든 애니메이션을 관리하기 위해 스크립트를 만든다.

움직일 때 Walk로 전환 즉, 키를 입력받았을 때 전환시키려면 InputController가 필요하기 때문에 컨트롤러를 불러온다.

PlayerInputController controller;

[SerializeField] private Animator anim;

private void Awake()
{
    controller = GetComponent<PlayerInputController>();
}

void Start()
{
    controller.OnMoveEvent += Animation;
}

void Animation(Vector2 direction)
{
    anim.SetBool("walk", direction.magnitude > 0f);
}

 

 

알아두면 좋은 벡터값 계산

  • 덧셈

(Ax + Bx), (Ay + By)

 

  • 뺄셈

(Ax - Bx), (Ay - By)

A벡터에서 B벡터를 뺐더니 B에서 A로 향하는 벡터가 만들어졌다.

실제로 이 계산은 플레이어를 쫓아가는 몬스터의 방향과 거리를 알 수 있는 등 게임에서 많이 쓰인다.

 

  • 곱셈

(x * n), (y * n)

벡터에 숫자를 곱하면 방향은 바뀌지 않고 크기만 변한다.

벡터의 크기가 클 수록 속도가 빠르다고 볼 수 있다. 백터에 어떠한 숫자를 곱함으로 속도를 빠르거나 느리게 할 수 있다.

 

 

몬스터에서 플레이어를 향한 벡터값을 구하기 위해 플레이어의 좌표에서 몬스터 좌표를 빼면 방향과 크기를 알 수 있다. 그러나 이 좌표값으로 계산하면 방향과 크기가 한 번에 구해지기 때문에 몬스터가 느린지 빠른지 구분 할 수 없다.

그래서 방향을 유지하며 크기를 전부 1로 바꾼 뒤, 속도를 곱해주면 속도에 따라 벡터의 크기가 달라지게 된다. 이것을 정규화(normalized)라고 한다. 이때 방향만 남은 크기가 1인 벡터를 단위벡터라고 한다.

normalized가 방향만 알아낼 수 있다면 반대로 magnitued는 방향을 무시하고 크기만 알아낼 수 있다.

+ Recent posts