【问题标题】:how to instantiate an object from an array above the previously instantiated object from the same array?如何从同一数组中先前实例化的对象上方的数组中实例化一个对象?
【发布时间】:2016-08-21 16:29:30
【问题描述】:

我已经搜索了很多,但找不到解决方案,所以请帮忙。基本上,我要做的是正如您在简化的脚本中看到的那样,我制作了一个数组(它有三个项目,每个项目都是父项它的子对象)然后随机实例化这些项目。我想要的是第一个实例应该发生在场景中已经存在的对象之上,但是第二个对象应该在前一个实例化对象之上实例化,第三个对象应该在第二个实例之上实例化和很快。现在我想我想要的是一种方法来确定是否实例化(如果这是不可能的,那么我们可以将实例化放在一个单独的函数中并检查是否发生了这种情况,但我不明白如何放置其中任何一个两次检查 if 条件) 是否发生,这是 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);
     }

`

【问题讨论】:

    标签: c# arrays unity3d scripting instantiation


    【解决方案1】:

    如果您需要获取对最后一个实例化对象的引用,则 Instantiate 键会返回创建的对象。您可以将其转换为 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)
        }
    }
    

    【讨论】:

    • 非常感谢您的解决方案,我试过了,效果很好,但有一个问题...由于数组中的对象长度不同,因此对象彼此实例化,但高度确实增加了...遇到这个问题,我想在先前实例化的对象之上实例化对象,因为我使用变量 lastredgeset redgeset 实际上是对象的名称...使用您的第一个解决方案会出现无法将对象转换为游戏对象的错误,请帮助还有一点
    • @Momin “由于数组中的对象长度不同,因此对象彼此实例化,但高度确实增加了”我现在完全理解了这个问题。修复了问题。在我的答案中使用第一个代码。我测试了它并且它有效。如果您的问题得到解决,请不要忘记接受答案。此外,我还修复了一些其他问题。使用数组时,不要对其进行硬编码。它不应该是Random.Range (0, 3)]。应该是Random.Range(0, RedgeSets.Length)]
    • 感谢您再次回复,幸运的是我在您回复之前得到了另一个解决方案,但这也可以,我会使用它...将接受作为答案:)
    【解决方案2】:

    我觉得你需要LinkedList<GameObject>

    我不太明白你想检查什么,但无论如何,在我讨论了链表的工作原理之后,也许你会弄清楚整个事情。

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

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

    当你想实例化一个新事物时,调用AddLast

    RedgeSets.AddLast(...);
    

    你可以像这样访问你最后实例化的东西:

    LastRedgeSet = RedgeSets.Last.Value;
    

    详细了解链表here

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

    【讨论】:

    • 感谢您的建议...幸运的是,我找到了另一种完美的方法,只需对我的代码进行少量更改
    【解决方案3】:

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

    2) 另一种方法是检查 if(abj==null) {未实例化} 别的 {实例化} 它可能有效。如果有效,请回复此答案。

    【讨论】:

    • 感谢您的回答..幸运的是,我找到了另一种只需稍加改动即可完美运行的方法
    猜你喜欢
    • 2014-10-31
    • 1970-01-01
    • 2012-01-13
    • 1970-01-01
    • 2012-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多