对象池的实现------基于Unity,模拟创建子弹

  最近闲来无事,利用空余时间写了一个对象池。

  首先,什么是对象池呢?

  举一个例子。在我们玩FPS类型的游戏的时候(这里就举例《守望先锋吧》),点击鼠标左键便会进行射击,会“创建”出子弹。而此时,随着游戏的不断进行(如果一局进行了20分钟),便会“创建”成千上万颗子弹,如果我们每点击一下鼠标就New一个对象,我想,不管是多牛B的电脑恐怕也吃不消。所以,我们需要一个对象池来进行对象的管理。

图示:

A.接下来,我们来实现代码。

1.创建对象池脚本 “GameObjectManager.cs”

using UnityEngine;
using System.Collections;
using System.Collections.Generic;

//存储对象的名字
public class GameObjectName
{
    public static string g_ButtleName = "g_Buttle";
}

//碰撞标签
public class Tags
{
    public static string g_Wall = "Wall";
}

public class GameObjectManager : MonoBehaviour
{
    //简单单例:“粗制滥造型”
    public static GameObjectManager _Instance;

    //字典
    public Dictionary<string, List<GameObject>> m_dic;

    void Awake()
    {
        _Instance = this;
        m_dic = new Dictionary<string, List<GameObject>>();
    }

    void Start ()
    {
        //1.初始化子弹的表
        Debug.Log("初始化 子弹");
        GameObject go = GameObject.Instantiate(Resources.Load("Prefabs/g_Buttle")) as GameObject;
        Init(GameObjectName.g_ButtleName, go);

    }

    //初始化对象池里面的某个对象
    public void Init(string _name, GameObject go)
    {
        List<GameObject> m_list = new List<GameObject>();
        m_list.Add(go);
        m_dic.Add(_name, m_list);
        go.SetActive(false);
    }

    //得到对象
    public GameObject GetGameObjectInDic(string _name)
    {
        string str = "Prefabs/" + _name;
        //如果存在
        if (m_dic.ContainsKey(_name))
        {
            for (int i = 0; i < m_dic[_name].Count; ++i)
            {
                if (!m_dic[_name][i].activeSelf)
                {
                    m_dic[_name][i].SetActive(true);
                    return m_dic[_name][i];
                }
            }

            GameObject go1 = GameObject.Instantiate(Resources.Load(str)) as GameObject;
            m_dic[_name].Add(go1);
            return go1;

        }
       
        GameObject go2 = GameObject.Instantiate(Resources.Load(str)) as GameObject;
        Init(_name, go2);
        return go2;       
    }
}

 

2.让子弹运行起来,在子弹的Prefab中绑定该脚本,ButtleRun.cs

using UnityEngine;
using System.Collections;

public class ButtleRun : MonoBehaviour
{
    //子弹的运行速度
    private float m_buttleSpeed = 10.0f;
    void Start ()
    {
    
    }
    
    // Update is called once per frame
    void Update ()
    {
        //子弹跑起来
        GameButtleRun();
    }
    void OnTriggerEnter(Collider other)
    {
        Debug.Log("触碰");
        if (other.gameObject.CompareTag(Tags.g_Wall))
        {
            gameObject.SetActive(false);
        }
    }

    void GameButtleRun()
    {
        transform.position += transform.forward * m_buttleSpeed * Time.deltaTime;
    }
}

 

3.创建子弹的脚本,点击鼠标左键,生成子弹 CreateButtle

using UnityEngine;
using System.Collections;

public class CreateButtle : MonoBehaviour
{
   
    
    void Start ()
    {
    
    }
    
    // Update is called once per frame
    void Update ()
    {
        if (Input.GetMouseButtonDown(0))
        {
            Debug.Log("创建子弹");
            //得到子弹
            GameObject buttle = GameObjectManager._Instance.GetGameObjectInDic(GameObjectName.g_ButtleName);
            buttle.transform.position = GameObject.Find("Gun/Position").transform.position;
            //buttle.transform.position += GameObjectManager._Instance.m_dic[GameObjectName.g_ButtleName][i].transform.forward * buttleSpeed * Time.deltaTime;
        }
    }
}

 

B.Unity场景中的效果

1.点击鼠标左键,创建子弹

 

2.碰撞到墙面,子弹“消失”

 

 

 

转载于:https://www.cnblogs.com/Dean27/p/6109506.html

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值