Menu
CoddyTech

Небольшие компоненты

Часть раздела Архитектура игр в Unity путешествия по Unity на Coddy. Урок 1 из 64.

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 на одном объекте, быстрый — на другом.

Компоненты одного объекта используют общий Transform, поэтому каждый из них должен изменять только ту часть, за которую отвечает. Mover, который прибавляет значения к x и z с помощью transform.position +=, не затрагивает y, поэтому Jumper на том же объекте всё ещё может изменять высоту. Mover, который задаёт всю позицию как new Vector3(x, 0.5f, z), каждый кадр возвращал бы y к прежнему значению и отменял прыжок.

challenge icon

Задание

Легко

Раздели Boat.cs так, чтобы каждый скрипт выполнял одну задачу.

  1. Перенеси покачивание в Bobber: startY задаётся в Start(), покачивание — в 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