我试图创造一条精灵。我创建了一个游戏对象列表,它似乎工作正常。除了我在游戏视图中有一个重复的对象,所以我似乎需要销毁我的"模板对象"。当我这样做它看起来很好,但是当我试图移动它们时它说我试图访问已被破坏的对象。有人可以帮助解释我的问题吗?我似乎对Instantiate以及它如何正常工作感到困惑。我的印象是,在实例化之前,对象不会在游戏视图中创建。但是为什么我会得到一个重复的对象?感谢您的投入。
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
public class ReelStrip : MonoBehaviour {
public List <Sprite> image = new List<Sprite>();
public List <int> index = new List<int>();
public List <GameObject> symbol = new List<GameObject> ();
public int reelNumber;
public float symbolHeight = 1.74f;
public float symbolWidth = 2.00f;
public float speed = 0.01f;
// Use this for initialization
void Start () {
reelNumber = 0;
loadStrip (new List<int>{0,0,1,2,4,1,4,5});
}
void addSymbol(int indexToAdd)
{
string name = "reelNum: " + reelNumber + " index " + indexToAdd;
SpriteRenderer renderer = new SpriteRenderer ();
GameObject symbolObject = new GameObject (name);
symbolObject.AddComponent<SpriteRenderer> ();
renderer = symbolObject.GetComponent<SpriteRenderer> ();
symbolObject.AddComponent<symbol> ();
Sprite loadedSprite = Resources.Load <Sprite>(symbolNameAtIndex(indexToAdd)) as Sprite;
renderer.sprite = loadedSprite;
symbol.Add (symbolObject);
Vector3 newPos;
if(symbol.Count<2)
{
newPos = new Vector3(0.0f,0.0f,0.0f);
}
else{
newPos = new Vector3(symbol[symbol.Count-1].transform.position.x,symbol[symbol.Count-1].transform.position.y + symbolHeight, 0.0f);
}
Instantiate (symbol[symbol.Count-1], newPos, Quaternion.identity);
// destroy template object
///// confused on the destroy //////
//Destroy (symbolObject);
}
public void moveStripDown(float delta)
{
for (int i=0;i<symbol.Count;i++)
{
symbol[i].transform.position = new Vector3(symbol[i].transform.position.x,symbol[i].transform.position.y - delta, symbol[i].transform.position.z);
}
}
public void loadStrip(List <int> Indexes)
{
for (int i=0;i<Indexes.Count;i++)
{
addSymbol (Indexes[i]);
}
}
public string symbolNameAtIndex(int index)
{
string returnString;
switch (index) {
case 0:
returnString = "img1";
break;
case 1:
returnString = "img2";
break;
case 2:
returnString = "img3";
break;
case 3:
returnString = "img4";
break;
case 4:
returnString = "img5";
break;
default:
returnString = "symbolnotfound";
break;
}
return returnString;
}
// Update is called once per frame
void Update () {
moveStripDown (speed*Time.deltaTime);
}
}
答案 0 :(得分:1)
由于您已将symbolObject添加到列表中并稍后销毁相同的symbolObject,因此当您尝试移动时,添加的对象不再存在(尽管引用保留在列表中)。
GameObject():GameObject在层次结构中创建一个新的GameObject并实例化(original:Object):Object克隆一个对象。 创建或克隆GameObject时,它也会出现在层次结构中。
要使代码正常工作,请将实例化对象添加到列表中,然后销毁游戏对象。
symbol.Add (Instantiate (symbol[symbol.Count-1], newPos, Quaternion.identity));
Destroy (symbolObject);
另一种方法是完全跳过实例化步骤,因为每次都会创建一个新的游戏对象。
但是,我建议您将游戏对象保留为预制件并从资源文件夹加载它并在所述对象上使用Instantiate。 阅读folloiwng链接,了解如何使用资源加载文件夹(第2个示例还说明了如何使用Instantiate) http://docs.unity3d.com/ScriptReference/Resources.Load.html