C# 为什么我的脚本会破坏资产?统一
在我的脚本中,我在transforms位置(C# 为什么我的脚本会破坏资产?统一,c#,unity3d,C#,Unity3d,在我的脚本中,我在transforms位置(emptyTransformsarray)实例化了障碍物(预制物存储在Prefablemsarray)。此脚本附加到世界的一部分gameobject。此段是动态实例化和销毁的 public class ObstaclePlacer : MonoBehaviour { public int obstaclesAmmount; public GameObject[] prefabObstacles; public Transform
emptyTransforms
array)实例化了障碍物(预制物存储在Prefablems
array)。此脚本附加到世界的一部分gameobject
。此段是动态实例化和销毁的
public class ObstaclePlacer : MonoBehaviour
{
public int obstaclesAmmount;
public GameObject[] prefabObstacles;
public Transform[] emptyTransforms;
public GameObject[] obstacles;
void Start()
{
GenerateObstacles();
}
void GenerateObstacles()
{
for(int i = 0; i < Random.Range(0,obstaclesAmmount); i++)
{
GameObject objToSpawn = prefabObstacles[Random.Range(0, prefabObstacles.Length)];
obstacles[i] = Instantiate(objToSpawn, (emptyTransforms[Random.Range(0, emptyTransforms.Length)].position+new Vector3(0.0f, 1.0f)), Quaternion.identity) as GameObject;
}
}
void OnDestroy()
{
foreach(GameObject item in obstacles)
{
Destroy(item);
}
}
}
public class ObstaclePlacer:monobhavior
{
公共int obstaclesamount;
公共游戏对象和障碍;
公共转换[]空转换;
公共游戏对象[]障碍;
void Start()
{
生成障碍();
}
void生成障碍物()
{
for(int i=0;i
此错误正在发生:
不允许销毁资产以避免数据丢失。如果确实要删除资产,请使用
DestroyImmediate(对象,true)代码>
单位引擎对象:销毁(对象)
ObstaclePlacer:ondestory()(位于Assets/Scripts/ObstaclePlacer.cs:37)
只有当障碍物数组大小固定时,它才起作用
你知道我该怎么解决吗?
如果你需要更多的细节,尽管问我。谢谢你的帮助 我认为这里的主要分歧在于理解数组在C#中的工作方式。初始化数组时必须声明数组的长度,这与其他集合(如泛型列表)不同,泛型列表允许您根据需要动态增长或收缩列表。不同的集合和数组之间存在更深层次的差异,在决定哪种集合和数组最适合您的应用程序之前,您需要了解这些差异
这个例子展示了如何在你的行为脚本的上下文中声明和初始化一个数组和一个游戏对象类型的通用列表的实例,很明显,你希望在你的实际脚本中使用其中一个
class ObstaclePlacer : MonoBehaviour
{
public int obstaclesAmmount;
public GameObject [] obstaclesArray;
public List<GameObject> obstaclesList;
public void Start ()
{
var random = new System.Random();
//Get the desired size of your array.
obstaclesAmmount = random.Next(0, 100);
//Initialize an array with the size of your random number
obstaclesArray = new GameObject [obstaclesAmmount];
//Or use a list which allows your to dynamically add elements later.
obstaclesList = new List<GameObject> ();
GenerateObstacles ();
}
void GenerateObstacles ()
{
for (int i = 0; i < obstaclesAmmount; i++) {
var gameObject = new GameObject();
obstaclesArray[i] = gameObject;
obstaclesList.Add(gameObject);
}
}
void OnDestroy ()
{
foreach (GameObject item in obstaclesArray) {
//Destroy (item);
Console.WriteLine ("Destroy (item); in obstaclesArray");
}
foreach (GameObject item in obstaclesList) {
//Destroy (item);
Console.WriteLine ("Destroy (item); in obstaclesList");
}
}
}
class ObstaclePlacer:monobhavior
{
公共int obstaclesamount;
公共游戏对象[]obstaclesArray;
公共列表障碍列表;
公共无效开始()
{
var random=新系统.random();
//获取所需的数组大小。
obstaclesammont=random.Next(01100);
//使用随机数的大小初始化数组
obstaclesArray=新游戏对象[obstaclesamount];
//或者使用一个列表,允许您以后动态添加元素。
obstaclesList=新列表();
生成障碍();
}
空洞生成障碍物()
{
for(int i=0;i
您有void OnDestroy()
,当该对象被销毁时,显然会调用它。在void ondestory()的代码中。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。你告诉它销毁所有其他物品。所以,它当然会这么做。@Joe Blow,但为什么它会破坏场景中的资产而不是游戏对象呢?Aleso它没有这样做,出现了这个错误。你在公共游戏对象[]障碍物
中分配了什么,它是否包括项目资产文件夹中的预制物?@HappyApple我犯了错误,因为障碍物
数组不应该是公共的。当我将其更改为private时,会发生以下错误:NullReferenceException:Object reference未设置为Object ObstaclePlacer.ondestory()
您的foreach应该是这样的foreach(障碍物中的游戏对象项){Destroy(item);}
!