멋쟁이사자처럼/유니티 게임 개발 3기

[멋쟁이사자처럼 부트캠프 TIL 회고] 유니티 게임 개발 3기 4일차

MaterialStone 2024. 11. 22. 21:13
namespace UnityGameDevelopment.Day4 {
    public class Outline {
    	public static string Chapter1 = "프리팹";
        public static string Chapter2 = "머티리얼";
        public static string Chapter3 = "유니티 C# 프로그래밍 기초 3";
    }
}

 

 

1. 프리팹

프리팹

Unity의 프리팹 시스템을 이용하면 게임 오브젝트를 생성, 설정 및 저장할 수 있으며, 해당 게임 오브젝트의 모든 컴포넌트, 프로퍼티 값, 자식 게임 오브젝트를 재사용 가능한 에셋으로 만들 수 있습니다. 프리팹 에셋은 씬에 새로운 프리팹 인스턴스를 만들기 위한 템플릿 역할을 합니다.

유니티 공식 문서

 

프리팹은 월드 상의 오브젝트를 에셋으로 만든 것입니다. 하이어라키 뷰에서 게임 오브젝트를 프로젝트 뷰로 드래그하면 만들 수 있습니다. 프리팹을 수정하려면 프로젝트 뷰에서 프리팹을 더블클릭합니다. 프리팹 오브젝트만 수정할 수 있도록 씬 뷰가 변경됩니다.

 

2. 머티리얼

Unity에서 무언가를 드로우하려면 모양을 설명하는 정보와 표면의 형상을 설명하는 정보를 제공해야 합니다. 메시를 사용하여 모양을 설명하고 머티리얼을 사용하여 표면의 형상을 설명합니다.

유니티 공식 문서

 

머티리얼과 쉐이더

인스펙터 뷰에서의 머티리얼 정보

머티리얼과 셰이더는 밀접하게 연결되어 있어서 항상 머티리얼은 셰이더와 함께 사용합니다. 머티리얼은 셰이더 오브젝트에 대한 레퍼런스를 가지고 있습니다. 위 이미지의 머티리얼은 Standard 셰이더 오브젝트를 참조합니다.

머티리얼 속성

해당 셰이더 오브젝트가 머티리얼 프로퍼티를 정의하는 경우 머티리얼에는 컬러 또는 텍스처 레퍼런스와 같은 데이터도 포함될 수 있다.

머티리얼 에셋 만들기

생성 버튼으로 만드는 방법

  • 프로젝트 뷰에서 생성할 위치를 선택하기
  • + 버튼을 누르고 Material을 선택하기

컨텍스트 메뉴로 만드는 방법

  • 프로젝트 뷰에서 생성할 위치에 마우스 오른쪽 버튼을 클릭하여 컨텍스트 메뉴 열기
  • Create > Material 선택하기

머티리얼 속성

머티리얼의 쉐이더가 Standard Shader일 때의 속성을 알아봅니다.

  • Rendering Mode: 렌더링 방식
    • Opaque: 불투명
    • Transparent: 투명도 설정 가능
  • Albedo: 입힐 재질 이미지, 겉에 입힐 색상 변경 가능
  • Metalic: 금속성 정도
  • Smoothness: 난반사 정도
  • Normal Map: 각 위치에서 법선 벡터가 어느 방향을 가리키고 있는지를 나타내는 맵
  • Height Map: 각 위치마다 높이가 어느정도인지를 나타내는 맵
  • Occlusion: 차폐

 

3. 유니티 C# 프로그래밍 기초 3

접근제한자

접근제한자는 제 3자가 객체의 변수나 함수에 접근 가능 여부를 설정하는 키워드입니다. 예를 들어 유니티에서 캐릭터 스크립트와 게임 관리자 스크립트를 만들었다고 가정해봅시다. 게임 관리자 스크립트에서 캐릭터 객체를 만들어서 객체의 변수를 조정하고 싶습니다. 이때 캐릭터 클래스에서 변수의 접근 권한을 열어줄 수 있는데 이를 접근제한자로 관리합니다.

// Character.cs
public class Character {
    private int age = 20;
    public float movementSpeed = 10f;
}
// GameManager.cs
public class GameManager : Monobehaviour {
    void Start() {
    	Character character = new Character();
        character.movementSpeed = 20f;
        character.age = 21; // 여기서 오류 발생! private 변수는 외부에서 접근할 수 없습니다.
    }
}

 

public은 접근할 수 있는 멤버에게 붙여주는 접근제한자입니다.

private은 멤버에게 접근할 수 없도록 만들어주는 접근제한자입니다.

연산자

연산자 종류

  • 덧셈: 두 항을 더하는 연산자
  • 뺄셈: 두 항을 빼는 연산자
  • 곱셈: 두 항을 곱하는 연산자
  • 나눗셈: 두 항을 나누고 몫을 구하는 연산자
  • 나머지: 두 항을 나누고 나머지를 구하는 연산자
  • 비교: 두 항을 비교하여 참 혹은 거짓으로 나타내는 연산자
  • 논리: 두 항의 논리적 관계를 계산하여 참 혹은 거짓으로 나타내는 연산자
public class Example : MonoBehaviour
{
    int a = 20;
    int b = 3;
    int c = 10;
    int d = 12;
    
