【问题标题】:Creating a List of Unity Objects创建 Unity 对象列表
【发布时间】:2016-03-07 02:24:31
【问题描述】:

我正在尝试创建一条精灵。我创建了一个游戏对象列表,它似乎工作正常。除了我在游戏视图中有一个重复的对象,所以看起来我需要销毁我的“模板对象”。当我这样做时,它看起来不错,但是当我尝试移动它们时,它说我正在尝试访问已被破坏的对象。有人可以帮助解释我的问题吗?看来我对 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);
    }
}

【问题讨论】:

    标签: c# list unity3d gameobject


    【解决方案1】:

    由于您已将 symbolObject 添加到列表中,然后又销毁了相同的 symbolObject,因此当您尝试移动时,添加的对象不再存在(尽管引用保留在列表中)。

    GameObject():GameObject 在层次结构中创建一个新的 GameObject 并且 Instantiate(original:Object):Object 克隆一个对象。 当一个游戏对象被创建或克隆时,它也会出现在层次结构中。

    要让您的代码正常工作,请将实例化对象添加到列表中,然后销毁游戏对象。

    symbol.Add (Instantiate (symbol[symbol.Count-1], newPos, Quaternion.identity));
    Destroy (symbolObject);
    

    另一种方法是完全跳过实例化步骤,因为您每次都会创建一个新的游戏对象。

    但是,我建议您将游戏对象保留为预制件并从资源文件夹加载它并在所述对象上使用实例化。 阅读以下链接以了解如何使用资源加载文件夹(第二个示例还显示了如何为此使用实例化) http://docs.unity3d.com/ScriptReference/Resources.Load.html

    【讨论】:

    • 如果我跳过实例化如何轻松引用符号?这就是这份名单的目的?我最初在那里进行了破坏。销毁(symbolObject),但当它尝试加载 moveStripDown 函数时,它说“游戏对象已被销毁,但您仍在尝试访问它。”
    • 好的,我知道了。看起来 symbol.Add(symbolObject) 就是我所需要的。我仍然可以很容易地引用它们。我删除了实例化。谢谢。
    • 没问题,很高兴能帮上忙!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-07
    • 2017-06-26
    • 1970-01-01
    • 1970-01-01
    • 2018-01-02
    • 2018-05-25
    相关资源
    最近更新 更多