unity 实用框架

单例模式基类

类不继承mono的单例基类

/// <summary>
/// 单例基类
/// </summary>
//泛型解决,给他一个约束要么是这个类本身要么是它的子类
public class SingleBase<T>where T : SingleBase<T>
{protected SingleBase() { }//线程锁。当多线程访问时,同一时刻仅允许一个线程访问。private static object locker=new object();//volatile关键字修饰字段是当多个线程都对他进行修改时,确保这个字段在任何时刻呈现都是最新的值private volatile  static T _instance;public static T Instance{get{//双重保证对象的唯一性if (_instance == null){lock (locker){if (_instance == null){//使用反射调用无参构造方法创建对象,就是new一个对象的意思_instance = Activator.CreateInstance(typeof(T), true) as T;}}}return _instance;}}
}

继承单例基类就不用再写了

public class PlayerModel:SingleBase<PlayerModel>
{private PlayerModel() { }public int money=1000;public int diamond = 888;public void Show(){Debug.Log(money);Debug.Log(diamond);}
}
PlayerModel.Instance.Show();

类继承mono的单例基类

/// <summary>
/// 继承monobehaviour的单例基类,前面是继承,where后面是泛型约束,要么是本身,要么是继承monobehaviour
/// </summary>
public class SingleMonoBase<T> : MonoBehaviour where T : MonoBehaviour
{protected SingleMonoBase() { }//声明一个isExisted属性用来表示单例对象是否存在,用来记录单例对象是否存在,用于防止在OnDestroy方法中访问单例对象报错。public static bool isExisted { get; private set; } = false;private static T _instance;public static T Instance{get{if (_instance == null){_instance=FindObjectOfType<T>();if (_instance == null){//通过反射获取T类型的名字,typeof(T)就是获取T类型的信息,创建游戏对象挂载脚本GameObject go = new GameObject(typeof(T).Name);_instance = go.AddComponent<T>();DontDestroyOnLoad(go);isExisted = true;}}return _instance;}}//在子类中也可能有OnDestroy用protected修饰可以访问了,子类可能重写这个方法还要写关键字virtual成为虚方法让子类重写他protected virtual  void OnDestroy(){isExisted=false;}
}
public class YaoUIManager : SingleMonoBase<YaoUIManager>
{private YaoUIManager() { }public void yao(){Debug.Log("yaoyao");}
}}
YaoUIManager.Instance.yao();

资源加载管理器

五种方法

  1. inspector窗口拖拽,Instantiate(go);
  2. resources.Load方法、Resources.LoadAsync方法、Resources.LoadAll方法来加载资源。Resources文件夹只能存储2G左右的资源,要谨慎使用,不支持热更新。
  3. AssetBundle.LoadFormXXX方法来加载资源。
  4. Addressables(可寻址资源系统),理解为高级的AssetBundle,资源管理由unity内部自动完成。目前还在发展中,可能有bug。
  5. AssetDatabase.LoadAssetAtPath方法来加载资源,仅限于编辑器模式,主要用于再编辑器模式下用代码改变本地文件。

using System.Resources;using UnityEngine.Events;/// <summary>
/// 封装resourcesManager的异步加载
/// </summary>
public class ResourcesManager : SingleMonoBase<ResourcesManager>
{/// <summary>/// 同步加载Resources文件夹中指定类型的资源/// 如果有多个相同类型,且相同路径的资源,则只会返回找到的第一个资源。/// </summary>/// <typeparam name="T">要加载的资源的类型</typeparam>/// <param name="path">资源的路径</param>/// <returns></returns>public T Load<T>(string path)where T:Object{return Resources.Load<T>(path);}public T[] LoadAll<T>(string path) where T : Object{return Resources.LoadAll<T>(path);}/// <summary>/// 异步加载Resources文件夹中指定类型的资源/// 如果有多个相同类型,且相同路径的资源,则只会加载找到的第一个资源。/// </summary>/// <typeparam name="T">加载的资源的类型</typeparam>/// <param name="path">要加载的资源的路径</param>/// <param name="callback">资源加载完毕后要执行的逻辑</param>public void LoadAsync<T>(string path,UnityAction<T> callback=null)where T : Object{StartCoroutine(LoadAsyncCoroutine(path,callback));}IEnumerator LoadAsyncCoroutine<T>(string path,UnityAction <T> callback=null) where T : Object{ResourceRequest resourceRequest= Resources.LoadAsync<T>(path);//开始加载资源yield return resourceRequest;//等待资源加载完毕callback?.Invoke(resourceRequest.asset as T);}public void UnloadUnusedAssets(UnityAction callback=null){MonoManager.Instance.StartCorotine(UnloadUnusedAssetCoroutine(callback));}IEnumerator UnloadUnusedAssetCoroutine(UnityAction callback=null){AsyncOperation asyncOperation = Resources.UnloadUnusedAssets();//开始卸载资源while (asyncOperation.progress < 1){yield return null;}//资源卸载完毕后执行的逻辑callback?.Invoke();}
}
GameObject go = ResourcesManager.Instance.Load<GameObject>("Prefabs/Cube");GameObject[] gos = ResourcesManager.Instance.LoadAll<GameObject>("Prefabs");

