다운받은 나무나 바위 프리팹을 Trees 탭에 넣어주고 Terrain 위에 클릭하거나 드래그하는 방식으로 나무를 배치할 수 있다.
3. Polybrush
Polybrush는 메시(Mesh)의 표면을 직접 브러시처럼 수정할 수 있는 Unity 전용 툴이다.
Terrain을 쓰지 않고도 자연스러운 지형 느낌을 주고 싶을 때 사용하면 좋은 툴이다.
1. Sculpt
메시 표면의 버텍스를 위아래로 직접 이동시켜 굴곡이나 입체감을 표현할 수 있다. Terrain 없이 간단한 지형이나 암벽을 만들 때 유용하며, Smooth와 함께 사용하면 자연스러운 결과를 얻을 수 있다.
2. Smooth
Vertex 위치, Vertex Color, 텍스처 블렌딩 등의 결과를 자연스럽게 정리해 주는 브러시 굴곡이 심하거나 경계가 뚜렷한 부분을 부드럽게 연결할 때 사용한다.
3. Color
메시 표면에 버텍스 단위로 색상을 칠할 수 있는 기능. Vertex Color를 사용하는 셰이더와 함께 사용할 때만 반영됨.
4. Object
메시 표면 위에 오브젝트(프리팹)를 브러시처럼 배치할 수 있다. 나무, 풀, 돌 등 다양한 환경 프랍을 자연스럽게 뿌릴 때 사용하며, 랜덤 회전/스케일 등의 설정으로 반복 티를 줄일 수 있음.
5. Texture
메시 하나에 여러 텍스처를 섞어 칠할 수 있는 기능. 예를 들어 바위에 흙, 이끼, 눈 텍스처를 자연스럽게 섞을 수 있다. 텍스처 블렌딩을 지원하는 셰이더가 필요함.
4. C# 중급
1. 매개변수 활용
1.1. 일반 매개변수 (Call by Value)
public int number = 1;
void Start()
{
NormalParameter(number);
Debug.Log($"Call by Value : {number}"); // 1
}
private void NormalParameter(int num)
{
num = 10;
}
NormalParameter(number)를 호출하면, number의 값이 복사되어 전달된다.
즉, 메서드 안에서 값을 바꿔도 원래 변수에는 영향을 주지 않는다.
1.2. 참조 매개변수 (ref)
public int number = 1;
void Start()
{
ReferenceParameter(ref number);
Debug.Log($"Call by Reference : {number}"); // 20
}
private void ReferenceParameter(ref int num)
{
num = 20;
}
ref 키워드를 사용하면 원래 변수 자체를 참조해서 값을 바꾼다.
메서드 안에서 값을 수정하면, 호출한 쪽 변수도 같이 바뀐다.
1.3. 반환 전용 매개변수 (out)
public int number = 1;
public int number2;
void Start()
{
OutParameter(out number, out number2);
Debug.Log($"Call by Out : {number}, {number2}"); // 30, 50
}
private void OutParameter(out int num, out int num2)
{
num = 30;
num2 = 50;
}
out은 값을 메서드 내부에서 설정하고, 외부로 전달하기 위한 키워드.
초기화하지 않고 넘겨도 되고, 무조건 메서드 안에서 값을 할당해야 한다.
1.4. 선택적 매개변수 (Default)
void Start()
{
DefaultParameter(); // 값이 없어도 되고
DefaultParameter(5); // 있으면 해당 값으로 초기화 됨 number = 5
}
// 선택적 매개변수 (Default 매개변수) -> 매개변수에 값을 넣어둔 것
private void DefaultParameter(int num = 3)
{
number = num;
}
매개변수에 기본값을 지정해두면, 인자를 생략해도 호출 가능하다.
1.5. 배열 매개변수 (Array)
void Start()
{
int[] inArray = new int[3] { 10, 20, 30 }; // 크기가 정해져 있어서 값 추가 안됨
ArrayParameter(inArray);
}
private void ArrayParameter(int[] numbers)
{
foreach (var n in numbers)
{
Debug.Log(n);
}
}
이처럼 동일한 이름으로 여러 기능을 정의할 수 있는 것을 오버로딩(Overloading) 이라고 한다.
2. Static
C#에서 static 키워드는 정적(static) 멤버를 선언할 때 사용된다.
정적 멤버는 특정 인스턴스에 속하는 것이 아니라, 클래스 자체에 속하게 되는데
이 말은 즉, 클래스의 인스턴스를 만들지 않아도 바로 접근할 수 있다는 것을 의미한다.
using UnityEngine;
public class StudyStatic : MonoBehaviour
{
void Start()
{
Debug.Log($"정적 변수에 접근 : {StaticClass.number}");
}
public class StaticClass
{
public static StaticClass instance = new StaticClass();
public static int number = 10;
public StaticClass()
{
Debug.Log($"생성자 실행 : {number}");
}
}
}
StudyStatic 클래스의 Start() 메서드에서 new StaticClass()를 하지 않고도 StaticClass.number처럼 클래스 이름만으로 변수에 접근할 수 있다.
3. Partial
partial class는 부분 클래스란 뜻이고,
같은 이름의 클래스를 여러 파일이나 코드 블록에서 나눠서 정의할 수 있게 해준다.
public partial class StudyPartial : MonoBehaviour
{
private int nuber;
public void Start()
{
MethodA();
MethodB();
}
private void MethodA()
{
Debug.Log("MethodA");
}
}
StudyPartial이라는 클래스가 두 개로 나뉘어 정의되어 있음.
둘 다 partial 키워드를 사용했기 때문에 컴파일할 때 하나의 StudyPartial 클래스로 합쳐짐.
그래서 MethodA와 MethodB는 결국 하나의 클래스 안에 있는 두 개의 메서드가 됨.
Start() 메서드에서 MethodA()와 MethodB()를 호출하고 있어서, Unity 실행 시 두 메서드 모두 로그를 출력함.
동일한 멤버(변수, 메서드) 이름은 중복 선언하면 안 됨
모든 partial 블록은 접근 제어자(public/private 등), 상속 관계(MonoBehaviour 상속 여부) 등에서 일관성 있어야 함.