Menu
CoddyTech

작은 컴포넌트

Coddy Unity 여정의 Unity 게임 아키텍처 섹션에 포함된 레슨. 64개 중 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에서 함께 붙이는 것만으로 새로운 종류의 오브젝트를 만들 수 있으며, 각 스크립트에는 Inspector에서 고유한 값을 설정할 수 있습니다. 한 오브젝트에는 느린 Mover를, 다른 오브젝트에는 빠른 Mover를 붙일 수 있습니다.

하나의 오브젝트에 붙은 컴포넌트는 Transform을 공유하므로 각 컴포넌트는 자신이 담당하는 부분만 변경해야 합니다. transform.position +=를 사용해 x와 z에 값을 더하는 Mover는 y를 그대로 두므로, 같은 오브젝트에 있는 Jumper가 높이를 계속 변경할 수 있습니다. 위치 전체를 new Vector3(x, 0.5f, z)로 설정하는 Mover는 매 프레임 y를 원래대로 되돌려 점프를 취소합니다.

challenge icon

챌린지

쉬움

Boat.cs를 분리하여 각 스크립트가 하나의 작업만 수행하게 하세요.

  1. 위아래로 움직이는 동작을 Bobber로 옮기세요. Start()에서 startY를 설정하고, Update()에서 자체 height와 speed를 사용해 위아래로 움직이게 하세요.
  2. 깜박이는 동작을 자체 타이머와 함께 Blinker로 옮기세요.
  3. Boat에서 두 작업과 해당 필드를 모두 삭제하여 조종만 하도록 하세요.

‘플레이’를 누르세요. 오리가 위아래로 움직이고, 부표가 깜박이며, 보트가 조종됩니다. 그런 다음 ‘확인’을 누르세요.

직접 해보기

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;
        }
    }
}

Unity 게임 아키텍처의 모든 레슨

직접 연습해 보세요: Unity 플레이그라운드