为什么GameObject不会附加到列表中?

时间:2017-07-25 19:29:11

标签: c# list unity3d

我目前正在制作游戏原型,这个游戏需要  产生一些我称之为“星星”的GameObjects,一切都很好  实例化,但当我尝试删除它们时,有很多  在它周围不起作用,我试图把所有实例化  GameObjects在列表中然后从中删除最后一个对象  新的实例化了。从代码中可以看出,当3  产生的对象应该从头开始删除一个脚本  并在同一时间产生一个新的。

现在,问题是我不知道我在这里缺少什么,代码不起作用,我不知道为什么。请帮我。谢谢!

以下是代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class SpawnStar : MonoBehaviour {

    public float addedSpeed = -200f;

    private GameObject spawned;
    private float randomX;
    public GameObject starToSpawn;
    private List<GameObject> activeGO;


    void Start ()
    {
        activeGO = new List<GameObject> ();
        Invoke ("InstantiateStar", 2f);
    }

    // Update is called once per frame
    void FixedUpdate () 
    {
        GetComponent<Rigidbody>().AddForce( new Vector3( 0f, addedSpeed, 0f));
    }

    void InstantiateStar () 
    {
        randomX = Random.Range (-3f, 3f);
        GameObject GO;
        GO = Instantiate (starToSpawn, new Vector3(randomX, 5f, 0f), transform.rotation) as GameObject;
        activeGO.Add (GO);
        if ( activeGO[0].transform.position.y < -2f)
        {
            DeleteActiveGO ();
        }
    }
    void DeleteActiveGO ()
    {
        Destroy (activeGO [0]);
        activeGO.RemoveAt (0);
    }
}

我回来了。问题是我试图在一个脚本中做两件事...短篇小说:为了解决问题,我在场景中创建了一个空对象,将我的脚本分成两个独立的脚本,一个使得衍生对象移动得更快,一个产生对象的东西,我将移动对象的脚本放到将要生成的对象上,另一个脚本放在空的GameObject上,它将产生“星星”,它就像一个魅力。 谢谢你的所有答案!

这是最终的脚本:

  

产卵脚本:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class SpawnStars : MonoBehaviour {

    public GameObject[] starsToSpawn;

    private List<GameObject> spawnedStars;

    private float randomX;

    void Start () 
    {
        spawnedStars = new List<GameObject> ();
        InvokeRepeating ("SpawnStar", 0f, 3f);
    }
    void SpawnStar () 
    {
        randomX = Random.Range (-3, 3);
        GameObject GO;
        GO = Instantiate ( starsToSpawn[0], new Vector3 (randomX, 5f, 0f), transform.rotation);

        spawnedStars.Add (GO);

        if (spawnedStars.Count > 2 ) 
        {
            Destroy (spawnedStars [0]);
            spawnedStars.RemoveAt (0);
        }
    }
}
  

移动脚本:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class MoveStar : MonoBehaviour {

    public float acceleration = -5f;

    void FixedUpdate () 
    {
        GetComponent<Rigidbody>().AddForce( new Vector3( 0f, acceleration,0f));
    }
}

2 个答案:

答案 0 :(得分:0)

@Noobie :您要执行的操作称为对象池。你的实现是不正确的。

最好学习相同的知识并实施。

在此处阅读更多内容https://unity3d.com/learn/tutorials/topics/scripting/object-pooling

答案 1 :(得分:0)

您的代码Invoke ("InstantiateStar", 2f);只能拨打一次。

您可以更改为InvokeRepeating("InstantiateStar",2f,2f );

代码GetComponent<Rigidbody>().AddForce( new Vector3( 0f, addedSpeed, 0f));似乎应该附加到Generate Gameobject。

另请注意您的删除条件。

祝你好运。