U3D应用缓存管理物体

1. 在Unity中比较常见的功能发射子弹,一般得我们都去动态生成物体(子弹prefab).

  • 动态生成物体优点:1.可以灵活的控制场景 2. 可以马上看到效果.
  • 缺点:这样不断的生成,销毁,性能开销大.

2. 所以一般我们使用Cache 缓存来完成. 上代码.

3. 首先创建一个脚本,巢穴吧.

public class DbSpawn : MonoBehaviour
{
    public static DbSpawn Instance;

    public ObjectCache[] Caches;

    private Hashtable _cacheObjects;

    [System.Serializable]
    public class ObjectCache
    {
        public GameObject Prefab;
        public int CacheLens = 10;

        private GameObject[] _objects;
        private int cacheIndex = 0;

        /// <summary>
        /// 初始化
        /// </summary>
        public void Init()
        {
            _objects = new GameObject[CacheLens];

            for (int i = 0; i < CacheLens; i++)
            {
                _objects[i] = Instantiate(Prefab) as GameObject;
                _objects[i].gameObject.SetActive(false);
                _objects[i].name = _objects[i].name + i;
            }
        }

        /// <summary>
        /// 获取没有被激活的
        /// </summary>
        /// <returns></returns>
        public GameObject GetNextObjectCache()
        {
            GameObject obj = null;

            for (int i = 0; i < CacheLens; i++)
            {
                obj = _objects[cacheIndex];

                if (!obj.activeSelf)
                {
                    break;
                }

                cacheIndex = (cacheIndex + 1) % CacheLens;
            }

            if (obj != null && obj.activeSelf)
            {
                DbSpawn.Destroy(obj);
            }

            cacheIndex = (cacheIndex + 1) % CacheLens;
            return obj;
        }
    }

    void Awake()
    {
        Instance = this;

        var total = 0;

        foreach (ObjectCache t in Caches)
        {
            t.Init();

            total += t.CacheLens;
        }

        _cacheObjects = new Hashtable(total);
    }

    /// <summary>
    /// 孵化一个prefab实例
    /// </summary>
    /// <param name="prefab"></param>
    /// <param name="position"></param>
    /// <param name="rotation"></param>
    /// <returns></returns>
    public static GameObject SpawnObject(GameObject prefab, Vector3 position, Quaternion rotation)
    {
        ObjectCache cache = null;

        if (Instance)
        {
            //获取符合当前prefab缓存
            foreach (ObjectCache t in Instance.Caches)
            {
                if (t.Prefab == prefab)
                {
                    cache = t;
                    break;
                }
            }
        }

        if (cache == null)
        {
            return Instantiate(prefab, position, rotation) as GameObject;
        }

        //获取当前缓存容器 可用实例
        GameObject obj = cache.GetNextObjectCache();

        //设置实例属性

        obj.transform.position = position;
        obj.transform.rotation = rotation;

        obj.SetActive(true);
        //存入哈希表
        Instance._cacheObjects[obj] = true;

        return obj;
    }

    //销毁处理
    public static void Destroy(GameObject obj)
    {

        if (Instance && Instance._cacheObjects.ContainsKey(obj))
        {
            obj.SetActive(false);
            Instance._cacheObjects[obj] = false;
        }
        else
        {
            Destroy(obj);
        }
    }

4. 在子弹prefab创建一个脚本

public class DbBullet : MonoBehaviour
{

    /// <summary>
    /// 速度
    /// </summary>
    public float Speed = 10f;

    /// <summary>
    /// 子弹生命时间
    /// </summary>
    public float Life = 0.5f;

    /// <summary>
    /// 距离
    /// </summary>
    public float Dist = 1000;

    private float _spawnTime = 0f;
    private Transform _tr;

    void OnEnable()
    {
        _tr = transform;
        _spawnTime = Time.deltaTime;
    }

    // Update is called once per frame
    void Update()
    {
        _tr.position += transform.forward * Speed * Time.deltaTime;
        Dist -= Speed * Time.deltaTime;

        if (Time.deltaTime > _spawnTime + Life || Dist < 0)
        {
            DbSpawn.Destroy(gameObject);
            Dist = 10;
        }
    }

5. 模拟发射了.

public class DbShooter : MonoBehaviour
{

    public Transform point;
    public GameObject prefab;
    public float TimeCount = 10f;

    private float _timer = 0f;
    private bool _isShooter = false;
    // Update is called once per frame
    void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            _isShooter = true;
        }

        if (Input.GetMouseButtonUp(0))
        {

            _isShooter = false;
        }

        if (_isShooter)
        {
            _timer += Time.deltaTime;
            if (_timer > 1 / TimeCount)
            {
                DbSpawn.SpawnObject(prefab, point.position, Quaternion.identity);
                _timer = 0f;
            }
        }
    }
}

-  - 我也是初学者,小白,分享一下,同时自己也加深印象3Q..

时间: 2024-10-29 19:05:36

U3D应用缓存管理物体的相关文章

HTML5 离线缓存管理库

