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);
        }
    }

}

数据管理器

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uWsTk7ac-1690360831404)(QQ%E6%88%AA%E5%9B%BE20230726091635.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-s6XIAsND-1690360831406)(QQ%E6%88%AA%E5%9B%BE20230726093855.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Jzymn27z-1690360831407)(QQ%E6%88%AA%E5%9B%BE20230726094052.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HeGkPdaw-1690360831408)(QQ%E6%88%AA%E5%9B%BE20230726094141.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8ed6LFKt-1690360831408)(QQ%E6%88%AA%E5%9B%BE20230726094604.png)]

场景管理器

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);
    }
}


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/45940.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

线性代数(主题篇):第三章:向量组 、第四章:方程组

文章目录 第3章 n维向量1.概念(1)n维单位列向量 2.向量、向量组的的线性关系(线性相关性)(1)线性表示 &#xff1a;AXβ(2)线性相关、线性无关&#xff1a; AX0①线性相关②线性无关③线性相关性7大定理 3.极大线性无关组、等价向量组、向量组的秩1.极大线性无关组2.等价向量组…

Cesium态势标绘专题-简单箭头(标绘+编辑)

标绘专题介绍:态势标绘专题介绍_总要学点什么的博客-CSDN博客 入口文件:Cesium态势标绘专题-入口_总要学点什么的博客-CSDN博客 辅助文件:Cesium态势标绘专题-辅助文件_总要学点什么的博客-CSDN博客 本专题没有废话,只有代码,代码中涉及到的引入文件方法,从上面三个链…

跃焱邵隼网站demo

xdm 网站的代码开源了。 今年迷上摄影和剪辑了&#xff0c;所以很少投入到网站的维护。 然后经过群友的一些反馈&#xff0c;所以决定 将网站上demo开源放出来了。 后面有机会再出一些好玩的东西。 哦 对了 3d 编辑器我已经融入地图了 年底搞一些好玩的东西出来。 可以关注…

树、二叉树(C语言版)详解

&#x1f355;博客主页&#xff1a;️自信不孤单 &#x1f36c;文章专栏&#xff1a;数据结构与算法 &#x1f35a;代码仓库&#xff1a;破浪晓梦 &#x1f36d;欢迎关注&#xff1a;欢迎大家点赞收藏关注 文章目录 &#x1f34a;树的概念及结构1. 树的概念2. 树的相关概念3.树…

算法通关村第一关-链表黄金挑战笔记|环的入口

解决链表环入口问题 文章目录 解决链表环入口问题前言链表中环的问题Hash和集合的解法&#xff1a;快慢指针实现解决&#xff1a; 解题思路&#xff1a;Hash或者使用集合的方式实现快慢指针&#xff08;这里使用三次刚好解决&#xff09; 总结 前言 提示&#xff1a;无论今天过…

C++笔记之使用普通指针和shared_ptr在堆上申请类对象的各种写法

C笔记之使用普通指针和shared_ptr在堆上申请类对象的各种写法 code review! 文章目录 C笔记之使用普通指针和shared_ptr在堆上申请类对象的各种写法1.几种不同的写法2.ChatGpt回答 1.几种不同的写法 注&#xff1a;使用普通指针申请堆内存&#xff0c;其实是应该有delete的&…

Redis常用数据类型和使用场景

Redis目前支持5种数据类型&#xff0c;分别是&#xff1a; String&#xff08;字符串&#xff09; List&#xff08;列表&#xff09; Hash&#xff08;字典&#xff09; Set&#xff08;集合&#xff09; Sorted Set&#xff08;有序集合&#xff09; 下面就分别介绍这五…

得物词分发平台技术架构建设与演进

前言 在文章开始前先介绍下导购&#xff0c;导购通常是指帮助消费者在购物过程中做出最佳决策的人或系统。在电商网站中&#xff0c;导购可以引导用户关注热卖商品或促销活动等&#xff0c;帮助用户更好地进行购物。导购的目的是为了提高用户的购物体验&#xff0c;促进销售额…

抽象工厂模式——产品族的创建

1、简介 1.1、简介 抽象工厂模式为创建一组对象提供了一种解决方案。与工厂方法模式相比&#xff0c;抽象工厂模式中的具体工厂不只是创建一种产品&#xff0c;它负责创建一族产品 1.2、定义 抽象工厂模式&#xff08;Abstract Factory Pattern&#xff09;&#xff1a;提供…

