Unity运行后每帧报错:GetComponent无法获取ScriptableObject类型EnemieData
问题原因
你用GetComponent<EnemieData>()报错,是因为EnemieData是ScriptableObject,它不是挂载在GameObject上的组件。GetComponent只能获取继承自MonoBehaviour或Component的组件,ScriptableObject是独立的资源文件,不能通过这个方法获取。
解决方法
有两种常用的修正方式,选适合你项目的:
方式1:给敌人预制体加一个持有ScriptableObject的组件
在敌人预制体上挂载一个普通MonoBehaviour脚本,比如EnemyDataHolder:
using UnityEngine; public class EnemyDataHolder : MonoBehaviour { public EnemieData enemieData; // 在Inspector里拖入你的ScriptableObject资源 }
然后在生成脚本里,先获取这个Holder组件再拿数据:
// 替换原来的GetComponent行 EnemyDataHolder dataHolder = enemie.GetComponent<EnemyDataHolder>(); if(dataHolder != null && dataHolder.enemieData.spawnrate >= timeSinceLastSpawn) { SpawnEnemy(spawn, enemie); }
方式2:直接关联预制体和ScriptableObject
定义一个可序列化的类,把敌人预制体和对应的EnemieData绑定在一起:
using UnityEngine; using System.Collections.Generic; public class EnemieSpawn : MonoBehaviour { // 替换原来的enemies列表 [System.Serializable] public class EnemySpawnPair { public GameObject enemyPrefab; public EnemieData enemieData; } public List<Transform> spawnPoints; public List<EnemySpawnPair> enemySpawnPairs; // 现在直接在Inspector里配对预制体和数据 public bool spawn; public float timeSinceLastSpawn; public void Update() { timeSinceLastSpawn += Time.deltaTime; if (spawn) { foreach(var pair in enemySpawnPairs) { foreach (Transform spawnPoint in spawnPoints) { if (pair.enemieData.spawnrate >= timeSinceLastSpawn) { SpawnEnemy(spawnPoint, pair.enemyPrefab); } } timeSinceLastSpawn = 0; } } } public void SpawnEnemy(Transform spawnPoint, GameObject enemyPrefab) { Instantiate(enemyPrefab, spawnPoint.position, spawnPoint.rotation); } }
额外提示
你的原代码里还有个逻辑问题:嵌套foreach会让每个敌人在所有出生点都生成一次,而且每次遍历敌人都会重置timeSinceLastSpawn,可能不是你想要的效果,建议根据需求调整生成逻辑。
内容的提问来源于stack exchange,提问作者bob maximus
相关产品推荐
相关产品推荐

