在Unity中进行单例的动态脚本加载

2023-11-18

首先调用Unity提供的注释可以在点下Play之后,在游戏真正启动前去执行一些脚本,要注意执行脚本要放在Assets/Editor下

[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSceneLoad)]

要想运用反射机制来进行动态脚本的创建,就需要先遍历获得全部文件:

//创建文件路径
DirectoryInfo direction = new("Assets/Script/");

//获得所有文件
FileInfo[] files = direction.GetFiles("*", SearchOption.AllDirectories);


//通过遍历筛选有用的
for (int i = 0; i < files.Length; i++)
{
    Debug.Log(files[i].Name);
}

因为Editor下的代码集和默认代码集不一样,想在脚本里直接访问对应的代码集最简单的方法,就是让默认代码集直接返回一个集合过来:

public static class AssemblyUtil
{
    public static Assembly getScriptAssembly() {
        return Assembly.GetExecutingAssembly();
    }
}

接下来就是用映射来创建真正实例了:

// 获取脚本所在程序集 
Assembly assembly = AssemblyUtil.getScriptAssembly();
//通过类型创建实例,并塞入加载结果里
Type type = assembly.GetType(name, true);
T obj = (T)Activator.CreateInstance(type);

整体代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
using UnityEditor;
using System.IO;
using System.Reflection;