4、非线性数据结构

上一节课我们讲了线性数据结构&#xff0c;这一节我们说下非线性数据结构。 非线性数据结构&#xff0c;从字面意思来看&#xff0c;就是指不是线性的结构。线性结构的特点是只有一个前驱和一个后继。 那么非线性结构的特点就是有多个前驱或后继了。 如果只存在一个没有前驱的…

Python爬虫基础

文章目录 Python学习记录Python基础爬虫&#xff1a;代码&#xff1a;运行结果&#xff1a; Python学习记录 Python基础爬虫&#xff1a; 代码&#xff1a; import urllib.request import random import chardet#请求头列表 us["Mozilla/4.0 (compatible; MSIE 6.0; Wi…

(学习笔记-IP)IP基础知识

基本认识 IP在TCP/IP参考模型中处于第三层&#xff0c;也就是网络层。 网络层的主要作用是&#xff1a;实现主机与主机之间的通信&#xff0c;也叫点对点的通信。 网络层与数据链路层的关系&#xff1a; MAC的作用是实现直连的两个设备之间通信&#xff0c;而IP负责没有直连的…

消息队列- 背景知识

这里写目录标题 前言消息队列消息队列的作用常见的消息队列消息队列的核心概念BrokerServer核心概念消息队列的核心API消息队列与消费者之间的工作模式交换机的类型消息队列的持久化 总结 前言 消息队列,不知道大家是否陌生,如果说消息队列感到陌生的话, 有一个模型肯定大家都…

Nginx下载和安装教程、Nginx目录结构、Nginx具体应用

1、Nginx概述 Nginx是一款轻量级的开源Web服务器软件&#xff0c;也是一种反向代理服务器。它以其高性能和灵活性而被广泛应用于互联网领域。本文将介绍Nginx的概述、下载和安装以及目录结构。 &#xff08;1&#xff09;Nginx介绍 Nginx最初由Igor Sysoev开发&#xff0c;目…

Pycharm工具Python开发自动添加注释(详细)

方法自动添加参数注释 定义了一个函数&#xff0c;在函数下面敲入了三个双引号后&#xff0c;enter回车并没有自动出现注释&#xff0c;如图&#xff1a; 解决办法 Pycharm中依次打开File —> Settings —> Tools —> Python Integrated Tools&#xff0c;如图&…

C++笔记之对指针类型的变量进行+1操作

C笔记之对指针类型的变量进行1操作 在C中&#xff0c;对指针类型的变量进行"1"操作会根据指针的数据类型而有所不同。这涉及到指针的算术运算&#xff0c;C中的指针算术运算是根据指针所指向的数据类型的大小来进行的。 code review! 文章目录 C笔记之对指针类型的…

最受欢迎的12个Python开源框架,还没用过你就OUT了!!!

今天给大家带来了12个在GitHub等开源网站中最受欢迎的Python开源框架。如果你正在学习python&#xff0c;那么这12个开源框架&#xff0c;千万别错过&#xff0c;这些框架包括事件I/O&#xff0c;OLAP&#xff0c;Web开发&#xff0c;高性能网络通信&#xff0c;测试&#xff0…

zookeeper-3.7.1集群

1.下载&解压安装包apache-zookeeper-3.7.1-bin.tar.gz 解压到/app/ &改名zookeeper-3.7.1 [rootnode1 app]# tar -zxvf apache-zookeeper-3.7.1-bin.tar.gz -C /app/ [rootnode1 app]# mv apache-zookeeper-3.7.1-bin zookeeper-3.7.1 ---- 删除docs [rootnode1…

五步快速搭建个性化外卖小程序商城

随着人们生活节奏的加快&#xff0c;外卖行业蓬勃发展。为了满足用户的需求&#xff0c;许多企业开始使用小程序商城来提供外卖服务。那么&#xff0c;如何制作一个功能完善、用户友好的外卖小程序商城呢&#xff1f;下面就来为大家详细介绍一下制作的步骤。 首先&#xff0c;我…

Docker consul容器服务更新与发现

Docker consul容器服务更新与发现 一、什么事服务注册与发现二、什么是consul三、consul部署1、consul服务器2、registrator服务器3、consul-template 一、什么事服务注册与发现 服务注册与发现是微服务架构中不可或缺的重要组件。起初服务都是单节点的&#xff0c;不保障高可…