Unity - 3D 게임 만들기

TXMAY·2023년 7월 17일
1

Unity 튜토리얼

목록 보기
12/33
post-thumbnail

이번 강좌는 3D 게임 만들기에 관한 강좌다.
앞에서 배운 내용들을 사용해서 하나의 게임을 만들어 보는 시간이다.


계획하기

우선 어떤 게임을 제작할지 먼저 계획을 세워야 한다.
이번에는 유니티 공식 튜토리얼 중 'Roll a ball'이라는 게임에 내용을 좀 더 추가한 게임을 만들어 보겠다.
계획은 다음과 같다.

  1. 게임 이름 : 굴러서 템 먹기
  2. 장르 : 캐주얼 액션
  3. 목표 : 지형을 뛰어넘어 굴러서 템을 먹고 목표지점에 도달
  4. 구성 : 공(Player), 템(Item). 지형(Platform), 결승점(Point)
  5. 구상도 : 공 -> 점프 -> 아이템(점수) -> Win!(템을 다 못 먹으면 재시작)

플레이어

'3D Object - Sphere'를 생성하고 이름과 태그를 'Player'로 변경한다.
Rigidbody를 추가하고 'PlayerBall'이라는 스크립트를 생성한 후 다음과 같은 코드를 작성한다.

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

public class PlayerBall : MonoBehaviour
{
    public float jumpPower;
    public int itemCount;
    public GameManagerLogic manager;
    bool isJump;
    Rigidbody rigid;
    AudioSource audio;

    void Awake()
    {
        isJump = false;
        rigid = GetComponent<Rigidbody>();
        audio = GetComponent<AudioSource>();
    }

    void Update()
    {
        if (Input.GetButtonDown("Jump") && !isJump)
        {
            isJump = true;
            rigid.AddForce(new Vector3(0, jumpPower, 0), ForceMode.Impulse);
        }

    }

    void FixedUpdate()
    {
        float h = Input.GetAxisRaw("Horizontal");
        float v = Input.GetAxisRaw("Vertical");
        rigid.AddForce(new Vector3(h, 0, v), ForceMode.Impulse);
    }

    void OnCollisionEnter(Collision collision)
    {
        if (collision.gameObject.tag == "Floor")
        {
            isJump = false;
        }
    }

    void OnTriggerEnter(Collider other)
    {
        if (other.tag == "Item")
        {
            itemCount++;
            audio.Play();
            other.gameObject.SetActive(false);
        }
    }
}

아이템

'3D Object - Capsule'을 생성하고 이름과 태그를 'Item'으로 변경한다.
AudioSource를 추가하고 'Window - Asset Store'에서 음향 Asset을 가져와 추가한다.

  • AudioSource : 사운드 재생 컴포넌트, AudioClip 필요
    • AudioClip : 사운드 파일 컴포넌트
  • Asset Store : 게임 개발에 유용한 Asset들을 판매하는 Store
    Is Trigger를 활성화한 후, 'ItemCan'이라는 스크립트를 생성한 후 다음과 같은 코드를 작성한다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ItemCan : MonoBehaviour
{
    public float rotateSpeed;

    void Update()
    {
        transform.Rotate(Vector3.up * rotateSpeed * Time.deltaTime, Space.World);
    }
}

Rotate(Vector3) : 매개변수 기준으로 회전시키는 함수
SetActive(bool) : 오브젝트 활성화 함수
Tag : 오브젝트를 구분하는 단순한 문자열

카메라

'CameraMove'이라는 스크립트를 생성한 후 다음과 같은 코드를 작성한다.

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

public class CameraMove : MonoBehaviour
{
    Transform playerTransform;
    Vector3 Offset;

    void Awake()
    {
        playerTransform = GameObject.FindGameObjectWithTag("Player").transform;
        Offset = transform.position - playerTransform.position;
    }

    void LateUpdate()
    {
        transform.position = playerTransform.position + Offset;
    }
}

FindGameObjectWithTag(Tag) : 주어진 태그로 오브젝트 검색

매니저

'Create Empty'를 생성하고 이름을 'GameManager'로 변경한다.
매니저 : 형태가 없고 전반적인 로직을 가진 오브젝트
'GameManagerLogic'이라는 스크립트를 생성한 후 다음과 같은 코드를 작성한다.

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

public class GameManagerLogic : MonoBehaviour
{
    public int totalItemCount;
    public int stage
}

결승점

'3D Object - Cylinder'을 생성하고 이름을 'Finish Point', 태그를 'Finish'로 변경하고, Is Trigger를 활성화한다.

장면 이동

'PlayerBall'에 다음과 같은 코드를 추가한다.

using UnityEngine.SceneManagement;
...

void OnTriggerEnter(Collider other)
{
...

     else if (other.tag == "Finish")
     {
        if (itemCount == manager.totalItemCount)
        {
            SceneManager.LoadScene(manager.stage + 1);
        }
        else
        {
            SceneManager.LoadScene(manager.stage);
        }
     }
}

LoadScene() : 주어진 Scene을 불러오는 함수(Scene 이름 말고도 Build Settings의 Scene 옆에 있는 숫자(int)도 사용이 가능하다)
Scene을 불러오려면 'File - Build Setting'에서 추가해야 한다.

스테이지

스테이지는 새로운 Scene을 만든 후, 기존 스테이지의 모든 오브젝트를 복사한 후 붙여 넣어서 수정하여 만든다.
밑으로 떨어지면 처음부터 다시 시작하게 하기 위해 GameManager에 Box Collider를 추가한 후, 아래쪽에 배치한 다음 'GameManagerLogic'에 다음과 같은 코드를 추가한다.

using UnityEngine.SceneManagement;
...

void OnTriggerEnter(Collider other)
{
    if (other.gameObject.tag == "Player")
    {
        SceneManager.LoadScene(stage);
    }
}

UI

'UI - Image'와 'UI - Legacy - Text'를 생성한 후 배치한다.
'GameManagerLogic'에 다음과 같은 코드를 추가한다.

using UnityEngine.UI;
...

public Text stageCountText;
    public Text playerCountText;

    void Awake()
    {
        stageCountText.text = " / " + totalItemCount;
    }

    public void GetItem(int count)
    {
        playerCountText.text = count.ToString();
    }

'PlayerBall'에 다음과 같은 코드를 추가한다.

void OnTriggerEnter(Collider other)
{
    if (other.tag == "Item")
    {
        ...
        
        manager.GetItem(itemCount);
    }
    ...
    
}

UnityEngine.UI : UI를 사용하기 위한 필수 라이브러리

빌드

'File - Build Settings'를 선택한 후, Platform에서 원하는 빌드 유형을 선택한 후, Build 버튼을 누르고 저장할 위치를 선택한다.

지정한 위치에 빌드가 완료되었다.


간단해 보이지만 생각보다 쉽지 않았다.
그래도 이번 강좌가 유니티로 게임 개발을 하는 데 많은 도움이 된 것 같다.

profile
게임 개발 공부하는 고양이

1개의 댓글

comment-user-thumbnail
2023년 7월 17일

가치 있는 정보 공유해주셔서 감사합니다.

답글 달기