public static class RequireUtil
{
    private static Dictionary<string, BaseScript> scriptMap;
    [RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSceneLoad)]
    static void Init()
    {
        Debug.Log("初始化引用构造函数");
        //构造脚本映射表
        scriptMap = LoadAllFile<BaseScript>("Assets/Script/Logic", "cs");
        foreach ((_, BaseScript script) in scriptMap)
        {
            script.Ctor();
        }

    }
    /// <summary>
    /// 加载指定路径下的文件,并给与指定格式
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="path"></param>
    /// <param name="suffix"></param>
    /// <returns></returns>
    static Dictionary<string, T> LoadAllFile<T>(string path, string suffix)
    {
        //路径补全
        string fullPath = path + "/";

        Dictionary<string, T> map = new Dictionary<string, T>();

        //获取指定路径下面的所有资源文件  
        if (Directory.Exists(fullPath))
        {
            //创建文件路径
            DirectoryInfo direction = new(fullPath);

            //获得所有文件
            FileInfo[] files = direction.GetFiles("*", SearchOption.AllDirectories);

            // 获取脚本所在程序集 
            Assembly assembly = AssemblyUtil.getScriptAssembly();

            //通过遍历筛选有用的
            for (int i = 0; i < files.Length; i++)
            {
                //切割文本判断是否符合需求
                int fileSuffix = files[i].Name.LastIndexOf('.');
                string strSuffix = files[i].Name.Substring(fileSuffix);
                string strName = files[i].Name.Substring(0, fileSuffix);
                if (strSuffix.EndsWith("meta") || suffix != null && !strSuffix.EndsWith(suffix))
                {
                    continue;
                }
                //通过类型创建实例,并塞入加载结果里
                Type type = assembly.GetType(strName, true);
                T obj = (T)Activator.CreateInstance(type);
                map.Add(strName, obj);
            }
        }
        return map;
    }
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在Unity中进行单例的动态脚本加载 的相关文章

  • Unity 粒子特效、材质发光 HDR ShaderGraph图文教程[完成lit发光设置]

    效果如图 准备工作 在hdr模式下 关闭Directional Light 相机设置 移动球挂一个点光源作为子节点 设置自行调节 0 创建移动球的材质及shader shader gt 在Project Create Shader Grap
  • Unity动画控制器animator.CrossFade

    需要特别注意 1 CrossFade虽然可以不用任何逻辑来链接而直接跳转 但是CrossFade只能覆盖其他动画 当当前动画播放完毕而没有跳出这个动画时再次调用CrossFade将会失败 造成动画依旧停在原位 参数animator Cros
  • UnityVR--组件3--Line Renderer--线性渲染

    目录 线性渲染组件简介 绘制线条Line Renderer组件介绍 绘制拖尾Trail Renderer组件介绍 应用1 使用Line Renderer绘制线段 应用1实现 使用系统工具或自定义工具绘制线段 应用2 Trail Render
  • unity中创建询问弹出窗口

    在开发过程中进程会遇到需要弹出一个窗口询问用户是否进行的操作 今天就来制作一个这样弹出窗口 然后根据弹出窗口的选择内容不同进行不同的操作 本例中主要是为了删除一个数据 而在删除数据操作前需要得到用户的一个确认操作 这里面主要用到了Notif
  • Unity学习笔记(一)—— 基础知识

    一 基础知识 1 开发团队组成 2 unity特点 图形界面 所见即所得 入门简单 支持C 比OC C 更友好 js 国内外资源丰富 因为使用的人多 跨平台性好 PC端 移动端等 对VR AR的支持最完善 3 成功案例 游戏 炉石传说 神庙
  • unity后台加密时间锁

    前言 在做一些项目的时候 有些不良甲方在给完项目后会有不给尾款的情况 之前都是加一些水印啥的 感觉不是很方便 第一不美观 第二如果甲方给完尾款后还得重新打包去水印 然后又做过一个本地的时间锁 等到时间 程序直接退出 但是感觉还是不方便 有时
  • Unity 键盘控制人物移动——之输入方式代码的编写

    键盘输入 控制人物移动 在我们制作游戏中最常见的需求之一就是使用键盘移动游戏角色 那么我们首先需要获取键盘输入 以下提供两种方法获取键盘 这里尽量通过截图解释让大家理解代码的含义 GetInput void FixedUpdate Move
  • unity3d大型互动照片墙

    1 本次应客户需求 制作一个大型照片墙互动 输出分辨率为9600 4320 注 unity3d官方推荐最大分辨率为8192 3686 4 经过现场长达24小时暴力测试中途未发生问题 姑且判定可以达到正常标准 废话不多说 先上效果 unity
  • unity: C#的Action Event Delegate的异同

    目录 一 Action 二 Event 三 Action和Event区别 四 Delegate 总结 Action Event Delegate的异同 前言 Action Event和Delegate都是C 语言中的重要概念 分别用于管理函
  • Unity保存图片到相册

    Unity保存图片到Android相册 Java 纯文本查看 复制代码 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
  • Unity旋转以及万向锁问题

    我之前研读了一些关于unity旋转相关的博客 一直想抽个时间写个总结 但是由于实习太忙一直没有写 趁着今天请了假晚上有时间把这段时间一些学习心得写出来 Unity inspector面板中的Rotation 在unity中 想必大家最先接触
  • unity3d切换场景Application.LoadLevel(1)含义

    Application LoadLevel 1 场景ID
  • 【原神游戏开发日志1】缘起

    原神游戏开发日志1 缘起 版权声明 本文为 优梦创客 原创文章 您可以自由转载 但必须加入完整的版权声明 文章内容不得删减 修改 演绎 相关学习资源见文末 大家好 最近看到原神在TGA上频频获奖 作为一个14年经验的游戏开发行业的老兵 我就
  • Unity中URP下的指数雾

    文章目录 前言 一 指数雾 雾效因子 1 FOG EXP 2 FOG EXP2 二 MixFog 1 ComputeFogIntensity 雾效强度计算 2 lerp fogColor fragColor fogIntensity 雾效颜
  • VS2022 | 显示Unreal Engine日志

    VS2022 显示Unreal Engine日志 视图 gt 其他窗口 gt Unreal Engine日志 视图 gt 其他窗口 gt Unreal Engine日志
  • U3D游戏开发中摇杆的制作(NGUI版)

    在PC端模拟摇杆 实现控制摇杆让玩家或者物体移动 以下是完整代码 using System Collections using System Collections Generic using UnityEngine public clas
  • 游戏开发创建操作之玩家信息系统的建立

    游戏一般都需要玩家信息系统 那么我们应该如何搭建玩家信息系统 接下来我将展示一种简单的方法 完整代码如下 using System Collections using System Collections Generic using Uni
  • 游戏开发之常见操作梳理——武器装备商店系统(NGUI版)

    游戏开发中经常出现武器商店 接下来为你们带来武器装备商店系统的具体解决办法 后续出UGUI Json版本 敬请期待 武器道具的具体逻辑 using System Collections using System Collections Ge
  • 游戏开发常见操作系列之敌人系统的开发一(U3D)

    在开发游戏的过程中 我们常常会出现一些敌人攻击我们玩家 并且实现掉血以及死亡的现象 敌人还会源源不断地生成 这是怎么制作的呢 接下来为大家提供方法 其中使用了NGUI 后续会更新其它方法 敬请期待 使用HUDText实现扣血时显示文本 直接
  • 游戏开发中常见系统梳理之背包系统的实现一

    游戏中几乎都存在大大小小的背包系统 接下来我将讲述背包系统具体是如何实现的 完整源码 以下是使用unity NGUI实现 使用txt配置的方法 后续更新UGUI Json实现的背包系统敬请期待 背包中的物品我们常常将其制作成预设体 通过改变

