Unity:在 GameObject 上实例化预制件 - 错误对象为空
Unity: Instantiating prefab on GameObject - Error Object is null
在我的 Unity 游戏中,我有一个使用 Edy 的车辆物理资产的车辆预制件。我正在尝试根据 GameObject 的位置和旋转实例化选定的车辆预制件。
当 运行 我的代码在场景中生成载具时出现此错误
ArgumentException: The Object you want to instantiate is null
ArgumentException: The Object you want to instantiate is null.
UnityEngine.Object.CheckNullArgument (System.Object arg, System.String message) (at C:/buildslave/unity/build/Runtime/Export/UnityEngineObject.cs:239)
UnityEngine.Object.Instantiate (UnityEngine.Object original, Vector3 position, Quaternion rotation) (at C:/buildslave/unity/build/Runtime/Export/UnityEngineObject.cs:151)
UnityEngine.Object.Instantiate[VehicleController] (EVP.VehicleController original, Vector3 position, Quaternion rotation) (at C:/buildslave/unity/build/Runtime/Export/UnityEngineObject.cs:206)
VehicleSpawner.spawnVehiclesInFirstGarage () (at Assets/Scripts/VehicleSpawner.cs:44)
HandleGarage.Start () (at Assets/Scripts/HandleGarage.cs:59)
Vehicle Prefab 为空,因为车辆将由用户在游戏中选择。 (即使我 select 一个车辆预制件我仍然得到同样的错误)
我在游戏对象上实例化车辆预制件的代码
public EVP.VehicleTelemetry telemetryComponent;
public EVP.VehicleController vehiclePrefab;
public GameObject spawnObject;
public void spawnVehiclesInFirstGarage ()
{
// Load saved JSON
string jsonData = SecurePlayerPrefs.GetString ("vehicleNames");
// Convert to Class
Database loadedData = JsonUtility.FromJson<Database> (jsonData);
// Loop through Owned Vehicles Garage
for (int i = 0; i < loadedData.vehicleNames.Count; i++) {
// Set up instantiate
var vehicle = Resources.Load("Prefabs/" + (loadedData.vehicleNames [i]));
vehiclePrefab = vehicle as EVP.VehicleController;
// Spawn vehicle on game object
EVP.VehicleController newVehicle = Instantiate(vehiclePrefab, spawnObject.transform.position, spawnObject.transform.rotation) as EVP.VehicleController;
telemetryComponent.target = newVehicle;
}
}
可能的解决方案
vehiclePrefab = vehicle as EVP.VehicleController;
可能会导致问题,因为记录 var vehicle = Resources.Load("Prefabs/" + (loadedData.vehicleNames [i]));
已经给出 Sport Coupe (UnityEngine.GameObject)
,这是正确的类型。
而不是使用 as EVP.VehicleController
,尝试:
// Set up instantiate
var vehiclePrefab = Resources.Load("Prefabs/" + (loadedData.vehicleNames [i])) as GameObject;
// Spawn vehicle on game object
GameObject newVehicle = Instantiate(vehiclePrefab, spawnObject.transform.position, spawnObject.transform.rotation);
EVP.VehicleController controller = newVehicle.GetComponent<EVP.VehicleController>();
telemetryComponent.target = newVehicle;
本文来自Unity's documentation for loading prefabs via scripting.
从错误信息来看,似乎是在void Start()
中调用了spawnVehiclesInFirstGarage()
。如果是这样,请尝试将其放入 void Update()
,添加一个 if( prefab != null && !isInstantiated)
检查。
其他故障排除(如果解决方案不起作用)
- 尝试通过检查器分配预制件,看看是否遇到同样的问题。
- 在您现有的代码上,尝试
Debug.Log(vehiclePrefab)
。
在我的 Unity 游戏中,我有一个使用 Edy 的车辆物理资产的车辆预制件。我正在尝试根据 GameObject 的位置和旋转实例化选定的车辆预制件。
当 运行 我的代码在场景中生成载具时出现此错误
ArgumentException: The Object you want to instantiate is null
ArgumentException: The Object you want to instantiate is null. UnityEngine.Object.CheckNullArgument (System.Object arg, System.String message) (at C:/buildslave/unity/build/Runtime/Export/UnityEngineObject.cs:239) UnityEngine.Object.Instantiate (UnityEngine.Object original, Vector3 position, Quaternion rotation) (at C:/buildslave/unity/build/Runtime/Export/UnityEngineObject.cs:151) UnityEngine.Object.Instantiate[VehicleController] (EVP.VehicleController original, Vector3 position, Quaternion rotation) (at C:/buildslave/unity/build/Runtime/Export/UnityEngineObject.cs:206) VehicleSpawner.spawnVehiclesInFirstGarage () (at Assets/Scripts/VehicleSpawner.cs:44) HandleGarage.Start () (at Assets/Scripts/HandleGarage.cs:59)
Vehicle Prefab 为空,因为车辆将由用户在游戏中选择。 (即使我 select 一个车辆预制件我仍然得到同样的错误)
我在游戏对象上实例化车辆预制件的代码
public EVP.VehicleTelemetry telemetryComponent;
public EVP.VehicleController vehiclePrefab;
public GameObject spawnObject;
public void spawnVehiclesInFirstGarage ()
{
// Load saved JSON
string jsonData = SecurePlayerPrefs.GetString ("vehicleNames");
// Convert to Class
Database loadedData = JsonUtility.FromJson<Database> (jsonData);
// Loop through Owned Vehicles Garage
for (int i = 0; i < loadedData.vehicleNames.Count; i++) {
// Set up instantiate
var vehicle = Resources.Load("Prefabs/" + (loadedData.vehicleNames [i]));
vehiclePrefab = vehicle as EVP.VehicleController;
// Spawn vehicle on game object
EVP.VehicleController newVehicle = Instantiate(vehiclePrefab, spawnObject.transform.position, spawnObject.transform.rotation) as EVP.VehicleController;
telemetryComponent.target = newVehicle;
}
}
可能的解决方案
vehiclePrefab = vehicle as EVP.VehicleController;
可能会导致问题,因为记录var vehicle = Resources.Load("Prefabs/" + (loadedData.vehicleNames [i]));
已经给出Sport Coupe (UnityEngine.GameObject)
,这是正确的类型。而不是使用
as EVP.VehicleController
,尝试:// Set up instantiate var vehiclePrefab = Resources.Load("Prefabs/" + (loadedData.vehicleNames [i])) as GameObject; // Spawn vehicle on game object GameObject newVehicle = Instantiate(vehiclePrefab, spawnObject.transform.position, spawnObject.transform.rotation); EVP.VehicleController controller = newVehicle.GetComponent<EVP.VehicleController>(); telemetryComponent.target = newVehicle;
本文来自Unity's documentation for loading prefabs via scripting.
从错误信息来看,似乎是在
void Start()
中调用了spawnVehiclesInFirstGarage()
。如果是这样,请尝试将其放入void Update()
,添加一个if( prefab != null && !isInstantiated)
检查。
其他故障排除(如果解决方案不起作用)
- 尝试通过检查器分配预制件,看看是否遇到同样的问题。
- 在您现有的代码上,尝试
Debug.Log(vehiclePrefab)
。