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的就这样