Unity进阶--对象池数据场景管理器笔记

这篇具有很好参考价值的文章主要介绍了Unity进阶--对象池数据场景管理器笔记。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

泛型单例类

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

public abstract class ManagersSingle<T> where T : new()
{
    private static T instance;


    // 获取单例实例
    public static T Instance
    {
        get
        {
            if (instance == null)
            {
                instance = new T();
            }
            return instance;
        }
    }
}

泛型单例类(不带组件版)

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

public class MyrSingletonBase<T> : MonoBehaviour where T : MonoBehaviour
{
    private static T instance;
    public static T Instance {
        get
        {
            return instance;
        }
    }

    protected virtual void Awake() {
        instance = this as T;
    }

    protected virtual void OnDestroy() {
        instance = null;
    }
}

对象池管理器

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

//对象池
public class PoolStack{
    //对象集合
    public Stack <UnityEngine.Object> stack = new Stack<Object>();
    //个数
    public int MaxCount = 100;
    
    //把游戏物体放入对象池
    public void Push(UnityEngine.Object go){
        if (stack.Count < MaxCount) stack.Push(go);
        else  GameObject.Destroy(go);
    }
    //从对象池取出对象
    public UnityEngine.Object Pop() {
        if (stack.Count > 0) return stack.Pop();
        return null;  
    }

    //清空池
    public void Clear(){
        foreach (UnityEngine.Object go in stack) GameObject.Destroy(go);
        stack.Clear();
    }

}

public class PoolManager :ManagersSingle<PoolManager>
{
    //管理多个池子
    Dictionary<string, PoolStack> poolDic = new Dictionary<string, PoolStack>();

    //从对象池取出对象,没有则创建一个
    public UnityEngine.Object Spawn(string poolName, UnityEngine.Object prefab){
        //如果没有对应的池子,创建池子
        if (!poolDic.ContainsKey(poolName)) poolDic.Add(poolName, new PoolStack());
        //从池子中拿出一个
        UnityEngine.Object go = poolDic[poolName].Pop();
        if (go == null) go = GameObject.Instantiate(prefab);
        return go;
    }
    //清空对象池
    public void UnSpawn(string poolName){
        if (poolDic.ContainsKey(poolName)){
            poolDic[poolName].Clear();
            poolDic.Remove(poolName);
        }
    }

}

数据管理器

Unity进阶--对象池数据场景管理器笔记,unity游戏开发,unity,游戏引擎

Unity进阶--对象池数据场景管理器笔记,unity游戏开发,unity,游戏引擎

Unity进阶--对象池数据场景管理器笔记,unity游戏开发,unity,游戏引擎

Unity进阶--对象池数据场景管理器笔记,unity游戏开发,unity,游戏引擎

Unity进阶--对象池数据场景管理器笔记,unity游戏开发,unity,游戏引擎文章来源地址https://www.toymoban.com/news/detail-617767.html

场景管理器

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

public class SceneManager : MyrSingletonBase<SceneManager>
{
    //场景名称
    public List<string> sceneList = new List<string>();
    //当前场景
    public int CurrentIndex = 0;
    //当前场景索引
    private System.Action<float> currentAction;
    //当前加载场景对象
    private AsyncOperation operation;
   
    public void LoadScene(string sceneName, System.Action<float> action){
        currentAction = action;
        if (sceneList.Contains(sceneName))
        {
            //更新场景索引
            CurrentIndex = sceneList.IndexOf(sceneName);
            //加载场景
            operation = UnityEngine.SceneManagement.SceneManager.LoadSceneAsync(sceneName, UnityEngine.SceneManagement.LoadSceneMode.Single);
        }
    }

    void Update(){
        if (operation != null){
            
            currentAction(operation.progress);
            //场景加载完成
            if (operation.progress >= 1) operation = null;
        }
    }
    
    //加载上一个场景
    public void LoadPre(System.Action<float> action){
        CurrentIndex--;
        LoadScene(sceneList[CurrentIndex], action);
    }

    //加载上一个场景
    public void LoadNext(System.Action<float> action){
        CurrentIndex++;
        LoadScene(sceneList[CurrentIndex], action);
    }
}


