Unity3D反射实现状态返回

  最近做项目需要状态返回,感觉用反射的话会比较轻松。于是用反射获取Gameobject身上所有组件的属性与字段,下面放代码。

获取一个类内部的所有属性与字段

using System;
using System.Collections.Generic;
using System.Runtime.InteropServices;

/// <summary>
/// 类对象的信息
/// </summary>
public class ObjInfoClass
{
   private Dictionary<_PropertyInfo, object> _PropertyInfoDic = new Dictionary<_PropertyInfo, object>();//所有属性以及值
   private Dictionary<_FieldInfo, object> _FieldInfoDic = new Dictionary<_FieldInfo, object>();//所有字段以及值

    private object mainObj;//主要对象

    public ObjInfoClass(object obj)
    {
        this.mainObj = obj;
    }

    public void GetAllPropertyAndField() //获取所有属性字段
    {
        PropertyInfo[] propertyArray = mainObj.GetType().GetProperties();
        foreach (var item in propertyArray)
        {
            try
            {
                var value = item.GetValue(mainObj, null);
                _PropertyInfoDic.Add(item, value);
            }
            catch (Exception)
            {

            }
         
        }
        FieldInfo[] fieldArray = mainObj.GetType().GetFields();
        foreach (var item in fieldArray)
        {
            try
            {
                var value = item.GetValue(mainObj);
                _FieldInfoDic.Add(item, value);
            }
            catch (Exception)
            {

            }
         
        }

    }

    public void SetAllMember()//设置所有的成员
    {
        foreach (KeyValuePair<_PropertyInfo, object> item in _PropertyInfoDic)
        {
            try
            {
            item.Key.SetValue(mainObj, item.Value, null);

            }
            catch (Exception)
            {

            }
        }
        foreach (KeyValuePair<_FieldInfo, object> item in _FieldInfoDic)
        {
            try
            {
            item.Key.SetValue(mainObj, item.Value);

            }
            catch (Exception)
            {

            }
        }
    }

}

获取Gameobject脚本信息,以及自身active属性

/// <summary>
/// Game object对象的所有组件的信息
/// </summary>
public class GameobjectInfoClass
{
    private GameObject MainObj;//主要Gameobject

    public GameobjectInfoClass(GameObject go)
    {
        MainObj = go;
    }

    ObjInfoClass[] objInfoArray;//所有组件信息数组
    Component[] componentArray;//所有组件

    /// <summary>
    /// 获取所有组件
    /// </summary>
    public void GetAllComponent()
    {
        componentArray = MainObj.GetComponents<Component>();
    }
    /// <summary>
    /// 获取所有组件信息
    /// </summary>
    public void GetAllInfo()
    {
        if (componentArray.Length==0)
        {
            GetAllComponent();
        }
        objInfoArray = new ObjInfoClass[componentArray.Length+1];
        for (int i = 0; i < componentArray.Length; i++)
        {
            try
            {
            objInfoArray[i] = new ObjInfoClass(componentArray[i]);
                objInfoArray[i].GetAllPropertyAndField();

            }
            catch (Exception)
            {

            }
        }
        objInfoArray[componentArray.Length] = new ObjInfoClass(MainObj);//gameobject自身的信息
        objInfoArray[componentArray.Length].GetAllPropertyAndField();
    }
    /// <summary>
    /// 设置所有组件信息
    /// </summary>
    public void SetAllInfo()
    {
        foreach (var item in objInfoArray)
        {
            try
            {

            item.SetAllMember();
            }
            catch (Exception)
            {

            }
        }
    }
}
应用脚本

public class test : MonoBehaviour {

        public GameObject obj;
        private GameobjectInfoClass gameInfo ;
        [ContextMenu("获取信息")]
        public void GetInfo()
        {
            gameInfo = new GameobjectInfoClass(obj);
            gameInfo.GetAllComponent();
            gameInfo.GetAllInfo();

        }

        [ContextMenu("设置信息")]
        public void SetInfo()
        {
            gameInfo.SetAllInfo();
        }
    }



拿这个摄像机做例子,先存储信息。


对面板上的参数随意更改


再设置信息


再看这次的面板


是不是又一样了,复制的?不存在的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值