Menu
CoddyTech

Dados dos inimigos

Lição 2 de 18 do curso Jogo de Unity: Defesa de Torres da Coddy.

Um jogo de defesa de torre tem vários tipos de inimigos: soldados, corredores rápidos, tanques lentos. Todos os soldados andam na mesma velocidade e começam com a mesma quantidade de vida, então esses valores pertencem ao tipo, não a um inimigo específico. Eles ficam em um asset ScriptableObject, um por tipo, e cada inimigo daquele tipo aponta para ele. Altere o asset, e todos os inimigos daquele tipo mudarão junto com ele.

Um asset não deve armazenar o estado de um inimigo específico. Um soldado que sofreu um golpe tem menos vida do que o soldado atrás dele, então o asset armazena maxHealth, a quantidade de vida com que um soldado começa, e cada inimigo copia esse valor para um campo próprio. Um jogo de corrida separa um carro da mesma maneira:

[CreateAssetMenu(fileName = "NewCar", menuName = "Racing/Car Data")]
public class CarData : ScriptableObject
{
    public float topSpeed = 30f;
    public float tankSize = 50f;
}

public class Car : MonoBehaviour
{
    public CarData data;
    private float fuel;

    void Awake()
    {
        fuel = data.tankSize;
    }
}

Todos os carros de um modelo compartilham um único CarData, e cada um consome seu próprio fuel. Escrever data.tankSize -= used em vez disso esvaziaria o tanque de todos os carros daquele modelo de uma só vez, e no Editor a alteração permaneceria no asset depois de Play. Awake é executado assim que o objeto é criado, então a cópia fica pronta antes que qualquer coisa possa usá-la.

challenge icon

Desafio

Fácil

Um Runner se junta ao Grunt: mais rápido, com menos vida. Dê a cada tipo seu próprio asset.

  1. Em EnemyData.cs, faça com que EnemyData possa ser criado pelo menu Create, com o nome de menu Tower Defense/Enemy Data, e adicione os campos públicos speed (um float), maxHealth e reward (ints).
  2. Em Enemy.cs, substitua o campo speed por um campo público data do tipo EnemyData, e faça o inimigo se mover a data.speed.
  3. Adicione um int privado health, definido com o valor de maxHealth do asset em Awake.

O projeto tem um asset GruntData (speed 2, health 9, reward 5) e um asset RunnerData (speed 3.5, health 5, reward 3), e o Inspector atribui um asset próprio a cada inimigo. Pressione Play e veja o Runner ultrapassar o Grunt; em seguida, clique em Check.

Experimente você mesmo

using UnityEngine;

// Vem depois: os atributos de um tipo de inimigo, como um asset.
public class EnemyData : ScriptableObject
{
}
quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Jogo de Unity: Defesa de Torres