https://preview.redd.it/c3xtjb90ebyg1.jpg?width=1902&format=pjpg&auto=webp&s=d6b29973d4addda8e61a250f8559fc044f9a9167

我当前有一个游戏,其中有各种类型的敌人,我想尝试通过一些方式来生成很多不同的变体而不必制作成百上千个不同的预设。因此,我尝试使用可脚本化对象来持有不同的属性,如下所示。

[CreateAssetMenu(fileName = "EnemyType", menuName = "EnemySpawner/EnemyTypeScript")]
//创建可编辑对象,用于敌人数据

public class SpawnerData : ScriptableObject
{
    // enemyHealth 的基本生命值
    public int enemyHealth = 1;
    // enemyType 敌人类型
    public GameObject enemyType;
    // spawnPoint 敌人生成位置
    public Transform spawnPoint;
    // enemySpeed 敌人速度
    public float enemySpeed = 2;
    // movementAngle 敌人移动角度
    public float movementAngle = 0;
}

然后Enemy这个类的脚本如下:

public class EnemyTest : MonoBehaviour
{
[SerializeField] //该变量将在Inspector中显示
public int enemyHealth; //敌人的原始生命值
public float enemySpeed; //敌人的原始速度
public float movementAngle; //敌人的原始移动角度
[SerializeField]
private EnemyTest configuration; //配置的脚本

private void Start()
{
enemyHealth = configuration.enemyHealth; //将配置文件中的生命值赋值给当前游戏中的 enemy
enemySpeed = configuration.enemySpeed; //将配置文件中的速度赋值给当前游戏中的 enemy
movementAngle = configuration.movementAngle; //将配置文件中的角度赋值给当前游戏中的 enemy
}
}

现在我想知道,是否可以在Enemy Spawner中通过代码来获取不同的配置,如果不能,那么我就必须将所有不同类型的预设都加载到场景中了,这整个思路都变得毫无意义了。什么方法可以解决这个问题呢?

public class EnemySpawner : MonoBehaviour
{   [SerializeField]
    private GameObject enemyType;  //要生成的敌人类型
    [SerializeField]
    private float enemyInterval = 0f;  //生成间隔

    private EnemyTest configuration;  //用于存储不同的参数值
    private SpawnerData enemyData = null;  //用于存储EnemyType的数据

    void Start()
    {
        StartCoroutine(spawnEnemy(enemyInterval,enemyType));  //开始生成敌人
    }
    private IEnumerator spawnEnemy(float interval, GameObject enemy)
    {   yield return new WaitForSeconds(interval * Time.deltaTime);  //延迟一段时间
        GameObject newEnemy = Instantiate(enemy, new Vector3(0, 0, 0), Quaternion.identity);  //实例化敌人
    }
}