본문 바로가기
Tech Review : Unity & C#

2. Obstacle Course : Intro ~ Basic Collision (1)

by 메타포_이수연 2023. 10. 14.

Udemy 강좌 'Complete C# Unity Game Developer 3D' 리뷰 및 기술 기록지입니다. 

Obstacle Course : 9.Intro ~ 17. Basic Collision

 

Before Intro

1회차 Introductiond&Setup() 단계에서는 기본적인 3D 모형을 가지고 만들 수 있었다.  

큐브와 실린더 모형을 조작해 빌딩 사이에 자동차 2대가 있는 모습을 만들어보았다. 

Car 부품 모형들을 묶어 옵션에 Empty를 생성해 'Car'로 폴더처럼 이름지어 그룹화 할 수 있다.

Assets 폴더에 오브젝트 모형이 있는 것을 확인할 수 있다. 그룹화 되어있는 오브젝트 Car를 복사 및 변형 가능해서 편리하다. 

 

9,10. Obstacle Course Intro

Obstacle Course에서는 맵을 만들어서 공이 여러 유형의 (움직이고 굴러가고 떨어지고 회전하는) 장애물들을 피해 움직이는 맵을 만드는 것이 목표이다. 주 기능으로는 충돌, 회피조작, 카메라, 플레이어, 점수, 떨어짐, 기울기에 따른 움직임, 회전, 충돌감지 등을 구현하게 될 것  같다. 

핵심 기술은 플레이어가 움직이고 장애물을 회피하는 것이다.

목표는 A 지점에서 B 지점까지 가는 것이 목표이다. 

 

11. Start() & Update()

플레이어가 노란색 단무지 같아 'Pickled Yellow' 라고 이름 붙였다. 이제 이 플레이어가 움직일 수 있도록 script로 코드를 작성해 Component로 적용했다. script 명은 'Mover'다. 

script의 기본 구성이다.

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

public class Mover : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        transform.Translate(1,0,0);
    }

    // Update is called once per frame
    void Update()
    {
        ;
    }
}

컬랙션 제너릭

컬렉션(Collection) C#에서 지원하는 자료구조 클래스다. 컬렉션은 object 형식을 사용하여 데이터를 관리하기 때문에, 박싱(Boxing)과 언방식(Unboxing)이 발생한다. 그래서 컬렉션을 많이 사용하게 되면, 프로그램의 성능 저하가 온다. 성능 이유로 현재 C#에서는 컬렉션은 잘 사용하지 않는다. 컬렉션의 성능 문제 때문에 대신 사용하는 것이 제네릭 컬렉션이다. 제네릭 컬렉션은 데이터 형식을 일반화하여 사용하기 때문에 컬렉션에 비해 성능의 문제가 적다. 제네릭 컬렉션은 using 지시문으로  System.Collections.Generic를 선언해 주어야 하는데, 유니티에서 새 C# 스크립트를 만들면, 자동적으로 선언되어 있다.

MonoBehaviour

스크립트에서는 MonoBehaviour이라는 기본 제공 클래스에서 파생되는 클래스를 Unity 내부 작업과 연결한다. 

새로 만드는 클래스는 게임 오브젝트에 붙일 수 있는 컴포넌트가 되고, 오브젝트의 새 인스턴스가 된다.

Start() & Update()

Start 함수는 게임플레이가 시작되기 전에(즉, Update 함수가 처음으로 호출되기 전에) Unity에 의해 호출되며 초기화를 수행할 수 있다. Update 함수는 게임 오브젝트에 대한 프레임 업데이트를 처리하는 곳이다.

 

transform.Translate(1,0,0);  

transform, 위치와 관련해 Translate, 움직여라 (1,0,0) 지시한 이 위치로란 의미이다. 

 

이 실행문을 Start()에 넣는다면 시작하기 전에 한 번 실행될 것이고, update()에 넣는다면 per당 frame 이 업데이트 되는 속도만큼 계속해서 위치를 움직일 것이다. 

 

12. Introducing Variables

다음과 같이 '변수 타입' '변수 명' , '=', '데이터값' 형태로 변수 선언 및 초기화를 할 수 있다.

