创建 Unity 对象列表
Creating a List of Unity Objects
我正在尝试创建一条 sprite。我创建了一个游戏对象列表,它似乎工作正常。除了我在游戏视图中有一个重复的对象,所以我似乎需要销毁我的 "template object"。当我这样做时它看起来不错,但是当我尝试移动它们时它说我正在尝试访问一个已被销毁的对象。有人可以帮助解释我的问题吗?看来我对 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);
}
}
由于您已将 symbolObject 添加到列表中,随后销毁了相同的 symbolObject,因此当您尝试移动时添加的对象不再存在(尽管引用保留在列表中)。
GameObject():GameObject 在层次结构中创建一个新的 GameObject,Instantiate(original:Object):Object 克隆一个对象。
创建或克隆 GameObject 时,它也会出现在层次结构中。
要使您的代码正常运行,请将实例化对象添加到列表中,然后销毁游戏对象。
symbol.Add (Instantiate (symbol[symbol.Count-1], newPos, Quaternion.identity));
Destroy (symbolObject);
另一种方法是完全跳过实例化步骤,因为您每次都会创建一个新的游戏对象。
但是,我建议您将游戏对象保留为预制件并从资源文件夹中加载它并在所述对象上使用 Instantiate。
阅读 folloiwng link 了解如何使用资源加载文件夹(第二个示例还展示了如何为此使用 Instantiate)
http://docs.unity3d.com/ScriptReference/Resources.Load.html
我正在尝试创建一条 sprite。我创建了一个游戏对象列表,它似乎工作正常。除了我在游戏视图中有一个重复的对象,所以我似乎需要销毁我的 "template object"。当我这样做时它看起来不错,但是当我尝试移动它们时它说我正在尝试访问一个已被销毁的对象。有人可以帮助解释我的问题吗?看来我对 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);
}
}
由于您已将 symbolObject 添加到列表中,随后销毁了相同的 symbolObject,因此当您尝试移动时添加的对象不再存在(尽管引用保留在列表中)。
GameObject():GameObject 在层次结构中创建一个新的 GameObject,Instantiate(original:Object):Object 克隆一个对象。 创建或克隆 GameObject 时,它也会出现在层次结构中。
要使您的代码正常运行,请将实例化对象添加到列表中,然后销毁游戏对象。
symbol.Add (Instantiate (symbol[symbol.Count-1], newPos, Quaternion.identity));
Destroy (symbolObject);
另一种方法是完全跳过实例化步骤,因为您每次都会创建一个新的游戏对象。
但是,我建议您将游戏对象保留为预制件并从资源文件夹中加载它并在所述对象上使用 Instantiate。 阅读 folloiwng link 了解如何使用资源加载文件夹(第二个示例还展示了如何为此使用 Instantiate) http://docs.unity3d.com/ScriptReference/Resources.Load.html