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.
Desafio
FácilUm Runner se junta ao Grunt: mais rápido, com menos vida. Dê a cada tipo seu próprio asset.
- Em
EnemyData.cs, faça com que EnemyData possa ser criado pelo menu Create, com o nome de menuTower Defense/Enemy Data, e adicione os campos públicosspeed(um float),maxHealthereward(ints). - Em
Enemy.cs, substitua o campospeedpor um campo públicodatado tipo EnemyData, e faça o inimigo se mover adata.speed. - Adicione um int privado
health, definido com o valor demaxHealthdo asset emAwake.
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
{
}
Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.