작은 컴포넌트
Coddy Unity 여정의 Unity 게임 아키텍처 섹션에 포함된 레슨. 50개 중 1번째.
GameObject는 컴포넌트의 목록이며, 작성하는 각 스크립트는 그중 하나입니다. Unity 게임은 각 스크립트에 하나의 역할을 맡기고 여러 스크립트를 하나의 오브젝트에 추가하여 만듭니다. 플레이어의 이동, 사격, 체력은 모두 하나의 PlayerController에 넣을 수도 있지만, Mover, Shooter, Health라는 세 컴포넌트로 나누면 각 컴포넌트를 다른 오브젝트에도 추가할 수 있습니다.
public class Health : MonoBehaviour
{
public int hp = 3;
public void TakeDamage(int amount)
{
hp -= amount;
if (hp <= 0)
{
Destroy(gameObject);
}
}
}- 플레이어: Mover, Shooter, Health
- 포탑: Shooter, Health
- 상자: Health
순수 C# 클래스를 사용한다면 대신 계층 구조를 만들 수도 있습니다. Character 다음에 ShootingCharacter : Character, 그다음에 Player : ShootingCharacter를 만드는 식입니다. 포탑은 사격하지만 절대 걷지 않고, 상자는 부서지기만 하므로 새로운 오브젝트 종류를 추가할 때마다 계층 구조를 다시 구성해야 합니다. 컴포넌트를 사용하면 기존 스크립트를 새롭게 조합해 Inspector에서 함께 설정하는 것만으로 새로운 종류의 오브젝트를 만들 수 있으며, 각 스크립트는 그곳에서 고유한 값을 가질 수 있습니다. 한 오브젝트에는 느린 Mover를, 다른 오브젝트에는 빠른 Mover를 설정할 수 있습니다.
하나의 오브젝트에 있는 컴포넌트는 Transform을 공유하므로, 각 컴포넌트는 자신이 담당하는 부분만 변경해야 합니다. transform.position +=를 사용해 x와 z에 값을 더하는 Mover는 y를 그대로 두므로, 같은 오브젝트에 있는 Jumper가 높이를 변경할 수 있습니다. 위치 전체를 new Vector3(x, 0.5f, z)로 설정하는 Mover는 매 프레임 y를 다시 원래대로 설정해 점프를 취소합니다.
챌린지
쉬움Boat.cs는 한 번에 세 가지 일을 합니다. 화살표(Move 액션)로 보트를 조종하고, 보트는 파도에 따라 오르내리며, 램프는 깜박입니다. 오리에도 오르내리는 동작이 필요하고, 부표에는 오르내리는 동작과 깜박이는 동작이 필요하므로, 씬에는 이미 Bobber와 Blinker 컴포넌트가 있고 보트에는 세 컴포넌트가 모두 있습니다. Boat.cs를 다음과 같이 분리하세요.
- Bobber: 각 오브젝트는 시작한 높이를 기준으로
height단위만큼 위아래로, 각자의speed로 오르내립니다(Inspector에서 두 값을 모두 설정합니다). Bobber는 위치의 y만 변경하므로 보트는 계속 조종할 수 있습니다. - Blinker:
lamp(Renderer)를interval초마다 켜고 끕니다. - Boat에는 조종 기능만 남기세요. 오르내리는 동작과 깜박이는 동작, 그리고 관련 필드를 삭제하세요.
Play를 눌러 보트를 조종해 주변을 돌아다닌 다음, Check를 누르세요.
직접 해보기
using UnityEngine;
using UnityEngine.InputSystem;
// 스크립트 하나로 세 가지 작업을 처리합니다: 조향, 위아래로 흔들리기, 깜빡이기.
public class Boat : MonoBehaviour
{
public float speed = 3f;
public float bobHeight = 0.1f;
public float bobSpeed = 2f;
public Renderer lamp;
public float blinkInterval = 0.5f;
private InputAction moveAction;
private float startY;
private float blinkTimer;
void Start()
{
moveAction = InputSystem.actions.FindAction("Move");
startY = transform.position.y;
}
void Update()
{
// 조향
Vector2 input = moveAction.ReadValue<Vector2>();
transform.position += new Vector3(input.x, 0f, input.y) * speed * Time.deltaTime;
// 위아래로 흔들리기
Vector3 p = transform.position;
p.y = startY + Mathf.Sin(Time.time * bobSpeed) * bobHeight;
transform.position = p;
// 깜빡이기
blinkTimer += Time.deltaTime;
if (blinkTimer >= blinkInterval)
{
blinkTimer -= blinkInterval;
lamp.enabled = !lamp.enabled;
}
}
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.