重点还是水平不够, 研究了几个小时才稍微弄懂。
革命尚未成功,同志仍需努力,加油!
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; public class danli : MonoBehaviour { //脚本挂在一个空物体或者跟游戏管理脚本挂在一起(或许可以不用挂?)详询单例模式在unity中的用法 //字段 public static danli thisGameObject;//单例模式 //下面这句是用字典构造你的池子,字典里的String就是坑的名字,每一个坑对应一个GameObject列表 //字典与集合的嵌套 private Dictionary<string,List<GameObject>> pool = new Dictionary<string, List<GameObject>>(); //开始事件 Awake(),Start() void Awake() { thisGameObject = this; //单例模式 } //从池子得到物体的方法,传递两个参数,你需要得到的物体,和你需要放置的位置 //你所需的物体应该已经制作成预置物体 public GameObject GetPool(GameObject go, Vector3 position) { string key = go.name + "(Clone)";//要去拿东西的坑名字 , 也就是传递进来的物体的名字加上(Clone) GameObject rongqi;//你用来取物体的容器,当作中转站来用,可以理解为从池子到目的地的客车,把暂存的物体运到需要的地方去; //ContainsKey(TKey key);函数功能判断指定字典中是包含指定的键,有返回true,没有返回false. //TKey TKey代表的是类型 key 代表的是key,键。 使用此方法来判断是否存在坑。 理论上一个坑对应一个萝卜 //下面分三种情况来分析 if (pool.ContainsKey(key) && pool[key].Count>0) //如果坑存在,坑里有东西 { //直接拿走坑里面的第一个 rongqi = pool[key][0]; pool[key].RemoveAt(0); //拿走之后,把第一个位置释放 } else if (pool.ContainsKey(key) && pool[key].Count<=0) //坑存在,坑里没有东西 {
//这里修改成实际需要的 //那就直接初始化一个吧 rongqi=Instantiate(go,position, Quaternion.AngleAxis(Random.Range(-90.0f, 90.0f), new Vector3(0, 0, 1)), transform); } else //没坑 {
//这里修改成实际需要的 //不仅要初始化,还要把坑加上,新建一个坑 rongqi = Instantiate(go, position, Quaternion.AngleAxis(Random.Range(-90.0f, 90.0f), new Vector3(0, 0, 1)), transform); //初始化 pool.Add(key,new List<GameObject>(){}); } //调整物体初始状态 rongqi.SetActive(true); //这里加了一个子物体也显示的代码,可以不加 //foreach (Transform child in rongqi.transform) //{ // child.gameObject.SetActive(true); //遍历所有子物体,设置显示 //} //位置初始化
//这里根据需要修改位置,因为是false,true,并不是新建,注意重新初始化一下状态
//另外,如果start语句块里有东西需要一开始就执行,那么还是放在OnEnable事件中比较好 rongqi.transform.position = position; //rongqi.transform.rotation = Quaternion.AngleAxis(Random.Range(-90.0f, 90.0f), new Vector3(0, 0, 1)); return rongqi; } //放入池子的方法 public void IntoPool(GameObject go) { //理论上我们的东西是从坑里拿出来的,所以放物体进去的时候肯定有他的坑,可以直接放入,不用分情况了
//当然,这里也可以加一个没坑的判断 , 根据实际需要更改
string key = go.name; pool[key].Add(go); //入坑 go.SetActive(false); //隐藏 } /* *调用创建方法 * 添加进需要实例化物体的脚本内 void CreateKnife() { //获取坐标 Vector3 knifeVector3= Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, 1)); //调用对象池建造方法 GameObject knitmp=chiziDanli.GetPool(preKnifeGameObject, knifeVector3);//这句才是重点,上面那个只是示例,改成实际需要的vector3 //preKnifeGameObject 是预制体的GameObject 需要Resources.Load<GameObject>("预制体") } */ /* * 调用回收方法 *挂在要回收的物体身上的脚本,invoke定时执行或if 条件执行 void ForFalse() { chizidanli.IntPool(gameObject); } */ }