Episode 05

发布时间 2023-03-22 21:08:46作者: Felix-Fu

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中进行实例化OnDeathSpawned中的Update()注册方法OnEnemyDeath()并多次添加该方法,当LivingEnitityTakeHithealth归0时的Die()中调用。

  • event:用于声明发布服务器类中的事件,且通过使用同一个类或其他类中的委托与事件处理程序关联。

  • delegate:特别用于实现事件和回调方法。所有的委托(Delegate)都派生自 System.Delegate 类。

  • Action:系统内置(预定义)的一个委托类型,它可以指向一个没有返回值且没有参数的方法。

拓展: