Episode 05
Spawn System——生成系统
Spawned
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Spawned : MonoBehaviour
{
//定义有多少波Enemy
public Wave[] waves;
public Enemy enemy;
Wave currenWave;//当前这波
int currentWaveNumber;//当前为第几波
int enemiesRemainingToSpawn;//剩余Enemy还没生成
int enemiesRemainingAlive;//剩余Enemy存活
float nextSpawmTime;//记录生成时间完成下一波生成
void Start()
{
NextWave();
}
void Update()
{
//生成Enemy
if (enemiesRemainingToSpawn > 0 && Time.time > nextSpawmTime)
{
enemiesRemainingToSpawn--;
nextSpawmTime = Time.time + currenWave.timeBetweenSpawns;
Enemy spawnedEnemy = Instantiate(enemy, Vector3.zero, Quaternion.identity) as Enemy;
spawnedEnemy.OnDeath += OnEnemyDeath;
}
}
//当Enemy死亡时调用
void OnEnemyDeath()
{
enemiesRemainingAlive--;
if (enemiesRemainingAlive == 0)
{
NextWave();
}
}
private void NextWave()
{
currentWaveNumber++;
print("Wave:" + currentWaveNumber);
if (currentWaveNumber - 1 < waves.Length)//防止数组越界
{
currenWave = waves[currentWaveNumber - 1];
enemiesRemainingToSpawn = currenWave.enemyCount;
enemiesRemainingAlive = enemiesRemainingToSpawn;
}
}
[System.Serializable]
//一波敌人有多少个,刷新间隔
public class Wave
{
public int enemyCount;
public float timeBetweenSpawns;
}
}
[System.Serializable]:在类之前加标记一个属性[Serializable],项目中为Wave。该属性指示其类将被序列化。序列是指将对象的实例状态存储到存储媒体的过程。Unity中增加了这个属性的字段会在检视面板中显示。
LivingEntity
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class LivingEnitity : MonoBehaviour, IDamageable
{
public float startingHealth;
protected float health;
protected bool dead;
public event System.Action OnDeath;
//赋初始生命值
protected virtual void Start()
{
health = startingHealth;
}
//被击中后health值减少到0,调用Die()
public void TakeHit(float damage, RaycastHit hit)
{
health -= damage;
if (health <= 0 && !dead)
{
Die();
}
}
protected void Die()
{
dead = true;
if (OnDeath != null)
{
OnDeath();
}
Destroy(gameObject);
}
}
public event System.Action OnDeath;:
-
委托:能够存储相同参数的方法。
-
代码逻辑:LivingEnitity中进行实例化OnDeath,Spawned中的Update()注册方法OnEnemyDeath()并多次添加该方法,当LivingEnitity在TakeHit中health归0时的Die()中调用。
-
event:用于声明发布服务器类中的事件,且通过使用同一个类或其他类中的委托与事件处理程序关联。
-
delegate:特别用于实现事件和回调方法。所有的委托(Delegate)都派生自 System.Delegate 类。
-
Action:系统内置(预定义)的一个委托类型,它可以指向一个没有返回值且没有参数的方法。
拓展: