[U3D Learning Note] Unity C# Survival Guide (13) -- Lists

Lists

Similar to a array, a list is basically a form or data type that accepts multiple types. The only difference is that we can extend a list at runtime

我们在声明array时必须给阵列限定有限范围,给它一个固定大小的存储空间。而在List里面就不需要,你也可以初始化一个空间大小,但是可以后期增加。array是静态数组,而list是动态数组。

/// declare list and array    
	// List
    public List<GameObject> enemiesToSpawn = new List<GameObject>();
    // Array
    public GameObject[] objToSpawn = new GameObject[10]; 
// Add ele to list and array
	// List
	enemiesToSpawn.Add(new GameObject());    
    //array
    objToSpawn[0] = new GameObject();
// length
	// List
	enemiesToSpawn.Count
	// Array
	objToSpawn.length

Challenge: Build that Object list

题目和代码po上(和教程代码有一丢丢不一样
(注意一下存储实例化的物体的代码(差点又忘了

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

/// Challenge
    // create a list/array of 3 gameobjects to spawn and randomly spawn them with a random position on the screen
    // between -10 and 10 on the X/Y when u hit the space key. Every obj you spawn should be stored into a list called
    // objectCreated. when u have spawned 10 object, you will no longer be able to spawn objects and will turn all obj
    // created Green and then CLEAR the list
///


public class BuildThatObjList : MonoBehaviour
{
    public GameObject[] objToSpawn = new GameObject[3];
    public List<GameObject> objectCreated = new List<GameObject>();
    
    // Start is called before the first frame update
    void Start()
    {
        //objToSpawn[0] = GameObject.CreatePrimitive(PrimitiveType.Cube);
        //objToSpawn[1] = GameObject.CreatePrimitive(PrimitiveType.Cylinder);
        //objToSpawn[2] = GameObject.CreatePrimitive(PrimitiveType.Sphere);

    }

    // Update is called once per frame
    void Update()
    {
        if(Input.GetKeyDown(KeyCode.Space)){
            SpawnObjects();
        }
        if(objectCreated.Count >= 10){
            ClearList();
        }
    }

    void SpawnObjects(){
        var spawnObj = Instantiate(objToSpawn[Random.Range(0, objToSpawn.Length)], new Vector3(Random.Range(-10, 10), Random.Range(-10, 10), 0), Quaternion.identity) as GameObject; 
        objectCreated.Add(spawnObj);
        Debug.Log(spawnObj.transform.position);
    } 
    void ClearList(){
        foreach(var obj in objectCreated){
            obj.GetComponent<Renderer>().material.color = Color.green;
        }
        objectCreated.Clear();
    }
}

效果如下
在这里插入图片描述
这边仍有一个问题(见Start()部分被我注释掉的代码), 我试图在代码中直接把想要生成的物体放到数组中而不是通过面板进行操作(将预制件拖入脚本),但是这样做就有个问题,这个东西是会先渲染出来的。然后又试图通过objToSpawn[0].SetActive(false)的操作来阻止它渲染出来,但这会导致后面的生成也是无法渲染的,所以就想了个笨办法,在添加预生成物体的列表时,给每一个都设置为SetActive(false),在后面调用SpawnObjects()生成物体时设置为SetActive(true).修改后的代码如下(就只po改动的地方:

    void Start()
    {
        //GameObject copy = GameObject.CreatePrimitive(PrimitiveType.Cube) as GameObject;
        //copy.SetActive(false);
        objToSpawn[0] = GameObject.CreatePrimitive(PrimitiveType.Cube) as GameObject;
        objToSpawn[1] = GameObject.CreatePrimitive(PrimitiveType.Cylinder) as GameObject;
        objToSpawn[2] = GameObject.CreatePrimitive(PrimitiveType.Sphere) as GameObject;
        foreach(var obj in objToSpawn){
            obj.SetActive(false);
        }
    }
    void SpawnObjects(){
        var spawnObj = Instantiate(objToSpawn[Random.Range(0, objToSpawn.Length)], new Vector3(Random.Range(-10, 10), Random.Range(-10, 10), 0), Quaternion.identity) as GameObject; 
        spawnObj.SetActive(true);
        objectCreated.Add(spawnObj);
        Debug.Log(spawnObj.transform.position);
    } 

(最后一节没啥好po的就这样

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值