Unity数据加密☀️反射的用法:变量、属性、方法、重载,反射在DLL中的使用方法

本文涉及的产品
密钥管理服务KMS,1000个密钥,100个凭据,1个月
简介: Unity数据加密☀️反射的用法:变量、属性、方法、重载,反射在DLL中的使用方法

🟥 关于asmdef、DLL的特殊注意事项

若你要反射的脚本所在的文件夹或上层节点中含有asmdef,此时调用反射代码会报如下错误:

ArgumentException: Type cannot be null.


你添加了Assembly Definition Reference,此时运行正常了。但如果你将C#文件打包成DLL,又会报上面的错误。

DLL不支持直接直接使用 Type.GetType。


因此不要尝试网上的教程了,直接按照本文的最终方案来吧。


🟧GetType多平台方法

private Type GetType(string typeName)
    {
        var type = Type.GetType(typeName);
        if (type != null) return type;
        foreach (var a in AppDomain.CurrentDomain.GetAssemblies())
        {
            type = a.GetType(typeName);
            if (type != null)
                return type;
        }
        return null;
    }


🟧反射属性

private void SetProperty(string className, string propertyName, object value)
    {
    //SKODE.Test:反射的类,如果有命名空间就需要加上。
        Type tarClass = GetType("SKODE.Test");
        Component tarComponent = gameObject.GetComponent(tarClass);
        PropertyInfo tarProperty =
            tarClass.GetProperty("hi", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public);
        //将 tarComponent 组件的 tarProperty属性 设置为 true
        tarProperty.SetValue(tarComponent, true);
    }


🟨反射变量

private void SetField()
    {
        //SKODE.Test:反射的类,如果有命名空间就需要加上。
        Type tarClass = GetType("SKODE.Test");
        Component tarComponent = gameObject.GetComponent(tarClass);
        FieldInfo tarField =
            tarClass.GetField("hii", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public);
        //将 tarComponent 组件的 tarField变量 设置为 true
        tarField.SetValue(tarComponent, true);
    }


🟩反射方法

private void CallMethod()
    {
        //SKODE.Test:反射的类,如果有命名空间就需要加上。
        Type tarClass = GetType("SKODE.Test");
        Component tarComponent = gameObject.GetComponent(tarClass);
        MethodInfo tarMethod =
            tarClass.GetMethod("Call", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public);
        //调用 tarComponent 组件的 tarMethod方法,并传入参数 parameters。
        //若不需要传入参数,则传入null即可。
        object[] parameters = { true };
        tarMethod.Invoke(tarComponent, parameters);
    }


🟦 反射重载方法

在反射重载方法时,如果调用此重载方法,会产生"发现不明确的匹配"的错误。

AmbiguousMatchException: Ambiguous match found.


解决方案如下:

GetMethod("MethodName", new Type [] { typeof(参数类型)});

其中type数组中的项的个数是由要调用的方法的参数个数来决定的。

如果无参数,则new Type[]{},使Type数组中的项个数为0。


1️⃣ 被调用的方法


2️⃣ 反射方法

private void CallVirtualMethod()
    {
        //Doozy.Runtime.UIManager.Containers.UIContainer:反射的类,如果有命名空间就需要加上。
        Type tarClass = GetType("Doozy.Runtime.UIManager.Containers.UIContainer");
        Component tarComponent = GetComponent(tarClass);
        MethodInfo tarMethod = tarClass.GetMethod("Hide", new Type[] { });
        tarMethod.Invoke(tarComponent, null);
    }


相关文章
|
7月前
|
安全 API 开发工具
oss加密的配置方法
阿里云OSS提供多种加密选项:SSE-OSS(默认或对象级AES-256加密)、SSE-KMS(使用KMS托管CMK)、临时密钥加密和客户端加密(CSE)。可通过控制台或API设置Bucket策略,使用HTTP头部指定加密方式。KMS和临时密钥可能涉及更复杂的密钥管理和权限配置。
723 5
|
4月前
|
语音技术 开发工具 图形学
Unity与IOS⭐一、百度语音IOS版Demo调试方法
Unity与IOS⭐一、百度语音IOS版Demo调试方法
|
2月前
|
存储 安全 Java
|
2月前
|
算法 安全 数据安全/隐私保护
链接加密的方法有哪些?
【10月更文挑战第6天】链接加密的方法有哪些?
122 10
|
2月前
|
安全 数据安全/隐私保护 开发者
保护敏感数据:使用Python加密数据的实用方法
保护敏感数据是一项基本的安全实践,Python通过上述库提供了强大的加密工具来实现这一目标。选择哪种方法取决于具体的应用场景和安全需求:对称加密(如AES)适合快速处理大量数据,而非对称加密(如RSA)更适合安全地交换密钥或进行身份验证。哈希函数则用于验证数据的完整性和一致性。通过合理使用这些技术,开发者可以大大增强其应用程序的安全性。
83 0
|
4月前
|
前端开发 图形学
Unity精华☀️UI和物体可见性的判断方法
Unity精华☀️UI和物体可见性的判断方法
|
4月前
|
图形学 C# 开发者
全面掌握Unity游戏开发核心技术:C#脚本编程从入门到精通——详解生命周期方法、事件处理与面向对象设计,助你打造高效稳定的互动娱乐体验
【8月更文挑战第31天】Unity 是一款强大的游戏开发平台,支持多种编程语言,其中 C# 最为常用。本文介绍 C# 在 Unity 中的应用,涵盖脚本生命周期、常用函数、事件处理及面向对象编程等核心概念。通过具体示例,展示如何编写有效的 C# 脚本,包括 Start、Update 和 LateUpdate 等生命周期方法,以及碰撞检测和类继承等高级技巧,帮助开发者掌握 Unity 脚本编程基础,提升游戏开发效率。
92 0
|
4月前
|
PHP 数据库 数据安全/隐私保护
Unity数据加密☀️ 三、加密DLL供Unity使用
Unity数据加密☀️ 三、加密DLL供Unity使用
|
4月前
|
C# 图形学 数据安全/隐私保护
Unity数据加密☀️ 二、使用Rider将C#代码生成DLL文件
Unity数据加密☀️ 二、使用Rider将C#代码生成DLL文件
|
4月前
|
存储 Java 图形学
UNITY性能优化☀️一、GC介绍与Unity内存管理方法
UNITY性能优化☀️一、GC介绍与Unity内存管理方法