一.HTML5离线缓存技术 支持离线缓存是HTML5中的一个重点,离线缓存就是让用户即使在断网的情况下依然可以正常的运行应用.传统的本地存储数据的方式有 localstorage,sessionstorage和cookie.但是这些传统的方式有着致命的弊端.首先这些传统的存储方式的最大使用空间有 限,最多不超过5M;其次它们处理大规模的结构化数据的能力有限.鉴于传统方式的局限性,HTML5提出了三种新的离线缓存解决方案:Web SQL,indexedDB和File System. 其中Web S

十一:Centralized Cache Management in HDFS 集中缓存管理

集中的HDFS缓存管理,该机制可以让用户缓存特定的hdfs路径,这些块缓存在堆外内存中.namenode指导datanode完成这个工作. Centralized cache management in HDFS has many significant advantages. Explicit pinning prevents frequently used data from being evicted from memory. This is particularly important

一个NFS缓存管理包的bug导致文件系统满的问题和解决方法

这几天安装CentOS 6的虚拟机总是提示文件系统满,一开始以为是最近oracle经常操作大数据量提交导致undo tbs无限扩大,后来发现原来是NFS缓存管理包cachefilesd的问题.分享一下: 由于是测试虚拟机,文件系统懒得专门规划,只划分了一个根目录分区.(各位admin切记不要犯这种实际生产环境的大忌): [[email protected]* /]df -h Filesystem            Size  Used Avail Use% Mounted on /dev/m

Hibernate缓存管理

Hibernate缓存管理 ++YONG原创,转载请注明 1.    Cache简介: 缓存(Cache )是计算机领域非常通用的概念.它介于应用程序和永久性数据存储源(如硬盘上的文件或者数据库)之间,其作用是降低应用程序直接读写永久性数据存储源的频率,从而提高应用的运行性能.缓存中的数据是数据存储源中数据的拷贝,应用程序在运行时直接读写缓存中的数据,只在某些特定时刻按照缓存中的数据来同步更新数据存储源. 缓存的物理介质通常是内存,而永久性数据存储源的物理介质通常是硬盘或磁盘,应用程序读写内在的

01-08-03【Nhibernate (版本3.3.1.4000) 出入江湖】二级缓存:NHibernate自带的HashtableProvider之缓存管理

http://www.cnblogs.com/lyj/archive/2008/11/28/1343418.html 管理NHibernate二级缓存 NHibernate二级缓存由ISessionFactory创建并由ISessionFactory自行维护.我们使用NHibernate操作数据时,ISessionFactory能够自动同步缓存,保证缓存的有效性.但是当我们批量操作数据时,往往NHibernate不能维护缓存持久有效.ISessionFactory提供了可编程方式的缓存管理方法.

Magicodes.WeiChat——缓存管理

本框架支持缓存管理,内部机制使用开源库CacheManager.支持全局缓存.租户缓存,默认使用的系统缓存实现,可以在Web.config将其配置为其他缓存类型,比如支持Redis.内存等. 开源库地址:https://github.com/MichaCo/CacheManager 1.1.1 配置 默认配置如下,见Web.config cacheManager元素内容: <!--缓存配置--> <cacheManager xmlns="http://tempuri.org/C

Windows Server 存储空间之存储分层和缓存管理

存储空间存储分层 在谈到存储分层之前,我们需要了解Windows Server存储空间里面包含了多少层以及如何定义每一个分层.基于读写性能快慢的相对值,存储空间分为两个数据存储层,一个存储层为快速层,通常由SSD硬盘提供,用于存储热数据,也即经常访问的数据:另一个存储层为慢速层,通常由HDD硬盘提供,用于存储冷数据,也即不经常访问的数据.默认情况下,存储空间具有这两个存储速率不同的存储层的虚拟磁盘,存储分层目的在于平衡 SSD性能和硬盘驱动器 (HDD)容量.在存储层都有可用空间时,新的数据通常

HDFS集中式缓存管理(Centralized Cache Management)

Hadoop从2.3.0版本开始支持HDFS缓存机制,HDFS允许用户将一部分目录或文件缓存在HDFS当中,NameNode会通知拥有对应块的DataNodes将其缓存在DataNode的内存当中 集中式缓存管理有着许多显著的优势: 防止那些被频繁使用的数据从内存中清除 因为DataNode的缓存由NameNode来管理,applications在做任务安排时可以查询这个缓存的列表,使用一个被缓存的块副本能够提高读性能 当块被DataNode缓存之后,客户端可以使用一个新的.高效的.zero-c

[js开源组件开发]localStorage-cache本地存储的缓存管理

localStorage-cache本地存储的缓存管理 距离上次的组件开发有近三个月的时间了,最近一直在做一些杂事,无法静下心来写写代码,也是在学习emberjs,在emberjs中有一个很重要的东西 -- localstorage_adapter,本地存储适配器,利用它可以很方便的把数据保存在本地的localStorage中,但我今天要讲的,并不是ember,也不是适配器,我是个比较念旧的人,所以我对cookie很情有独钟,当然,cookie也会有各种问题,于是我就来改造下localStora