【游戏技术群】959392658  【游戏出海群】12067810
游戏蛮牛 手机端
开启辅助访问
 找回密码
 注册帐号

扫一扫,访问微社区

开发者专栏

关注:2422

当前位置:游戏蛮牛 技术专区 开发者专栏

__________________________________________________________________________________
开发者干货区版块规则:

  1、文章必须是图文形式。(至少2幅图)
      2、文章字数必须保持在1500字节以上。(编辑器右下角有字数检查)
      3、本版块只支持在游戏蛮牛原创首发,不支持转载。
      4、本版块回复不得无意义,如:顶、呵呵、不错......【真的会扣分的哦】
      5、......
__________________________________________________________________________________
查看: 680|回复: 34

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

[复制链接]  [移动端链接]
排名
143
昨日变化

119

主题

557

帖子

6809

积分

Rank: 9Rank: 9Rank: 9

UID
3579
好友
108
蛮牛币
4954
威望
0
注册时间
2013-9-10
在线时间
1456 小时
最后登录
2019-2-22

专栏作家社区QQ达人活力之星游戏蛮牛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面板上的结构体字段的值也会相应的改变,在输入错误的时候,还加入了相应的处理,出现输入的值和字段类型不匹配则回到上一个输入框的值,并且结构体不发生改变。
dd.gif
最后,将修改后的结构体变量的值存成文本文件:

[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日久生情
1909/5000
排名
2587
昨日变化
12

8

主题

683

帖子

1909

积分

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

UID
40014
好友
16
蛮牛币
2415
威望
0
注册时间
2014-8-15
在线时间
494 小时
最后登录
2019-2-21
QQ
发表于 2019-1-23 20:25:49 | 显示全部楼层
利用反射制作动态编辑栏

回复 支持 反对

使用道具 举报

7日久生情
2110/5000
排名
1508
昨日变化
5

0

主题

671

帖子

2110

积分

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

UID
135463
好友
0
蛮牛币
264
威望
0
注册时间
2016-1-23
在线时间
599 小时
最后登录
2019-2-23
发表于 2019-1-23 21:16:42 | 显示全部楼层
6666666666666777777777

回复 支持 反对

使用道具 举报

7日久生情
2110/5000
排名
1508
昨日变化
5

0

主题

671

帖子

2110

积分

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

UID
135463
好友
0
蛮牛币
264
威望
0
注册时间
2016-1-23
在线时间
599 小时
最后登录
2019-2-23
发表于 2019-1-23 21:19:50 | 显示全部楼层
66666666666667777777777

回复 支持 反对

使用道具 举报

6蛮牛粉丝
1421/1500
排名
4444
昨日变化
35

0

主题

844

帖子

1421

积分

Rank: 6Rank: 6Rank: 6

UID
254705
好友
1
蛮牛币
1379
威望
0
注册时间
2017-11-16
在线时间
247 小时
最后登录
2019-2-22
发表于 2019-1-24 08:38:33 | 显示全部楼层
66666666666667777777777

回复 支持 反对

使用道具 举报

5熟悉之中
885/1000
排名
2333
昨日变化
7

0

主题

150

帖子

885

积分

Rank: 5Rank: 5

UID
26073
好友
0
蛮牛币
3471
威望
0
注册时间
2014-5-21
在线时间
129 小时
最后登录
2019-2-23
发表于 2019-1-24 08:44:54 | 显示全部楼层
牛牛牛!佩服!

回复

使用道具 举报

7日久生情
2193/5000
排名
601
昨日变化

1

主题

136

帖子

2193

积分

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

UID
43081
好友
1
蛮牛币
1524
威望
0
注册时间
2014-9-1
在线时间
680 小时
最后登录
2019-2-23
发表于 2019-1-24 08:45:00 | 显示全部楼层
Unity实用小工具或脚本—利用反射制作动态编辑栏(二)
[发帖际遇]: 一个袋子砸在了 马孺尘 头上,马孺尘 赚了 1 蛮牛币. 幸运榜 / 衰神榜

回复 支持 反对

使用道具 举报

7日久生情
3984/5000
排名
145
昨日变化
1

11

主题

518

帖子

3984

积分

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

UID
52346
好友
0
蛮牛币
5666
威望
0
注册时间
2014-10-31
在线时间
1043 小时
最后登录
2019-2-22
发表于 2019-1-24 08:47:56 | 显示全部楼层
感谢分享  感谢分享

回复 支持 反对

使用道具 举报

2初来乍到
116/150
排名
13600
昨日变化
264

0

主题

24

帖子

116

积分

Rank: 2Rank: 2

UID
308426
好友
0
蛮牛币
209
威望
0
注册时间
2018-12-16
在线时间
24 小时
最后登录
2019-2-23
发表于 2019-1-24 09:12:23 | 显示全部楼层
aaaaaaaaaaaaaaaaaa

回复 支持 反对

使用道具 举报

排名
64379
昨日变化
36

0

主题

5

帖子

28

积分

Rank: 1

UID
309391
好友
0
蛮牛币
59
威望
0
注册时间
2018-12-24
在线时间
23 小时
最后登录
2019-2-1
发表于 2019-1-24 09:22:15 | 显示全部楼层
6666666666666777777777
[发帖际遇]: @一杯热可可 发帖时在路边捡到 2 蛮牛币,偷偷放进了口袋. 幸运榜 / 衰神榜

回复 支持 反对

使用道具 举报

5熟悉之中
851/1000
排名
3579
昨日变化
18

1

主题

60

帖子

851

积分

Rank: 5Rank: 5

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

回复 支持 反对

使用道具 举报

5熟悉之中
878/1000
排名
3499
昨日变化
3

9

主题

85

帖子

878

积分

Rank: 5Rank: 5

UID
202690
好友
5
蛮牛币
1226
威望
0
注册时间
2017-1-17
在线时间
339 小时
最后登录
2019-2-22
发表于 2019-1-24 09:37:59 | 显示全部楼层
6666666666

回复

使用道具 举报

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

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日久生情
1894/5000
排名
605
昨日变化
1

2

主题

44

帖子

1894

积分

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

UID
182935
好友
0
蛮牛币
4878
威望
0
注册时间
2016-11-11
在线时间
484 小时
最后登录
2019-2-22
发表于 2019-1-24 14:25:17 | 显示全部楼层
Unity实用小工具或脚本—利用反射制作动态编辑栏(二)

回复 支持 反对

使用道具 举报

5熟悉之中
524/1000
排名
6030
昨日变化
33

7

主题

111

帖子

524

积分

Rank: 5Rank: 5

UID
236132
好友
2
蛮牛币
398
威望
0
注册时间
2017-8-6
在线时间
174 小时
最后登录
2019-2-23
发表于 2019-1-24 15:15:02 | 显示全部楼层
反射机制
[发帖际遇]: 一个袋子砸在了 LLzj 头上,LLzj 赚了 1 蛮牛币. 幸运榜 / 衰神榜

回复

使用道具 举报

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

本版积分规则

快速回复 返回顶部 返回列表