音频管理器

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/// <summary>
/// 音频管理器
/// </summary>
public class AudioManager : SingleMonoBase<AudioManager> 
{//各个声道的AudioSource组件AudioSource bgmAudiosource;AudioSource bgsAudiosource;AudioSource voiceAudiosource;//各个声道的游戏对象GameObject bgmController;GameObject soundController;GameObject bgsController;GameObject msController;GameObject voiceController;private void Awake(){//背景音乐控制bgmController = CreatController("BGMController");bgmAudiosource = bgmController.GetComponent<AudioSource>();bgmAudiosource.playOnAwake = false;bgmAudiosource.loop = true;//音效控制soundController = CreatController("SoundController");bgsAudiosource = bgmController.GetComponent<AudioSource>();bgsAudiosource.loop=true;msController = CreatController("MSController");//声音控制voiceController = CreatController("VoiceController");voiceAudiosource=voiceController.GetComponent<AudioSource>();voiceAudiosource.playOnAwake=false;voiceAudiosource.loop = false;}//创建控制器GameObject CreatController(string name){GameObject go=new GameObject(name);go.transform.SetParent(transform);return go;}
}
AudioManager.Instance.PlayBGM(BGM_1);
AudioManager.Instance.PauseBGM(BGM_1);
AudioManager.Instance..UnPauseBGM(BGM_1);
AudioManager.Instance.StopBGM(BGM_1);AudioManager.Instance.PlaySound(Sound_1,new Vector3(1,2,3));
AudioManager.Instance.PauseSound(Sound_1,GameObject.Find("Gold"));
AudioManager.Instance..UnPauseSound(BGM_1);
AudioManager.Instance.StopSound(BGM_1);

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++ 类和对象(4)构造函数

C的目标之一是让使用类对象就像使用标准类型一样&#xff0c;但是常规的初始化语法不适用于类似类型Stock&#xff1a; int year 2001&#xff1b; struct thing {char * pn;int m; }; thing amabob {"wodget",-23}; //有效初始化 Stock hot {"Sukies Autos…

Leetcode 992. K 个不同整数的子数组

文章目录 题目代码&#xff08;9.27 首刷看解析&#xff09; 题目 Leetcode 992. K 个不同整数的子数组 代码&#xff08;9.27 首刷看解析&#xff09; 滑动窗口&#xff0c;恰好转换为&#xff1a;最多K个不同的数 - 最多K-1个不同的数 class Solution { public:int subarr…

kafka伪集群部署,使用KRAFT模式

1:拉去管理kafka界面UI镜像 docker pull provectuslabs/kafka-ui2:拉去管理kafka镜像 docker pull bitnami/kafka3:docker-compose.yml version: 3.8 services:kafka-1:container_name: kafka1image: bitnami/kafka ports:- "19092:19092"- "19093:19093&quo…

测试用例的八大基本准则

测试用例的八大基本准则 测试用例的八大基本准则功能测试性能测试兼容性测试安全测试可靠性测试易用性测试数据库测试接口测试 测试案例 测试用例的八大基本准则 上节测试用例的设计中我们讨论如何设计一个测试用例&#xff0c;知道了测试用例的设计有&#xff1a;“边界值&am…

Linux命令(87)之pwd

