zoukankan      html  css  js  c++  java
  • unity3d对象池的使用

    说对象池之前首先来看看单例类和单例脚本的区别。这里有介绍

    http://blog.csdn.net/lzhq1982/article/details/12649281

    使用对象池的好处是不用每次都创建对象。销毁在创建,比如子弹的发射,当创建好的子弹。可以在使用后保存到对象池里面。当用的时候。直接从对象池中取即可

    这里随便举个列子

    鼠标左键单击发射蓝色球。右键发射红色球

    Main Camera挂载Fire.cs脚本

    GameObject挂载单列脚本ObjectPools.cs

    Fire.cs代码

     1 using UnityEngine;
     2 using System.Collections;
     3 
     4 public class Fire : MonoBehaviour
     5 {
     6 
     7     public GameObject builPrefabRed;
     8 
     9     public GameObject builPrefabGreen;
    10 
    11     GameObject o;
    12 
    13     // Use this for initialization
    14     void Start()
    15     {
    16 
    17     }
    18 
    19     // Update is called once per frame
    20     void Update()
    21     {
    22 
    23         if (Input.GetMouseButtonDown(1))
    24         {
    25 
    26             o = ObjectPools.Instance.MyInstantiate(builPrefabRed, transform.position, Quaternion.identity) as GameObject;
    27 
    28             //o = Instantiate(builPrefab, transform.position, Quaternion.identity) as GameObject;
    29 
    30             o.rigidbody.AddForce(Vector3.forward * 200);
    31 
    32             //Destroy(o, 2);
    33         }
    34         else if (Input.GetMouseButtonDown(0))
    35         {
    36             o = ObjectPools.Instance.MyInstantiate(builPrefabGreen, transform.position, Quaternion.identity) as GameObject;
    37 
    38             o.rigidbody.AddForce(Vector3.forward * 200);
    39         }
    40     }
    41 }

    ObjectPools.cs类

     1 using UnityEngine;
     2 using System.Collections;
     3 using System.Collections.Generic;
     4 
     5 /// <summary>
     6 /// 对象池脚本
     7 /// 
     8 /// 管理子弹。当子弹用完后。回收
     9 /// </summary>
    10 public class ObjectPools : MonoBehaviour
    11 {
    12 
    13     GameObject result;
    14 
    15     List<GameObject> poolsred;
    16 
    17 
    18     Dictionary<string, List<GameObject>> poolList;
    19 
    20 
    21     private static ObjectPools instance;
    22 
    23     public static ObjectPools Instance
    24     {
    25         get { return instance; }
    26         //set { ObjectPools.instance = value; }
    27     }
    28 
    29     void Awake()
    30     {
    31         poolsred = new List<GameObject>(); //实例化对象池
    32 
    33         instance = this; //单列
    34 
    35         poolList = new Dictionary<string, List<GameObject>>();
    36     }
    37     string tag;
    38     public GameObject MyInstantiate(GameObject prefab, Vector3 position, Quaternion rotation)
    39     {
    40         tag = prefab.tag;
    41         //如果有某个小集合的key,并且小集合内元素数量大于0
    42         if (poolList.ContainsKey(tag) && poolList[tag].Count > 0) //弹夹里面有子弹
    43         {
    44             result = poolList[tag][0];//取弹夹里面的第一颗子弹
    45             poolList[tag].Remove(result); //从弹夹移除子弹
    46 
    47             result.transform.position = position;
    48             result.transform.rotation = rotation;
    49         }
    50         else
    51         {
    52 
    53             if (!poolList.ContainsKey(tag))
    54             {
    55                 poolList.Add(tag, new List<GameObject>());
    56             }
    57             result = Instantiate(prefab, position, rotation) as GameObject;
    58         }
    59         //开启协程方法
    60         StartCoroutine(ReturnToPools(result));
    61         result.SetActive(true);
    62         return result;
    63     }
    64 
    65 
    66     /// <summary>
    67     /// 协程 同步方法 在同一个线程里面
    68     /// </summary>
    69     /// <param name="bullet"></param>
    70     /// <returns></returns>
    71     public IEnumerator ReturnToPools(GameObject bullet)
    72     {
    73         yield return new WaitForSeconds(2f); //等待2秒
    74 
    75         poolList[bullet.tag].Add(bullet);
    76 
    77         //poolsred.Add(bullet);
    78 
    79 
    80         //取消力
    81         bullet.rigidbody.velocity = Vector3.zero;
    82 
    83         bullet.SetActive(false);
    84     }
    85 
    86     // Use this for initialization
    87     void Start()
    88     {
    89 
    90     }
    91 
    92     // Update is called once per frame
    93     void Update()
    94     {
    95 
    96     }
    97 }
  • 相关阅读:
    实用机器学习 跟李沐学AI
    Explicitly drop temp table or let SQL Server handle it
    dotnettransformxdt and FatAntelope
    QQ拼音输入法 禁用模糊音
    (技术八卦)Java VS RoR
    Ruby on rails开发从头来(windows)(七)创建在线购物页面
    Ruby on rails开发从头来(windows)(十三)订单(Order)
    Ruby on rails开发从头来(windows)(十一)订单(Order)
    新员工自缢身亡,华为又站到了风口浪尖
    死亡汽油弹(Napalm Death)乐队的视频和来中国演出的消息
  • 原文地址:https://www.cnblogs.com/nsky/p/4625162.html
Copyright © 2011-2022 走看看