到了这里,关于Unity进阶--对象池数据场景管理器笔记的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • unity场景转换(实现开始游戏和返回游戏)

    1、新建两个场景,一个命名为start,另一个命名为game,如下图 2、打开start,创建一个平面和一个按钮(右键,UI,Button),平面绕X轴旋转-90度,按钮的text设置为开始游戏,把按钮拖到场景中合适的位置,如下图 3、编写代码start,把它赋给Canvas,注意是赋给Canvas,不是给按钮,代

    2024年02月11日
    浏览(44)
  • Unity游戏开发:场景切换的实现

    在unity中可以将不同场景的背景和道具放置在不同的Scene当中,通过对Scene的加载和卸载来实现场景之间的切换。同时创建一个基础场景(Control Scene)来对整个游戏系统进行管理,在基础场景(Control Scene)中不放置背景图片或者游戏道具而只添加各种控制单元和Canvas。 在场景

    2024年02月15日
    浏览(49)
  • Unity TimeLine跨场景动态绑定对象

    在unity TimeLine使用时,想要控制某个物体上的对象,直接将场景中该物体拖拽到对应的PlayableDirector的Track上即可。但如果希望控制的物体是动态生成的,或TimeLine作为Prefab的一部分出现在其他场景中,又希望控制场景中的物体等等,在不能使用拖拽指定或资源选择指定资源的情

    2024年02月10日
    浏览(37)
  • Unity--随机生成游戏对象

    在脚本中声明数组 RandomObjects 用于保存生成对象的类型,在project文件中拖入对象。 先将脚本拖到一个对象上,然后点击检查器-覆盖-应用到全部,这样将使所有预制件都拥有该属性。

    2024年02月15日
    浏览(42)
  • Unity学习之坦克游戏制作(1)开始场景的制作

    相当于开始界面,想怎么创建就怎么创建 我最终模拟的效果 这部分不关键,关键的是创建可用来装载脚本的button 这部分感兴趣的可以去看我博客的GUI部分,但建议大家把学GUI的时间拿来学UGUI 导入预设体 Root 创建一格Label组件作为标题 这部分也可以自己创建 同时创建四个按

    2024年01月22日
    浏览(51)
  • 关于Unity在游戏运行过程中切换场景导致场景变暗的问题

    相信很多新手都会遇到这个问题,那就是你正常打开的时候没有任何问题,但当你在游戏运行过程中切换场景的时候,目标场景会莫名其妙的变暗。这个问题在网上有很多教程,但是可能是对于老手们太简单的原因,所以很多人都是一句话带过,但是对于新手来说可能会让他

    2024年02月04日
    浏览(60)
  • 1.17 从0开始学习Unity游戏开发--场景切换

    前面的所有文章我们都在一个固定的游戏场景内进行开发,在最开始介绍场景这个概念的时候就已经提及,这个场景可以是一张地图,或者是一个对战房间等等,所以显然这个场景可以有多个,并且可以从一个场景切换到另外一个场景,那么在Unity中如何进行场景切换,以及

    2024年02月04日
    浏览(47)
  • 关于Unity游戏开发场景切换:Time.timeScale的捣乱

    在制作场景切换功能的时候,我用的是SceneManager.LoadScene函数,从主界面场景切换到关卡1场景,从关卡1场景切换到关卡2场景都是没有问题的。 但是,当我在点击Pause按钮来到暂停界面,点击Back Menu按钮准备回到主界面场景时,只显示了一片空白,场景没有被完全加载。 我的

    2024年02月05日
    浏览(38)
  • Unity 3D:获取未激活游戏对象的方法

    一、获取已激活游戏对象 Gameobject.Find(\\\"游戏对象名\\\") //根据对象名直接获取游戏对象 这个方法可以找到指定的对象,但是一些缺陷。 1、如果场景中有重名,此方法找到的是Hierarchy从上至下第一次出现此对象名的对象。 2、如果对象的activeSelf为false,那么这个方法永远无法找到

    2023年04月08日
    浏览(47)
  • Unity进阶提升-2D游戏跳跃手感优化(跳起下落)

    在进行2D游戏开发时,跳跃是不可缺少的一个重要功能。但是我们在Unity开发时Unity本身的物理引擎并不能提供很好的的手感,下落的时候轻飘飘的,这操作起来显然非常不舒服。所以,我们需要自己对跳跃进行优化,以此来获得更好的手感。我们不难发现,在绝大多数2D游戏

    2024年02月08日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包