linux命令之pwd 1.pwd介绍 linux命令pwd(全称&#xff1a;print working directory)用来列出当前目录 2.pwd用法 pwd [参数] pwd参数(了解即可&#xff0c;99.99%用不到) 参数说明-L显示逻辑路径-P显示实际物理路径 3.实例 3.1.显示当前目录 命令&#xff1a; pwd [ro…

如何制作gif动图gif (多图合成gif、GIF录制软件、视频制作成GIF动图)

文章目录 1 在线制作多图合成gif动画2 GIF录制软件3 将现有的视频 制作成GIF动图 1 在线制作多图合成gif动画 在线制作gif动画链接:https://www.matools.com/gif ①选择需要制作gif动画的图片将其添加 ②调整时间间隔&#xff0c;图片宽高等设置 ③一键生成gif ④下载到本…

目标检测YOLO实战应用案例100讲-区域卷积网络在阴影环境目标检测上的研究与应用(下)

目录 5.2 阴影检测模块与街景检测模块实验设置 5.2.1 实验环境与工具 5.2.3 损失函数 5.2.4 实验具体流程 5.3 实验评估与对比 5.3.1 两类实验的评估标准 5.3.2 两类实验结果对比 阴影环境下街景目标检测系统的实现 6.1 系统概述 6.2 系统软硬件环境 6.3 功能模块设计 6.4 系统…

【OpenSSH漏洞修复】升级到openssh9.4p1版本

实战环境 操作系统:Centos7.9 openssh版本:7.4 重要的升级文件 使用rpm包升级 D:\Linux基线离线安装包\openssh9.4-升级包 的目录openssh-9.4p1-4.el7.x86_64.rpm openssh-clients-9.4p1-4.el7.x86_64.rpm openssh-server-9.4p1-4.el7.x86_64.rpm需要自己去官网下载离线rp…

自定义子组件的v-model

一、传统的父子传参 作为前端程序员&#xff0c;我们在开发时&#xff0c;用到最多的就是父子传参了吧&#xff0c;这一点相信大家都很熟悉了&#xff0c;在这里简单的说一下 1.父传子 &#xff08;1&#xff09; 在父组件中引入子组件&#xff0c;并在父组件的components中注…

基于PLE结合卡尔曼滤波的RSSI定位算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 MATLAB2022a 3.部分核心程序 ............................................................... for Num_xb Num_xb2Num_…

C++思考和一些代码规范(09/28)

文章目录 一、C的一些思考记录1&#xff09;C函数进化&#xff08;函数->函数指针->函数模板->仿函数|函数对象->lambda表达式&#xff09; 一、C的一些思考记录 1&#xff09;C函数进化&#xff08;函数->函数指针->函数模板->仿函数|函数对象->lamb…

golang: Code of Conduct

目录 1. golang: Code of Conduct 1. golang: Code of Conduct Go Community Code of Conduct

目标检测YOLO实战应用案例100讲-面向路边停车场景的目标检测(下)

目录 4.3 引入正则化方法 4.3.1 正则化方法原理 4.3.2 何处引入正则化方法

小白vite+vue3搭建项目整个流程

第一步 查看npm 版本npm -v&#xff0c;npm版本是7&#xff0c;创建项目命令&#xff1a; npm create vitelatest threejsVue -- --template vue第二步 // 进入项目名为threejsVue的项目命令 cd threejsVue // 安装路由 npm install vue-router4 // 安装css npm install -D s…

Unity之VR如何实现跟随视角的UI

前言 我们在制作VR项目的时候,大部分时候,是把UI固定到一个位置,比如桌子或者空中,这么做固然稳定,但是当我们有以下需求的时候,固定位置的UI可能会不适用: 1.场景较小,操作物体占用了很大体积,没有固定的可以清晰显示完整UI的位置。 2.需要频繁的前后左右,更换姿势…

外贸企业网站做谷歌SEO优化没转化怎么办?

如果您的外贸企业网站在经过谷歌SEO优化后仍然没有获得预期的转化效果&#xff0c;这可能意味着您的优化策略需要重新审视和调整。以下是谷歌seo优化服务商九凌网络的一些建议&#xff0c;帮助您解决这个问题&#xff1a; 1. 重新定义目标关键词 首先&#xff0c;确保您了解您的…

【Qt】QTabWidget如何添加控件到Tab页水平位置

在开发中&#xff0c;QTabWidget控件经常出现在项目或软件中&#xff0c;有时为了美观兼顾操作便利&#xff0c;需要把按钮或其他控件添加到QTabWidget控件的Tab页水平位置。 实现思路&#xff1a; 查看帮助文档&#xff0c;发现该类有个方法void setCornerWidget()可以实现所…

【QT+CUDA】QT中使用cuda,QT+VS+cuda下载安装配置

文章目录 相关网址汇总&#xff1a; 一、软件安装&#xff1a;VS、CUDA、QT1 安装VS1.1 下载1.2 vs2017安装1.3 vs2015安装 2 安装CUDA2.1 下载2.2 安装2.3 测试2.4 卸载 3 安装QT3.1 下载3.2 安装 二、QT使用cuda1 .pro文件 三、常用操作1 NVIDIA控制面板&#xff1a;显卡、驱…

el-collapse 嵌套中 el-checkbox作为标题,选中复选框与el-tree联动

<el-drawertitle"应用授权":visible.sync"menuDrawer"><el-collapse accordion style"padding: 15px"><el-collapse-item v-for"item in platList"><template slot"title"><el-checkbox v-model…

力扣刷题-链表-环形链表

具体题目与思路见&#xff1a;https://programmercarl.com/0142.%E7%8E%AF%E5%BD%A2%E9%93%BE%E8%A1%A8II.html#%E6%80%9D%E8%B7%AF 该文章详细介绍了如何寻找环入口点&#xff0c;以及数学原理。 class ListNode(object):def __init__(self, x):self.val xself.next Nonecl…