找回密码
 注册帐号

扫一扫,访问微社区

zhang273162308 Unity实用小工具或脚本—利用反射制作动态编辑栏(二)

48
回复
2127
查看
[ 复制链接 ]
排名
141
昨日变化

124

主题

595

帖子

6994

积分

Rank: 9Rank: 9Rank: 9

UID
3579
好友
109
蛮牛币
5259
威望
0
注册时间
2013-9-10
在线时间
1542 小时
最后登录
2019-8-24

专栏作家活力之星游戏蛮牛QQ群会员蛮牛哥

2019-1-23 17:10:56 显示全部楼层 阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?注册帐号

x
一、前言
上一章通过反射实现创建动态编辑栏,但是此时的编辑栏还并没有和结构体数据关联。本章将实现编辑栏中修改的数据将反馈到对应的结构体中,并最后通过序列化将结构体数据以文本的形式进行存储
二、实现
1、FieldInfo.SetValue方法
将给定对象的字段设置为给定值,查阅了C#的官方文档,上面的案例是这样的
[C#] 纯文本查看 复制代码
using System;
using System.Reflection;
using System.Globalization;

public class Example
{
    private string myString;
    public Example()
    {
        myString = "Old value";
    }

    public string StringProperty
    {
        get
        {
            return myString;
        }
    }
}

public class FieldInfo_SetValue
{
    public static void Main()
    {
        Example myObject = new Example();
        Type myType = typeof(Example);
        FieldInfo myFieldInfo = myType.GetField("myString", 
            BindingFlags.NonPublic | BindingFlags.Instance); 

        // Display the string before applying SetValue to the field.
        Console.WriteLine( "\nThe field value of myString is \"{0}\".", 
        myFieldInfo.GetValue(myObject)); 
        // Display the SetValue signature used to set the value of a field.
        Console.WriteLine( "Applying SetValue(Object, Object)."); 
   
        // Change the field value using the SetValue method. 
        myFieldInfo.SetValue(myObject, "New value"); 
        // Display the string after applying SetValue to the field.
        Console.WriteLine( "The field value of mystring is \"{0}\".", 
            myFieldInfo.GetValue(myObject));
    }
}

/* This code example produces the following output:

The field value of myString is "Old value".
Applying SetValue(Object, Object).
The field value of mystring is "New value".

这段代码在参数是类的对象的时候是毫无问题的,但是传进来结构体变量的时候,就会出现没有附上值的问题。这个主要是跟结构体是值类型,类是引用类型有关。
Fieldinfo.SetValue(object,object),里面的参数都是引用类型的,而结构体是指类型,在调用该方法传结构体变量的时候,会将结构体赋值一份新的,然后在方法里面对新的值进行了修改,而传进去原来的结构体并没有任何改变。所以,在调用SetValue之前,先将结构体进行装箱操作变成Object类型的变量,然后,在进行拆箱操作,将Object变量转换成结构体变量。代码如下:
游客,如果您要查看本帖隐藏内容请回复

我将这个方法进行了简单的泛型处理,这样保证不管是什么结构体或类都可以作为参数传递进来,并进行转换。方法最后,返回的是一个Object类型的变量,对这个变量进行拆箱操作就可以了:
游客,如果您要查看本帖隐藏内容请回复

在每一个编辑栏的输入框组建中都添加了编辑结束响应事件,保证每次对单个编辑框编辑的时候,结构体的数据都会得到修改如图所示:当对单个编辑框进行修改的时候,右侧的Inspector面板上的结构体字段的值也会相应的改变,在输入错误的时候,还加入了相应的处理,出现输入的值和字段类型不匹配则回到上一个输入框的值,并且结构体不发生改变。

3.png

最后,将修改后的结构体变量的值存成文本文件:

[C#] 纯文本查看 复制代码
 public static object SetValue_ReflectMethod<T>(T obj, string paramName, string paramValue)
{
//先装箱 变成引用类型的
object tempObj = obj;
if (obj != null)
{
try
{
Type tempType = obj.GetType();
//设置字段
FieldInfo tempFI = tempType.GetField(paramName);
tempFI.SetValue(tempObj, Convert.ChangeType(paramValue, tempFI.FieldType));
//设置属性
//PropertyInfo tempPI = tempType.GetProperty(paramName);
//tempPI.SetValue(tempObj, Convert.ChangeType(paramValue, tempPI.PropertyType), null);
}
catch (Exception e)
{
Debug.Log("编辑错误" + e.Message);
tempObj = null;
}
}
return tempObj;
}


三、总结
1、初步具备了根据结构体字段来动态创建编辑框的功能

2、可以在输入框中对结构体的对应名称字段进行修改,并且编辑框中还加入了错误输入的处理
3、将结构体数据保存成Json文件
4、尚不具备对泛型的处理


未完待续。。。。。


工程案例地
游客,如果您要查看本帖隐藏内容请回复









本帖被以下淘专辑推荐:

回复

使用道具 举报

7日久生情
2181/5000
排名
2353
昨日变化

8

主题

798

帖子

2181

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
40014
好友
16
蛮牛币
3182
威望
0
注册时间
2014-8-15
在线时间
601 小时
最后登录
2019-8-25
QQ
2019-1-23 20:25:49 显示全部楼层
利用反射制作动态编辑栏
回复 支持 反对

使用道具 举报

7日久生情
2385/5000
排名
1387
昨日变化

0

主题

742

帖子

2385

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
135463
好友
0
蛮牛币
87
威望
0
注册时间
2016-1-23
在线时间
751 小时
最后登录
2019-8-24
2019-1-23 21:16:42 显示全部楼层
6666666666666777777777
回复 支持 反对

使用道具 举报

7日久生情
2385/5000
排名
1387
昨日变化

0

主题

742

帖子

2385

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
135463
好友
0
蛮牛币
87
威望
0
注册时间
2016-1-23
在线时间
751 小时
最后登录
2019-8-24
2019-1-23 21:19:50 显示全部楼层
66666666666667777777777
回复 支持 反对

使用道具 举报

7日久生情
2132/5000
排名
4092
昨日变化

0

主题

1406

帖子

2132

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
254705
好友
1
蛮牛币
1933
威望
0
注册时间
2017-11-16
在线时间
364 小时
最后登录
2019-8-24
2019-1-24 08:38:33 显示全部楼层
66666666666667777777777
回复 支持 反对

使用道具 举报

6蛮牛粉丝
1160/1500
排名
2066
昨日变化

0

主题

262

帖子

1160

积分

Rank: 6Rank: 6Rank: 6

UID
26073
好友
1
蛮牛币
4413
威望
0
注册时间
2014-5-21
在线时间
230 小时
最后登录
2019-8-23
2019-1-24 08:44:54 显示全部楼层
牛牛牛!佩服!
回复

使用道具 举报

7日久生情
2297/5000
排名
583
昨日变化

1

主题

145

帖子

2297

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
43081
好友
1
蛮牛币
1138
威望
0
注册时间
2014-9-1
在线时间
749 小时
最后登录
2019-8-20
2019-1-24 08:45:00 显示全部楼层
Unity实用小工具或脚本—利用反射制作动态编辑栏(二)
回复 支持 反对

使用道具 举报

7日久生情
4126/5000
排名
142
昨日变化

11

主题

549

帖子

4126

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
52346
好友
0
蛮牛币
6303
威望
0
注册时间
2014-10-31
在线时间
1126 小时
最后登录
2019-8-23
2019-1-24 08:47:56 显示全部楼层
感谢分享  感谢分享
回复 支持 反对

使用道具 举报

3偶尔光临
271/300
排名
9870
昨日变化

0

主题

27

帖子

271

积分

Rank: 3Rank: 3Rank: 3

UID
308426
好友
0
蛮牛币
853
威望
0
注册时间
2018-12-16
在线时间
132 小时
最后登录
2019-8-24
2019-1-24 09:12:23 显示全部楼层
aaaaaaaaaaaaaaaaaa
回复 支持 反对

使用道具 举报

排名
64936
昨日变化

0

主题

9

帖子

58

积分

Rank: 2Rank: 2

UID
309391
好友
0
蛮牛币
70
威望
0
注册时间
2018-12-24
在线时间
47 小时
最后登录
2019-8-8
2019-1-24 09:22:15 显示全部楼层
6666666666666777777777
回复 支持 反对

使用道具 举报

5熟悉之中
960/1000
排名
3264
昨日变化

1

主题

70

帖子

960

积分

Rank: 5Rank: 5

UID
149521
好友
2
蛮牛币
586
威望
0
注册时间
2016-5-23
在线时间
433 小时
最后登录
2019-7-24
2019-1-24 09:22:41 显示全部楼层
参数都是引用类型的,而结构体是指类型,在调用该方法传结构体变量
回复 支持 反对

使用道具 举报

5熟悉之中
921/1000
排名
3360
昨日变化

9

主题

86

帖子

921

积分

Rank: 5Rank: 5

UID
202690
好友
5
蛮牛币
1306
威望
0
注册时间
2017-1-17
在线时间
360 小时
最后登录
2019-8-20
2019-1-24 09:37:59 显示全部楼层
6666666666
回复

使用道具 举报

3偶尔光临
261/300
排名
14744
昨日变化

0

主题

47

帖子

261

积分

Rank: 3Rank: 3Rank: 3

UID
114875
好友
0
蛮牛币
122
威望
0
注册时间
2015-7-23
在线时间
160 小时
最后登录
2019-1-28
2019-1-24 10:53:43 显示全部楼层
1111111111111111111111111111111111111
回复 支持 反对

使用道具 举报

7日久生情
2075/5000
排名
568
昨日变化

2

主题

50

帖子

2075

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
182935
好友
0
蛮牛币
5554
威望
0
注册时间
2016-11-11
在线时间
603 小时
最后登录
2019-8-24
2019-1-24 14:25:17 显示全部楼层
Unity实用小工具或脚本—利用反射制作动态编辑栏(二)
回复 支持 反对

使用道具 举报

5熟悉之中
959/1000
排名
5479
昨日变化

16

主题

197

帖子

959

积分

Rank: 5Rank: 5

UID
236132
好友
2
蛮牛币
2510
威望
0
注册时间
2017-8-6
在线时间
486 小时
最后登录
2019-8-24
2019-1-24 15:15:02 显示全部楼层
反射机制
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册帐号

本版积分规则