Complete C# Unity Game Developer 2D

강한친구·2021년 9월 3일
0

Unity Games

목록 보기
1/2

이 글은 Udemy의 강의

Complete C# Unity Game Developer 2D를 듣고 배운점들을 기록하기 위해서 작성하는 글이다.

이번강의에서 배운 게임

Text Adventure 장르의 게임이다. 잘 모르시는 분들을 위해 설명하자면, 초등학생때 하던 심리테스트 비슷한 게임이라고 할 수 있다. 글을 통해 상황을 제시하고, 그 상황에 맞게 선택을 통해 진행하면서 게임을 클리어하는게 목적인 게임이다.

비주얼 노벨, 미연시라 불리는 미소녀 연애 시물레이션 등이 이러한 장르와 비슷하다고 할 수있다. 또한 이러한 장르를 발전시켜서 텍스트형 로그라이크 RPG게임이나, 텔테일 게임즈의 워킹데드 같은 선택지 위주의 게임들 역시 인기를 끈적이 있다.

개발의 난이도로만 보면 높은 그래픽이 요구되거나 고난이도의 코딩이 필요한것이 아니라 매우 쉬운 개발이 가능하지만 또 잠재력이 높은 장르라고 생각한다. 물론 지금은 유행이 지나긴했지만 잘 만든 비주얼노벨 IP는 10년 20년이 지나도 통하고있다.

전체적인 구조

전체적인 Hierarchy 와 Scripts의 사진이다.
Canvas의 항목들을 하나씩 설명하자면
Ttile back 은 게임 타이틀을 담는 화면 뒷배경을 의미한다.
마찬가지로 Text Back 은 텍스트를 담은 화면 뒷배경이다.
그리고 Story Text, Title Text는 텍스트를 출력하기 위한 Text Object이다.
유니티는 gameobject에 script를 씌워서 작동한다. 이번에는 AdventureGames라는 스크립트와 States라는 스크립트를 사용하였다.

State

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

[CreateAssetMenu(menuName = "State")]
public class State : ScriptableObject {

    [TextArea(14,10)] [SerializeField] string storyText;

    [SerializeField] State[] nextStates;
    public string GetStateStory() {
        return storyText;
    }

    public State[] GetNextState() {
        return nextStates;
    }
}

State 파일은 플레이어의 현 상태를 저장하기 위한 state를 생성하기위해 만들어진 스크립트이다. 특징적인 점으로는 MonoBehaviour 가 아닌 ScriptableObject로 사용딘다는 점이다.
이 스크립트 안에는

  • 다음 스테이트들은 nextStates Array
  • Text 출력을 위해 storyText를 돌려주는 GetStateStory Method
  • State array를 반환하여 nextState를 출력해주는 GetNextState Method

가 존재한다.
기능들은 간단하여 설명을 생략해겠다.

AdventureGames

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class AdventureGames : MonoBehaviour
{
    [SerializeField] Text textComp;
    [SerializeField] State startingState;

    State state;

    void Start()
    {
        state = startingState;
        textComp.text = state.GetStateStory();
    }

    void Update()
    {
        ManageState();
    }

    private void ManageState() {
        var nextStates = state.GetNextState();
        for(int i = 0; i < nextStates.Length; i++) {
            if (Input.GetKeyDown(KeyCode.Alpha1 + i)) {
                state = nextStates[i];
            }
        }
        textComp.text = state.GetStateStory();
    }
}

[SerializedField]

이 기능은 Unity Inspector에서 해당값을 접근, 수정할 수 있도록 만드는 기능이다. 코드에서 일일히 수정하는것보다 이런식으로 인스펙터를 통해서 수정하게 된다면 빠르게 값을 수정하여 그 결과를 한번에 파악 할 수 있고 이는 추후 밸런스 조정이나 수치 관리등에 있어서 도움이 될 것이라 생각한다.

AdventureGames 스크립트에서 눈여겨 볼 점은 두가지 정도이다.

우선 게임 시작과 동시에 실행되는 Void Start 코드이다.
state = StartingState로 초기화함과 동시에 Inspector 에서 Starting State에 초기화면을 연결해주는것으로 state의 상태를 게임 시작과 동시에 설정하는것이다.
그 후 textcomp를 이용하여 text Obj에 출력될 텍스트를 가지고와서 출력하는것이 그 역할이다.

그 후 유저의 방향키 누름에 따라 다음 state로 넘어가는 ManageState Method가 있다.

1 2 3 등 미리 지정된 키를 인식하는것으로 State Array에 저장된 state를 입력키에 맞게 불러와서 지정하는 방식이다.

Why for Loop?

하지만 여기서 왜 For문이 사용되었는지 의문이 들 것이다.
그 이유는 간단한데 For문을 사용하여 범위를 제한하지 않으면 에러가 발생하기 때문이다.

예를들어 장면 1에서는 선택지가 1, 2 번이 있다고 하자.
그리고 장면 2에서는 선택지가 1, 2, 3번이 있다고 하자. 그렇다면 우리는 코드를 3번까지 인식할 수 있게 작성해야 할 것이다. 하지만 그렇게 작성을 하면 장면 1에서 3을 눌렀을때 3이 눌러진것으로 인식되어 에러가 발생하게 된다. 물론 게임에 지장이 갈 정도로 심각한 버그는 아니고 console에 오류메시지가 출력되는 정도지만, 이러한 사소한 버그들이 쌓이면 나중에 큰 눈덩이로 돌아오니깐 미리미리 잡아주도록 하자.

for(int i = 0; i < nextStates.Length; i++) {
            if (Input.GetKeyDown(KeyCode.Alpha1 + i)) {
                state = nextStates[i];
            }
        }
        textComp.text = state.GetStateStory();
    }

그래서 이렇게 선택지의 갯수를 의미하는 nextState Array의 길이만큼 for문을 돌리면서 그 안에서만 입력을 받을 수 있도록 설정한것이다.

글을 마치며

간단한 개발과 코드지만, 아무튼 일련의 과정을 거치며 유니티의 기본을 익힐 수 있었고, 내 인생 최초(?)로 게임을 만들었다는 만족감이 드는 강의였다. 물론 이 전에도 retr0 강사님의 강의를 통해 Clicker 게임을 제작해보기도 하였다. (이와 관련해서는 나중에 정리하려고 한다. 아직 어렵다)
이렇게 점점 유니티에 익숙해져 나가면서 학업에도 충실히 임하면 졸업할때쯤에는 게임회사에 개발자로 취업해서 게임개발을 할 수 있지 않을까하는 생각이 든다.

그리고 나중에 알만툴 같은 개발도구를 이용하여 직접 게임을 만들어보고싶기도 하다.

스토리 미작성으로 아직 게임은 진행중입니다. 완전히 끝나면 그떄 zip파일로 올려보겠습니다.

0개의 댓글