专栏首页Unity TechnologyJtro的技术分享:三言两语说反射(unity中使用反射)

Jtro的技术分享:三言两语说反射(unity中使用反射)

反射(Reflection)的用途

反射(Reflection)有下列用途:
它允许在运行时查看特性(attribute)信息。
它允许审查集合中的各种类型,以及实例化这些类型。
它允许延迟绑定的方法和属性(property)。
它允许在运行时创建新类型,然后使用这些类型执行一些任务。
1.

反射指程序可以访问、检测和修改它本身状态或行为的一种能力。

2.

程序集包含模块,而模块包含类型,类型又包含成员。反射则提供了封装程序集、模块和类型的对象。

3.

可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型。然后,可以调用类型的方法或访问其字段和属性。

反射是一个十分简单而又灵活的东西,用好了,它就像一只温驯的猫,用不好,它就是被猫玩耍后的毛线团.

优缺点

优点:

1.反射提高了程序的灵活性和扩展性。
2.降低耦合性,提高自适应能力。
3.它允许程序创建和控制任何类的对象,无需提前硬编码目标类。

缺点:

1. 性能问题:使用反射基本上是一种解释操作,用于字段和方法接入时要远慢于直接代码。因此反射机制主要应用在对灵活性和拓展性要求很高的系统框架上,普通程序不建议使用。
2.使用反射会模糊程序内部逻辑;程序员希望在源代码中看到程序的逻辑,反射却绕过了源代码的技术,因而会带来维护的问题,反射代码比相应的直接代码更复杂。

Show Code

在unity中新建一个脚本

这个脚本是需要来反射的

public class Drawed
{
    public int Num1;
    public int Num2;
    public string Str1;
    public Drawed()
    {
        Num1 = 1;
        Num2 = 1;
        Str1 = "Hi,I am Jtro !";
    }

    public int GetNum1()
    {
        return Num1;
    }

    public string GetStr()
    {
        return Str1;
    }

    public string SayHello(string Greeting, string Name)
    {
        return Greeting + "," + Name;
    }
}

然后在新建一个UseDraw脚本,挂在摄像机上

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

public class UseDraw : MonoBehaviour
{
    public Drawed drawed = new Drawed();

    string Greeting = "Hello";
    string Name = "I am Jtro";
   
    // Start is called before the first frame update
    void Start()
    {
        MethodInfo getnum1 = drawed.GetType().GetMethod("GetNum1");
        Debug.Log(getnum1.Invoke(drawed, null));

        MethodInfo getstr = drawed.GetType().GetMethod("GetStr");
        Debug.Log(getstr.Invoke(drawed, null));

        MethodInfo sayHello = drawed.GetType().GetMethod("SayHello");
        string [] obj = new string[] {Greeting ,Name };//对于反射中传入值的一个封装
        Debug.Log(sayHello.Invoke(drawed, obj));

    }

    // Update is called once per frame
    void Update()
    {
        
    }
}

其中前两个反射方法很简单,没有传值,第三个方法中呢,是需要传入一些值的 在得到了MethodInfo之后呢,用invoke就可以执行该方法: invoke原型如下表格:

object Invoke (object obj,object[] parameters);

参数

说明

obj

一个对象引用,将调用它所指向的对象上的方法

parameters

所有需要传递方法的参数都必须在parameters数组中指定,如果这个方法中没有参数,那么也要写一个"null"

运行结果如下:

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Jtro的技术分享:MVC框架

    MVC框架历史悠久了,具体多久我也不知道,但是在游戏开发中的UI 使用太普遍了,最近我的一个徒弟跟我抱怨说网上的mvc框架晦涩难懂,看了一下午看不出所以然来,我...

    LittleU
  • Jtro的技术分享:unity接入百度语音识别SDK

    首先,你要去百度申请一个百度的AI开放平台的账号:https://ai.baidu.com/?track=cp:aipinzhuan|pf:pc|pp:AIpi...

    LittleU
  • Jtro的技术分享:Unity读取excel表格文件生成asset配置表文件

    项目开源地址:https://github.com/641273917/unity_Excel-asset- 许多时候,我们需要通过excel表格来生成我们要...

    LittleU
  • 设计模式之解释器模式

    Given a language, define a representation for its grammar along with an interpre...

    beginor
  • C#笔记:反射的简单用法

    反射其实说白了就是,当你知道类的名字和位置。你可以在程序运行时直接创建实例调用它。没什么大不了的。

    超级大猪
  • 设计原则之单一职责

    上述就违反了单一职责原则,对于不同的交通工具,代码逻辑完全耦合在一起,我们无论修改那一类的交通工具,都会影响其他两种数据

    止术
  • 聊聊rocketmq的MessageQueueSelector

    rocketmq-client-4.5.2-sources.jar!/org/apache/rocketmq/client/producer/MessageQu...

    codecraft
  • 聊聊rocketmq的MessageQueueSelector

    rocketmq-client-4.5.2-sources.jar!/org/apache/rocketmq/client/producer/MessageQu...

    codecraft
  • Python的PIL库中getpixel方法的使用

    getpixel函数是用来获取图像中某一点的像素的RGB颜色值,getpixel的参数是一个坐标点。对于图象的不同的模式,getpixel函数返回的值有所不同。

    砸漏
  • 【译】2019年开始使用Typescript

    基于2018年Stack Overflow Developer的调研,TypeScript作为编程语言比JavaScript更受“喜爱”。TypeScript在...

    嘉明

扫码关注云+社区

领取腾讯云代金券