专栏首页逍遥剑客的游戏开发C#脚本实践(四): 反射与序列化

C#脚本实践(四): 反射与序列化

  • 序列化
    • 这个比较简单, .net直接就支持, 以XML序列化为例: public static string SerializeToString (object obj) { XmlSerializer serializer = new XmlSerializer (obj.GetType ()); using (StringWriter writer = new StringWriter()) { serializer.Serialize (writer, obj); return writer.ToString (); } } public static T SerializeFromString<T> (string xml) { XmlSerializer serializer = new XmlSerializer (typeof(T)); using (StringReader reader = new StringReader(xml)) { return (T)serializer.Deserialize (reader); } } public struct Vector3 { public float x; public float y; public float z; } public class TestClass { public int testInt = 1234; public float testFloat = 0.2341f; public bool[] boolArray = {true, false, false, true}; public Vector3 position; public TestClass () { this.position.x = 100; this.position.y = 100; this.position.z = 0; } } 结果如下:<?xml version="1.0" encoding="utf-8"?> <TestClass xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <testInt>1234</testInt> <testFloat>0.2341</testFloat> <boolArray> <boolean>true</boolean> <boolean>false</boolean> <boolean>false</boolean> <boolean>true</boolean> </boolArray> <position> <x>100</x> <y>100</y> <z>0</z> </position> </TestClass> 到时候把string用mono api传到C++里, 爱怎么存怎么存. 二进制格式同理
  • 反射
    • .net本身也支持反射, 问题是如何反射到C++里
    • 用mono api取得类的meta信息, 然后反应到编辑器上去编辑
    • 如果想偷懒的话, 可以直接用mono创建个窗口, 放个propertygrid控件, 再这个窗口嵌入到主编辑器的界面 int depth = 0; void ListFields(MonoObject* object) { assert(NULL != object); ++depth; MonoClass* objectClass = mono_object_get_class(object); const char* className = mono_class_get_name(objectClass); printf("[%s]\n", className); void* iter = NULL; MonoClassField* field = NULL; while (field = mono_class_get_fields(objectClass, &iter)) { for (int i = 0; i < depth; ++i) { printf("\t"); } const char* fieldName = mono_field_get_name(field); printf("%s : ", fieldName); MonoType* fieldType = mono_field_get_type(field); int type = mono_type_get_type(fieldType); switch (type) { case MONO_TYPE_BOOLEAN: { bool boolValue = false; mono_field_get_value(object, field, &boolValue); printf("%s\n", boolValue ? "true" : "false"); } break; case MONO_TYPE_I4: { int intValue = 0; mono_field_get_value(object, field, &intValue); printf("%d\n", intValue); } break; case MONO_TYPE_R4: { float floatValue = 0; mono_field_get_value(object, field, &floatValue); printf("%f\n", floatValue); } break; case MONO_TYPE_CHAR: case MONO_TYPE_I1: case MONO_TYPE_U1: case MONO_TYPE_I2: case MONO_TYPE_U2: case MONO_TYPE_U4: case MONO_TYPE_I: case MONO_TYPE_U: case MONO_TYPE_I8: case MONO_TYPE_U8: case MONO_TYPE_R8: { //@todo } break; case MONO_TYPE_SZARRAY: { MonoObject* value = mono_field_get_value_object(mono_domain_get(), field, object); MonoArray* array = (MonoArray*)value; uintptr_t size = mono_array_length(array); MonoClass* elementClass = mono_class_get_element_class(mono_object_get_class(value)); MonoType* elementType = mono_class_get_type(elementClass); switch (mono_type_get_type(elementType)) { case MONO_TYPE_BOOLEAN: { bool* data = mono_array_addr(array, bool, 0); for (int i = 0; i < size; ++i) { printf("%s ", data[i] ? "true" : "false"); } printf("\n"); } break; default: //@todo break; } className = mono_class_get_name(elementClass); } break; case MONO_TYPE_STRING: { MonoObject* value = mono_field_get_value_object(mono_domain_get(), field, object); MonoString* valueString = (MonoString*)value; const char* valueCStr = mono_string_to_utf8(valueString); printf("%s\n", valueCStr); } break; default: { MonoObject* value = mono_field_get_value_object(mono_domain_get(), field, object); ListFields(value); } break; } } --depth; } 输出: [TestClass] testBool : false testInt : 1234 testFloat : 0.234100 testString : hello boolArray : true false false true position : [Vector3] x : 100.000000 y : 100.000000 z : 0.000000

C#脚本实践(三): 集成到游戏

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

我来说两句

0 条评论
登录 后参与评论

相关文章

  • C#脚本实践(四): 反射与序列化

    逍遥剑客
  • 从Native到Web(六), emscripten学习笔记: SDL游戏移植尝试

    逍遥剑客
  • Lua的调试

    逍遥剑客
  • C#脚本实践(四): 反射与序列化

    逍遥剑客
  • Filebeat 执行 setup命令等待时长过久问题处理

    Beats是一个代理平台,其监控数据主要发往Logstash和Elasticsearch,其官方组件大致如下:

    南非骆驼说大数据
  • 用Docker容器开发区块链应用

    很多刚接触区块链的开发者面临的问题,是如何上手实践基础的区块链应用开发技术,如何了解它的关键技术实践点。本文介绍如何采用Docker容器技术,快速构建私有节点的...

    Henry Zhang
  • HIFI-Gan:generative adversarial Networks for Efficient and high Fidelity speech synthesis

    提出HIFI-gan方法来提高采样和高保真度的语音合成。语音信号由很多不同周期的正弦信号组成,对于音频周期模式进行建模对于提高音频质量至关重要。其次生成样本的速...

    AI之禅
  • 『高级篇』docker之了解CICD和DevOps(41)

    PS:CICD和DevOps有了进一步的认识,下次开始针对CICD做个环境跑跑实践一下。

    IT故事会
  • python之程序打包

    setup(name='Hello',version='1.0',description='A simple example',author='Magnus L...

    py3study
  • Python MySQLdb Linux

           本文介绍了Python MySQLdb Linux下安装笔记,本文分别讲解了快速安装和手动编译安装两种方法,并分别讲解了操作步骤,需要的朋友可以参...

    py3study

扫码关注云+社区

领取腾讯云代金券