可复用代码之 对象池 又之个人简单理解

重点还是水平不够, 研究了几个小时才稍微弄懂。

革命尚未成功,同志仍需努力,加油!

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); } */ }
原文地址:https://www.cnblogs.com/madinglin/p/8577753.html