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


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

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

    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); } */ }
  • 相关阅读:
    了解 Spring Data JPA
    Spring MVC 方法注解拦截器
    Spring MVC拦截器+注解方式实现防止表单重复提交
    java中return语句的用法总结
    equal方法在String类与Object类中的区别
    instanceof用法
    EL 简介及用法
    JAVA 四大域对象总结
    JSP基本语法
    Servlet请求转发 RequestDispatcher接口知识点
  • 原文地址:https://www.cnblogs.com/madinglin/p/8577753.html
Copyright © 2020-2023  润新知