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

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

当然, 最成熟的还是Unity

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

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

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

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

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

  1. using UnityEngine;  
  2. using System.Collections;  
  3. public class RotateBehaviourScript : MonoBehaviour {  
  4. public float speed = 5.0f;  
  5. // Use this for initialization
  6. void Start () {  
  7.     }  
  8. // Update is called once per frame
  9. void Update () {  
  10.         transform.Rotate(0, speed * Time.deltaTime, 0);  
  11.     }  
  12. }  

这得益于.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重新载入

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

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏恰童鞋骚年

设计模式的征途—1.单例(Singleton)模式

  单例模式属于创建型模式的一种,创建型模式是一类最常用的设计模式,在软件开发中应用非常广泛。创建型模式将对象的创建和使用分离,在使用对象时无需关心对象的创建细...

14620
来自专栏木宛城主

ASP.NET MVC 随想录—— 使用ASP.NET Identity实现基于声明的授权,高级篇

在这篇文章中,我将继续ASP.NET Identity 之旅,这也是ASP.NET Identity 三部曲的最后一篇。在本文中,将为大家介绍ASP.NET ...

24680
来自专栏学习力

《Java从入门到放弃》框架入门篇:hibernate中的多表对应关系

23570
来自专栏猿人谷

Unix下c程序内存泄露检测工具

Valgrind是一款用于内存调试、内存泄漏检测以及性能分析的软件开发工具。 Valgrind的最初作者是Julian Seward,他于2006年由于在开发V...

23070
来自专栏编程直播室

编程星球——水·滴20180624期

16130
来自专栏owent

pbc的一个陈年老BUG

近期跟了一下pbc的lua-binding的一个老BUG,起源是我们客户端报了一个奇怪的问题,我们游戏里的某些功能的optional字段,服务器并没有下发数据,...

13220
来自专栏小狼的世界

Crontab中的除号(slash)到底怎么用?

crontab 是Linux中配置定时任务的工具,在各种配置中,我们经常会看到除号(Slash)的使用,那么这个除号到底标示什么意思,使用中有哪些需要注意的地方...

10620
来自专栏前端黑板报

HTTP2基础教程-读书笔记(四)

? 记录一下HTTP/2的底层原理,帮助理解协议实现细节。 连接 每个端点都需要发送一个连接作为最终确认使用的协议,并建立http/2连接的初始设置。客户端和...

35460
来自专栏IMWeb前端团队

Flash as3 socket编程入门

什么是socket? 所谓socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄。应用程序通常通过"套接字"向网络发出请求或者应答网络请求...

231100
来自专栏高性能服务器开发

windows完成端口(一)

系列目录 windows完成端口(一) windows完成端口(二) windows完成端口(三) windows完成端口(四) windows完成端口(五) ...

56350

扫码关注云+社区

领取腾讯云代金券