다음의 코드는 frame이 업데이트 될 때마다 x 축으로 이동하는 모습을 볼 수 있다.  

 

13. Using SerializeField

SerializeField는 접근제한자로 private 변수이지만 inspector가 접근가능하게 만들었다. 

즉 게임오브젝트나 컴포넌트들을 연결할 때 inspector에서만 관리가 가능하다. 

그렇게 되면 외부에서 수정, 참조할 수 없고 inspector에서만 접근이 가능하다. 

 

위의 코드의 경우, 코드 실행 이후 inspector에서 속도를 조정하기 위해 접근 제한자 SerializeField를 썼다. 

 

14. C# Formatting & Input.GetAxis()

Input.GetAxis("Horizontal");

Edit>Project Editor>Input 에서 확인가능하다. 출력값, 그러니까 컴퓨터 입장에서 입출력 장치로 Horizontal은 왼/오른쪽 키버튼 을 누르면 이동하는 것이다. Vertical의 경우에는 위아래 키를 누르면 조작이 가능하다. 

 

15. Time.deltaTime

컴퓨터 사양에 따라 느린 컴퓨터와 빠른 컴퓨터가 있다. 각각의 FPS(Frame per second) 도 따라서 느린 컴퓨터일수록 FPS 값이 작을 것이다. 그렇게 된다면 느린 컴퓨터와 빠른 컴퓨터 간의 성능 차이가 있을 수 있다. 이 때문에 한 프레임당 실행하는 시간을 자동 계산해 곱하여 성능에 따른 격차를 줄일 수 있다. 

Time.deltatime은 한 프레임 당 실행하는 시간을 뜻하고 float 형태로 반환된다. 1프레임당 이동거리  = 1프레임당 실행시간 x 속도 이고 이 시간을 곱해주어서 컴퓨터간의 FPS 를 조정해준다. 

 

16. Cinemachine Follow Camera

window > package manager packages-Unity Registry-search: cinemachine virtual camera에서 찾아 볼 수 있다. 

Cinemachine Brain component 추가를 하고 virtual camera에 거리 조정을 했다. 

이렇게 해서 메인 카메라 구도 밖으로 벗어난 메인 오브젝트(player) 를 초점으로 맞춘 virtual camera를 볼 수가 있다. 

https://docs.unity3d.com/Packages/com.unity.cinemachine@2.3/manual/index.html

 

Cinemachine Documentation | Package Manager UI website

Cinemachine Documentation Cinemachine is a suite of modules for operating the Unity camera. Cinemachine solves the complex mathematics and logic of tracking targets, composing, blending, and cutting between shots. It is designed to significantly reduce the

docs.unity3d.com

17. Basic Collision

기본적인 충돌을 만들기 위해서는 플레이어에게 질량을 더해주는 것이 중요하다

Add Component에 <RigidBody>를 추가하고 충돌할 경우 이벤트가 x,y,z 수평과 회전 측면에서 어떤 식으로 벌어질지 조정해줘야 한다. 때문에 Freeze position과 Freeze rotation 에 각각 y /  x,y,z 를 체크 표시해주었다 .

재밌는 것은 충돌을 했을 때 대부분 막히지만, 꼭짓점 부분에 계속 부딪힐 경우 박스가 뚫고 나간다는 것이다. 강의에서도 완벽한 충돌을 구현한 것이 아니라고 했는데 벽의 질량의 문제일지, 어떤 문제가 원인일지 그 이유가 궁금하다. 

 

 

 

출처

 https://coderzero.tistory.com/entry/%EC%9C%A0%EB%8B%88%ED%8B%B0-C-%EA%B0%95%EC%A2%8C-21-%EC%A0%9C%EB%84%A4%EB%A6%AD-%EC%BB%AC%EB%A0%89%EC%85%98General-Collection) https://itmining.tistory.com/46

Unity docs https://docs.unity3d.com/kr/560/Manual/

 

스크립트 생성 및 사용 - Unity 매뉴얼

게임 오브젝트의 동작은 연결된 컴포넌트 에 의해 조절됩니다. Unity 내장 컴포넌트는 다양한 목적으로 사용할 수 있지만 사용자 지정 게임플레이 기능을 구현하려면 충분하지 않은 경우가 많습

docs.unity3d.com