当前位置: 首页 > news >正文

C#脚本实践(二): Unity脚本机制分析

目前我了解到使用Mono做脚本的只有Unity和SecondLife, SpringEngine也有个扩展实现.

当然, 最成熟的还是Unity

于是下载了一个看看它的脚本是怎么应用的

它的编辑器界面很简洁, 实际操作了一下才发现所有的功能其本上都是由inspector面板完成

所有的GameObject都是由Component所组成, 如Mesh/Physics/Audio/Script等等

脚本都是从MonoBehaviour派生的一个实现, 在其中实现上层定义的各种接口, 如Start/Update等

脚本中定义的变量会直接反映到Inspector面板上, 如

using UnityEngine; using System.Collections; public class RotateBehaviourScript : MonoBehaviour { public float speed = 5.0f; // Use this for initialization void Start () { } // Update is called once per frame void Update () { transform.Rotate(0, speed * Time.deltaTime, 0); } }

这得益于.Net语言反射机制的强大, 也是我为什么使用.net开发编辑器的原因之一

之前还一直在想Unity是怎么动态载入脚本的, 因为mono里我只找到一个mono_domain_assembly_open的函数

在看了下测试工程的文件夹结构, 发一个文件: New Unity Project\Library\ScriptAssemblies\Assembly-CSharp.dll

看来这个就是脚本编译后的东西. 用Reflector查看了一下, 果然我写的两个测试脚本都在其中:

另外, UnityEngine.dll里的类全是InternalCall的声明, 这正好印证了上一篇C++导出到Mono的调用猜想

知道了这个, Unity的脚本机制也就差不多了:

1. C++实现引擎底层

2. Mono这边把需要暴露给脚本的类/方法/变量都再声明一次(自动生成应该也是可行的)

3. 定义脚本基类, 所有脚本对象都从它派生

4. 编辑器中发现有脚本更改就在后台重新编译assembly dll, 编译完了用Mono API重新载入

嗯, 中间那一层还是有不少需要实现的东西~

相关文章:

  • postgresql 数据库-密码修改
  • 解决linux oracle shell上下箭调用历史命令
  • 模板 BFS
  • 类加载器及其委托机制的深入分析
  • 《.NET 4.0面向对象编程漫谈》勘误表(2011年1月14日更新)
  • 【转】Android中的内存管理--不错不错,避免使用枚举类型
  • VisualSVN server安装及使用 转
  • Protobuf-net学习笔记
  • how to solve ORA-02293
  • (floyd+补集) poj 3275
  • 我大四了,oh,我要毕业了 _随笔
  • MeeGo handset 1.1开发环境[3]:直接使用Qemugl
  • Resharper
  • C++ VS C#(1):注释,变量,控制台输出
  • 我的java mvc
  • 2017年终总结、随想
  • 3.7、@ResponseBody 和 @RestController
  • CentOS6 编译安装 redis-3.2.3
  • CODING 缺陷管理功能正式开始公测
  • CSS 提示工具(Tooltip)
  • extjs4学习之配置
  • Flex布局到底解决了什么问题
  • GraphQL学习过程应该是这样的
  • Javascripit类型转换比较那点事儿,双等号(==)
  • java多线程
  • MySQL用户中的%到底包不包括localhost?
  • niucms就是以城市为分割单位,在上面 小区/乡村/同城论坛+58+团购
  • React的组件模式
  • React组件设计模式(一)
  • 关于List、List?、ListObject的区别
  • 极限编程 (Extreme Programming) - 发布计划 (Release Planning)
  • 技术发展面试
  • 面试遇到的一些题
  • 使用parted解决大于2T的磁盘分区
  • 文本多行溢出显示...之最后一行不到行尾的解决
  • ​​​​​​​​​​​​​​Γ函数
  • # Swust 12th acm 邀请赛# [ A ] A+B problem [题解]
  • #经典论文 异质山坡的物理模型 2 有效导水率
  • (14)Hive调优——合并小文件
  • (附源码)ssm户外用品商城 毕业设计 112346
  • (十三)Java springcloud B2B2C o2o多用户商城 springcloud架构 - SSO单点登录之OAuth2.0 根据token获取用户信息(4)...
  • (四)docker:为mysql和java jar运行环境创建同一网络,容器互联
  • (算法设计与分析)第一章算法概述-习题
  • (太强大了) - Linux 性能监控、测试、优化工具
  • (一)硬件制作--从零开始自制linux掌上电脑(F1C200S) <嵌入式项目>
  • ******之网络***——物理***
  • .NET/C# 使用反射注册事件
  • .net反编译工具
  • .net获取当前url各种属性(文件名、参数、域名 等)的方法
  • .NET中GET与SET的用法
  • .project文件
  • ??在JSP中,java和JavaScript如何交互?
  • []新浪博客如何插入代码(其他博客应该也可以)
  • [<MySQL优化总结>]
  • [100天算法】-目标和(day 79)