如何从同一个数组中先前实例化的对象上方的数组中实例化一个对象?

时间:2016-08-21 16:29:31

标签: c# arrays unity3d scripting instantiation

我已经搜索了很多但无法找到解决方案所以请求帮助。基本上我要做的就是你在简化的脚本中看到我已经制作了一个数组(它有三个项目,每个都是父项它的子对象)然后随机实例化这些项目。我想要的是第一个实例化应该发生在场景中已经存在的对象之上,但是第二个对象应该在上一个实例化对象上面实例化,第三个实例化在第二个实例化之上,等等。现在我认为我想要的是一种确定是否实例化的方法(如果这是不可能的话那么我们可以将实例化放在一个单独的函数中并检查是否发生了但是我不知道如何放置如果条件)发生了这两个检查,或者没有,这是if语句的条件,如果是,那么我需要对最后一次实例化的引用,所以我可以把它等于lastRedgeSet。如果有的话,请帮助并建议更好的方法 `

 public GameObject[] RedgeSets;
 private GameObject LastRedgeSet;
 public GameObject FixedRedges;
 private Object myist;
 void Start () {
     LastRedgeSet = FixedRedges;
     }

 void Update () {
     // if(instantiate happened or no Condition here){
     //LatRedgeSet = (refrence to last instantiated object required  here) }
     Vector3 LastRedgeSetPos = LastRedgeSet.transform.position;
     Vector3 addheight = new Vector3 (0, 5, 0);
     if (Input.GetKeyDown (KeyCode.Z)) {
         Instantiate (RedgeSets [UnityEngine.Random.Range (0, 3)], LastRedgeSetPos + addheight, Quaternion.identity);
     }

`

3 个答案:

答案 0 :(得分:0)

如果需要引用最后一个实例化对象,则Instantiate keyworked将返回已创建的Object。您可以将其强制转换为GameObject。

看起来应该是这样的:

public class Test: MonoBehaviour
{
    public GameObject[] RedgeSets;
    private GameObject lastInstanceObj;
    bool firstRun = true;

    void Update()
    {
        Vector3 addheight = new Vector3(0, 5, 0);
        if (Input.GetKeyDown(KeyCode.Z))
        {
            if (firstRun)
            {
                lastInstanceObj = Instantiate(RedgeSets[UnityEngine.Random.Range(0, RedgeSets.Length)], addheight, Quaternion.identity) as GameObject;
                firstRun = false;
            }
            else
            {
                lastInstanceObj = Instantiate(RedgeSets[UnityEngine.Random.Range(0, RedgeSets.Length)], lastInstanceObj.transform.position + addheight, Quaternion.identity) as GameObject;
            }
        }
    }
}

不幸的是,你甚至不需要获取引用来增加下一个GameObject的y-pos。您可以创建每次按z键时增加的值。

我不知道LastRedgeSetFixedRedges是什么,但下面应该做的工作。

public GameObject[] RedgeSets;
private Object myist;

const float incrementAmount = 5;
float currentIncremenet;

void Start()
{
    currentIncremenet = incrementAmount;
}

void Update()
{
    Vector3 addheight = new Vector3(0, currentIncremenet, 0);
    if (Input.GetKeyDown(KeyCode.Z))
    {
        Instantiate(RedgeSets[UnityEngine.Random.Range(0, 3)], addheight, Quaternion.identity);
        currentIncremenet += incrementAmount; //Inrement the next Y axis(Increments by 5)
    }
}

答案 1 :(得分:0)

我觉得你需要LinkedList<GameObject>

我真的不明白你想要检查什么,但无论如何,在谈到链接列表如何工作之后,你可能会想出整件事。

首先,您应该用链表替换您的数组:

public LinkedList<GameObject> RedgeSets = new LinkedList<GameObject>();

如果要实例化新事物,请致电AddLast

RedgeSets.AddLast(...);

你可以像这样访问你实例化的最后一件事:

LastRedgeSet = RedgeSets.Last.Value;

详细了解关键字列表here

我真的不明白你想要检查什么。也许你想在实例化新事物时执行一些代码?然后你应该看看事件 here

答案 2 :(得分:0)

还有另一种方式,  1)你可以使用多维数组A [i] [j],i =存储所有对象&amp;当我们将对象存储在数组A [i] [j]中时,j-全部存储为0。 然后,当您实例化对象时,在数组A [i] [j]的索引处,将j 0的值更改为1.

2)另一种方法是检查是否(abj == null) {not instanciated} 其他 {instanciated} 它可能有用。如果有效,请回复此答案。