随机推荐

  • windows python kafka 初级使用

    今天花了点时间在这个kafka上 因为我们工作中也用到了kafka 我这边对于kafka的理解是能用或者知道基本原理就行 实现在自己的windows环境搭建一次kafka 然后使用python进行数据的生产和消费 如果之后工作中对于kafk
  • WGS84坐标与Web墨卡托坐标互转

    在WebGIS的开发中经常用到的地图投影为Web墨卡托和WGS84 故歌地图 bingmaps 百度地图 mapabc mapbar 以及ArcGIS online上的大部分地图为Web墨卡托地图 ArcGIS online上最开始发布的地
  • vue eslint 报错:Component name “xxxxx“ should always be multi-word.eslintvue/multi-word-component-name

    报错代码 vue cli 全新创建项目 并建立组件时提示报错 VSCode 会标红提示 如图 npm run serve yarn serve也会报错 Ctrl Shift M 问题面板出现 原因 新手在组件命名的时候不够规范 根据官方风格
  • 憨批的语义分割6——制作语义分割数据标签

    憨批的语义分割6 制作语义分割数据集 学习前言 制作工具Labelme Labelme的使用 标签文件内容 学习前言 有些小伙伴问怎么制作数据集 其实我也没有去制作过 所以也要学学啦 制作工具Labelme 这里要用到Labelme工具 在
  • 2023华为笔试机考题库 Java【无向图染色】

    题目 你有一个无向图 需要给它上色 只有两种颜色供你选择 红色和黑色 但有一个条件 两个相邻的节点 即直接相连的节点 不能同时被染成红色 现在的问题是 有多少种不同的上色方案满足这个条件 输入 第一行包含两个整数M和N 其中M表示图中的节点
  • java和android程序员使用web3j进行区块链以太坊开发详解

    如何使用web3j为Java应用或Android App增加以太坊区块链支持 教程内容即涉及以太坊中的核心概念 例如账户管理包括账户的创建 钱包创建 交易转账 交易与状态 智能合约开发与交互 过滤器和事件等 同时也详细说明如何使用web3j
  • 密码提取神器 mimikatz 现已支持Windows 10 RS2

    本文讲的是 密码提取神器 mimikatz 现已支持Windows 10 RS2 昨天稍早 安全研究者 gentilkiwi 在推特上宣布 知名密码提取工具mimikatz推出v2 1 1新版 正式支持Windows 10 RS2 1707
  • 卷首语:我决定从零开始,用C++手写自己的键值数据库

    2023年5月1日 周一下午 我为什么要自己写一个 今天中午 我在CSDN上提出了一个关于如何学习C 的观点 通过用C 造东西来学习C 于是为了实践这个观点 我决定用C 手写一个简单的属于自己的键值数据库 我会把这个键值库写到什么程度 只要
  • 双色球笔记2--保存所有双色球号码到MySQL

    双色球笔记2 保存所有双色球号码到MySQL 1 功能 本代码主要将双色球所有数据保存到mysql数据库 双色球总种类为17721088 笔者8G I7笔记本大约插入了10天 下面代码中包含两中方法 Insert SSQ 和Insert S
  • springcloud集成apollo

    apollo 配置中心 官网 Apollo 官网有设计 部署说明 系统架构图 github开源官网https github com apolloconfig apollo releases releases上下载后发现有这4个文件 apol
  • Docker学习笔记(二):Docker镜像原理、Docker数据卷(挂载)作用和使用

    Docker镜像详解 1 镜像是什么 镜像是一种轻量级 可执行的独立软件包 用来打包软件运行环境和基于运行环境开发的软件 它包含运行某个软件所需的所有内容 包括代码 运行时 库 环境变量和配置文件 所有应用打包成docker镜像 就可以直接
  • 少儿创意学编程(Scratch基础篇):第4课——聊天机器人

    少儿创意学编程 Scratch基础篇 参考了英国公益组织发起的 code club 代码俱乐部 少儿免费学编程活动 愿为中国的少儿创意编程教育尽微薄之力 对国内的家长 信息教师和相关教育机构有所帮助 共同促进软件素质教育的发展 本课程以Sc
  • Qt4.8.2 QPushButton按钮贴图以及实现按钮的几种常用状态

    一 继承自QPushButton 不改变图片本身 而是通过改变按钮背景的透明度 myPushButton h cpp view plain copy ifndef MYPUSHBUTTON H define MYPUSHBUTTON H i
  • 支持向量机类实现

    import os import jieba import numpy as np from sklearn model selection import train test split cross val score from skle
  • 5分钟带你了解写博客的重要性——博客的大门为你敞开

    文章目录 前言 为什么要写博客 写博客有什么用 1 检验自己对知识是否真的理解 2 积累知识并让自己变成合规的 卷王 3 讨论反思 收获新认知 4 提升思维逻辑力和文字组织力
  • Docker运行MySQL容器

    目录 一 宿主机与容器之间的文件拷贝 1 利用MySQL镜像安装MySQL服务 2 容器中怎么上传项目 文件 3 从容器中拷贝文件到宿主机 4 从宿主机拷贝文件到容器 二 数据卷 三 数据卷容器 四 Dockerfile 本次目标 数据卷
  • TCP发送数据流程详解

    B S通信简述 整个计算机网络的实现体现为协议的实现 TCP IP协议是Internet的核心协议 HTTP协议是比TCP更高层次的应用层协议 HTTP HyperText Transfer Protocol 超文本传输协议 是互联网上应用
  • Eclipse 版本和JDK对应关系

    1 JDK最新版本下载地址 http www oracle com technetwork java javase downloads index html 2 JDK历史版本下载地址 http www oracle com technet
  • 「VS Code」Visual Studio Code 菜鸟教程:从入门到精通

    VS Code Visual Studio Code 教程 从入门到精通 日志 2020 04 26 介绍如何配置 LaTeX 环境 2019 09 06 更新了选择默认终端的方法 在胶片中补全列选方式 2019 05 26 补全了全文的剩
  • 在Unity中进行单例的动态脚本加载

    首先调用Unity提供的注释可以在点下Play之后 在游戏真正启动前去执行一些脚本 要注意执行脚本要放在Assets Editor下 RuntimeInitializeOnLoadMethod RuntimeInitializeLoadTy