    void Start()
    {
        Debug.Log("a + b : " + (a + b)); // 덧셈, 23
        Debug.Log("a - b : " + (a - b)); // 뺄셈, 17
        Debug.Log("a * b : " + (a * b)); // 곱셈, 60
        Debug.Log("a / b : " + (a / b)); // 나눗셈, 6
        Debug.Log("a % b : " + (a % b)); // 나머지, 2
        
        Debug.Log("c < d : " + (c < d)); // c가 d보다 작다, true
        Debug.Log("c > d : " + (c > d)); // c가 d보다 크다, false
        Debug.Log("c == d : " + (c == d)); // c가 d와 같다, false
        
        Debug.Log("True && False : " + true && false); // &&: 그리고(and), false
        Debug.Log("True && False : " + true || false); // &&: 또는(or), true
        Debug.Log("!True : " + !true); // !: 반대, false
    }
}

 

축약형 연산자

a = a + 3;
a += 3; // 위 코드와 같은 동작을 수행합니다.

a -= 3;
a *= 3;
a /= 3;
a %= 3;

조건문

조건문은 논리값으로 코드 블럭을 수행할지의 여부를 결정하는 문법입니다.

 

기본 형태는 다음과 같습니다.

if (조건식)
{
	// 조건식이 참일 때 수행할 코드를 작성합니다.
}

 

조건식이 참이면 코드 블럭 내부의 코드를 실행합니다. 거짓이면 코드를 실행하지 않고 넘어갑니다.

 

조건식이 거짓일 때의 처리를 할 수 있도록 추가 문법을 제공합니다.

if (조건식)
{
    // 조건식이 참일 때 수행할 코드
}
else
{
    // 조건식이 거짓일 때 수행할 코드
}

 

조건문에 추가 조건식을 붙여 계속해서 분기할 수 있습니다.

if (조건식1) {
	// 조건식1이 참일 때 수행할 코드
}
else if (조건식2) {
	// 조건식2가 참일 때 수행할 코드
}
/* ... */
else {
	// 모든 조건식이 거짓일 때 수행할 코드, 생략 가능
}

 


실습 및 응용

▶ 어몽어스 캐릭터를 프리팹으로 만들고 복제하기

프리팹 만들기

어몽어스 캐릭터 그룹을 프로젝트 뷰에 드래그하면 프리팹이 만들어집니다.

어몽어스 캐릭터 프리팹

어몽어스 캐릭터 프리팹이 만들어졌습니다!

복제된 캐릭터

Ctrl+D를 눌러 캐릭터를 복제합니다.

복제된 캐릭터

씬 뷰에서 적절히 배치합니다. 귀엽네요.

 

 어몽어스 캐릭터에 색상 입히기

폴더 생성

어몽어스 캐릭터에 색상을 입히기 위해 머티리얼을 생성해야합니다. Materials 폴더를 먼저 만들어주었습니다.

머티리얼 생성

Materials 폴더에 머티리얼을 생성해줍니다. 이름은 Red라고 지어주었습니다.

인스펙터 뷰

머티리얼을 선택하고 인스펙터 뷰에서 머티리얼 속성을 확인합니다. 색상을 바꾸기 위해서 Albedo 속성의 색상 팔레트를 클릭하여 색을 변경합니다.

머티리얼

초록색, 파란색 머티리얼도 만들어줍니다.

머티리얼 적용

머티리얼 에셋을 드래그하여 씬 뷰의 오브젝트에 드래그합니다.

적용 완료

모두 색상을 입혔습니다. 이제 눈에 해당하는 고글을 푸른 투명한 색으로 만들고 싶습니다.

Goggle 머티리얼 생성

Goggle 머티리얼을 하나 만들어 줍니다.

투명도 조절

A 값을 조정하여 투명도를 조절합니다.

투명도가 적용된 머티리얼

투명한 머티리얼을 설정하기 위해 렌더링 모드를 Transparent로 바꿔줍니다. 그리고 머티리얼을 고글에 적용해줍니다.

적용 완료

이제야 그럴싸해졌네요.

 

 머티리얼 다운로드 받아서 적용해보기

머티리얼 에셋 공유 사이트

 

ambientCG - CC0 Textures, HDRIs and Models

Free 3D Assets Never Looked This Good! Get 2000+ PBR Materials, HDRIs and more for free under the Public Domain license.

ambientCG.com

다운로드한 머티리얼

바닥재 적절한 것을 다운로드 받았습니다. 압축도 풀어줍니다.

 

바닥

지형 오브젝트의 머티리얼을 적용해보겠습니다.

Floor 머티리얼

프로젝트 뷰에서 Floor라는 이름의 머티리얼을 생성합니다.

다운로드 받은 리소스

다운로드 받은 머티리얼 리소스의 압축을 풀어줍니다. 프로젝트 뷰에 머티리얼 리소스 폴더를 프로젝트 폴더에 드래그합니다.

머티리얼 적용

메인 이미지를 Albedo 속성의 박스에 드래그합니다. 그리고 Normal Map 속성에 DX 혹은 GL 중에 하나를 적용합니다. Height Map 속성에는 Displacement라는 단어를 포함하는 에셋을 적용합니다. Occlusion 속성에는 AmbientOcclusion이라는 단어를 포함하는 에셋을 적용합니다. 그런 다음에 Floor 머티리얼을 평면 오브젝트에 적용합니다.

평면 오브젝트에 적용시킨 모습

드디어 어몽어스 캐릭터들이 아늑하게 쉴 수 있겠네요.