-
<2일차> 유니티 컴포넌트와 스크립트 기초유니티 기초 프로그래밍 교육 2024. 3. 21. 14:58
1. Prefab
여러 게임 오브젝트를 동일한 형태로 미리 만들어놓고 필요한 곳에 사용할 수 있도록 하는 게임오브젝트의 템플릿이다. 게임 오브젝트에 포함된 모든 컴포넌트와 설정을 포함하며, 프리팹을 수정하면 그것을 이용한 모든 게임 오브젝트가 자동으로 업데이트된다.
2. Prototyping
Probuilder
3D 모델링과 레벨 디자인 툴의 하이브리드로 구조, 복잡한 터레인 요소, 차량, 무기 등 프로토타입을 빠르게 제작하거나 커스텀 콜리전 지오메트리, 트리거 구역 또는 내비 메시(nav mesh)를 만든다.
- 돌출: 면이나 열린 엣지를 선택하고 shift 키를 누른채로 이동, 회전, 확대/축소하여 돌출 또는 삽입이 가능해 원하는 형 태로 오브젝트를 제작할 수 있다.
- 폴리 셰이프(Poly shape): 씬 뷰에서 원하는 지점 클릭해 컨트롤 포인트를 추가하여 편집할 수 있다.
- 씬 내 UV컨트롤 : 텍스처 매핑을 사용하여 머티리얼을 오브젝트에 적용하고 오브젝트 UV의 오프셋(위치 조절), 회전 및 타일링을 조정하는 작업을 빠르고 쉽게 수행할 수 있다.
- 절차적 셰이프: 계단 같은 셰이프를 만들때 계단 한칸의 높이, 너비, 깊이 같은 고유 파라미터를 설정해 선택할 수 있다
- 버텍스 컬러링: 선택된 버텍스를 거리에 관계 없이 하나의 포인트로 축소하거나, 병합하거나, 연결하는 새로운 엣지를 만들거나 버텍스를 독립적으로 움직일 수 있도록 개별 버텍스로 분할할 수 있다.
라이트
우리는 게임에서 빛을 너무 많이 쓰면 렌더링할 범위가 넓어지고, 게임이 느려질 수 있으므로 최소화하여 사용해야 한다. 유니티에서 제공하는 빛의 종류에는 Point Light, Spot Light, Directional Light, Area Light가 있다. 원하는 형태에 맞춰 사용하면 된다. Mode는 기본적으로 Realtime으로 적용되어 있을텐데, Mixed(빛을 미리 입혀놓음), Baked(GI 및 그림자 등을 포함한 라이팅 정보를 미리 연산하여 텍스처로 저장하는 기능)을 이용하면 게임이 느려지지 않는다. 다만, Baked는 동적 오브젝트에 shadow가 적용되지 않기 때문에 Mixed 모드를 사용하는 것이 좋다.
라이트 베이킹
미리 빛을 연산하여 입혀놓자
- Window -> Rendering -> Lighting > Scene -> Lighting Settings -> New
- Lightmapper -> Progressive GPU > Generate Lighting
3. 스크립팅 기초
우리는 유니티로 게임을 제작할 때 스크립트를 작성해야 한다. 스크립트의 언어는 C#을 사용하며, 스크립트를 통해 게임 로직이나 AI, UI 등 게임의 여러 요소를 제어할 수 있다. 이렇게 만든 스크립트는 특정 게임 오브젝트에 붙여 해당 게임 오브젝트의 속성을 변경하거나, 다른 게임오브젝트와 상호작용할 수 있다.
유니티 프로젝트에서 새 스크립트를 만들면 C# 클래스가 생성되며 MonoBehavior을 상속받는다.
MonoBehavior은 유니티에서 제공하는 클래스로, 모든 스크립트의 기본 클래스이다. 이걸 상속받은 클래스는 Unity의 생명 주기 함수(Start, Update 등)를 사용할 수 있다.
그렇다면 '상속' 과 '클래스' 는 무엇일까?
클래스
클래스는 '설계도'같은 개념이다. 쉽게 말해 붕어빵 틀을 말하는 것이다. 그리고 붕어빵 틀로 찍어낸 각각의 붕어빵을 클래스를 통해 만들어진 '인스턴스'라고 볼 수 있다. 이 굽는 과정을 '인스턴스화'에 비유할 수 있다. 실제 데이터는 인스턴스에 저장된다. 이런 클래스는 객체 지향 프로그래밍에서 데이터와 이에 관련된 메서드를 함께 묶는 방법을 제공한다.
클래스의 내부에는 변수(속성)와 메서드(기능)을 선언할 수 있다. 클래스의 인스턴스는 'new'키워드를 사용해 생성한다. 예를들어 ClassName instance = new ClassName(); 은 ClassName 클래스의 인스턴스를 선언한것이다. 이렇게 만들어진 인스턴스를 통해 클래스의 필드와 메서드에 접근할 수 있다. 예를들어 CubeProperty.cubesize = 123123; , CubeProperty.cubeName = gameObject.name; 이런식으로 접근할 수 있다.
CubeProperty라는 클래스의 멤버변수로 cubeSize, cubeName을 선언했고, 메서드(BlaBlah())를 선언했다. 상속
상속은 한 클래스의 속성과 메서드를 다른 클래스가 물려받는 것이다. 부모 클래스에서 선언된 속성과 메서드를 자식 클래스에서 상속받고, 그 위에 추가적인 속성이나 메서드를 정의하여 확장할 수 있다.
MonoBehavior클래스를 상속한 RotateCube클래스를 선언하였다.
그리고 RotateXCube클래스는 RotateCube클래스를 상속하였다. C#에서는 ':"연산자를 사용하여 상속을 표현한다. 이렇게 되면 자식 클래스인 RotateXCube는 부모 클래스인 RotateCube의 속성, 메서드들을 갖게 된다. 다만 부모 클래스에서 Private으로 선언한 변수에는 접근하지 못한다. 만약 외부에서 접근하고 싶다면 따로 접근 함수를 public으로 둬서 해당 함수를 통해서 접근해야 한다. 위 코드에는 나와있지 않지만 protected로 선언한 변수는 자식 클래스에서만 해당 멤버에 대한 접근이 가능하고, 외부에서는 접근이 불가능하게 막는다. 그런데 위 코드에서 조금 생소한 표현을 확인할 수 있다. 바로 'virtual'과 'override'이다.
Polymorphism(다형성)
다형성은 부모의 속성을 다양한 자식들이 공통적으로 물려받을 수 있지만, 자식마다 다른 속성을 가질 수 있는 것이다. 상위 클래스의 참조를 통해 하위 클래스의 인스턴스를 가리키거나 메서드를 오버라이드 하여 사용하는 것이다.
오버라이딩은 부모 클래스의 메서드를 자식 클래스에서 재정의하여 자식 클래스의 동작에 맞게 변경하는 것이다. 다형성을 사용하기 위해서는 반드시 부모 클래스의 멤버함수를 virtual로 선언해야 override된 자식 클래스의 멤버변수를 사용할 수 있다. 위 코드를 다시 보자. 부모 클래스인 RotateCube의 마우스 좌클릭을 하면 돌고, 우클릭을 하면 반대로 도는 동작을 자식 클래스가 그대로 가져오고 싶다고 하자. 우선 부모 클래스에서 public virtual void Start()/ public virtual void Update()를 선언한 것을 볼 수 있다. 그리고 그것을 상속한 자식 클래스에서는 public override void Update()로 선언함을 보아 오버라이드 했으며, 부모의 마우스 좌클릭을 하면 돌고, 우클릭을 하면 반대로 도는 기능도 갖고, 스페이스를 누르면 x축 방향으로 돌아가는 기능도 추가로 갖게 된 것이다.
'유니티 기초 프로그래밍 교육' 카테고리의 다른 글
<3일차>씬 구성 (6) 2024.03.29 <1일차> 유니티 기초 (1) 2024.01.29