Unity - 简单实例化的应用

项目描述:每帧实例化一个随机颜色的物体(Cube),坐标在某范围内随机;且物体每帧都会缩小,当缩小到一定的尺寸时,就销毁物体

代码描述:

public class CubeSpawner : MonoBehaviour
{

    public GameObject cubePrefabVar;    //实例化物体原型
    public List<GameObject> gameObjectList; //生成物体的表
    public float scalingFactor = 0.95f;     //每次缩小的比例
    public int numCubes = 0;    //生成物体编号

    void Start()
    {   
        gameObjectList = new List<GameObject>();    //初始化
    }

    void Update()
    {
        numCubes++;
        
        //实例化一个 cubePrefabVar物体,返回类型为GameObject,接受者是gObj
        GameObject gObj = Instantiate(cubePrefabVar) as GameObject;

        //设置物体的名字,并设置随机颜色
        gObj.name = "Cube " + numCubes;
        Color c = new Color(Random.value, Random.value, Random.value);
        gObj.GetComponent<MeshRenderer>().material.color = c;

        //物体的坐标随机分布在 球心(0,0,0) * 10 内
        gObj.transform.position = Random.insideUnitSphere * 10;

        //将新创建的物体添加到 已存物体表 内
        gameObjectList.Add(gObj);

        //同时创建 待删物体表
        List<GameObject> removeList = new List<GameObject>();
  
        //遍历 已存物体表
        foreach(GameObject goTemp in gameObjectList)
        {
            //缩小每一个 已存物体的几何尺寸
            float scale = goTemp.transform.localScale.x;
            scale *= scalingFactor;
            goTemp.transform.localScale = Vector3.one * scale;

            //当尺寸达到临界值,则将物体添加到 待删物体表
            if (scale <= 0.1f)
                removeList.Add(goTemp);
        }
        
        //遍历 待删物体表
        foreach(GameObject goTemp in removeList)
        {
            //移除对象并销毁
            gameObjectList.Remove(goTemp);
            Destroy(goTemp);
        }    

        //备注:C#不允许在遍历 当前List 的 foreach()内 修改当前List 内的元素;
        //故本例需要两个 foreach()配合实现功能
    }
}
posted @ 2019-06-01 21:09  SouthBegonia  阅读(1337)  评论(0编辑  收藏  举报