Unity 编译顺序及原理

本文详细介绍了Unity中脚本的编译过程,包括4个步骤及其注意事项,并提供了一种通过调整脚本位置来减少编译时间的方法。同时,文章还介绍了Unity版本条件编译的概念,帮助开发者针对特定Unity版本使用特定功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


Unity compiles all scripts to .NET dll files. The .dll files will be jit compiled at runtime.

This allows incredibly fast script execution. It is around 20 times  faster than traditional javascript and around 50% slower than native C++  code. Unity might take a second to compile all your scripts when you save it. You can see if Unity is still compiling with the small spinning progress  icon in the lower right corner of Unity's main window.

Script compilation is performed in 4 steps:

1. All scripts in "Standard Assets", "Pro Standard Assets" or "Plugins" are compiled first.

Scripts in one of these folders can't directly access scripts outside these folders.

It is not possible to reference the class or its variables directly, but it is possible to communicate with them using GameObject.SendMessage.

2. All scripts in "Standard Assets/Editor", "Pro Standard Assets/Editor" or "Plugins/Editor" are compiled first.

If you want to use the UnityEditor namespace you have to place your scripts in these folders. For example to add menu items or write custom wizards you have to place your scripts in those folders.

These scripts can access scripts from the previous group.

3. All scripts in "Editor" are compiled next.

If you want to use the UnityEditor namespace you have to place your scripts in these folders. For example to add menu items or write custom wizards you have to place your scripts in those folders.

These scripts can access all scripts in all previous groups. However they can not access scripts, in the last group.

This can be a problem when wirting editor code since you often want to edit scripts that are in the last group. There are two solutions: 1. Move the other script into the "Plugins" folder. 2. Take advantage of JavaScript's dynamic typing. In Javascript you don't need to know the type of a class to work with it. When using GetComponent you can just use a string instead of the type. You can also use SendMessage, which takes a string.

4. All other scripts are compiled last.

All scripts that are not in the folders above are compiled last.

All scripts that are compiled in this step have access to all scripts in  the first group ("Standard Assets", "Pro Standard Assets" or  "Plugins"). This allows you to let different scripting languages interoperate. For example, if you want to create a Javascript that uses a C# script:  place the C# script in the "Standard Assets" folder and the Javascript  outside of the "Standard Assets" folder. The Javascript can now reference the C# script directly.

Scripts that are placed in the first group, will take longer to compile,  since when they are compiled the third group needs to be recompiled  too. Thus if you want to reduce compile times, move scripts that seldomly  change into group 1 and scripts that change a lot into group 4.

Conditional compilation against the Unity version.

Starting with Unity version 2.6 a C# preprocessor define has been added.  The define identifies the version of Unity in use and is intended to allow conditional access to specific features.  For example:

// Specific version define including the minor revision

#if UNITY_2_6_0

// Use Unity 2.6.0 specific feature

#endif

// Specific version define not including the minor revision

#if UNITY_2_6

// Use Unity 2.6.x specific feature

#endif

This code can be used to enable game features that are only available with a specific version of Unity. Note that this define is present from version 2.6 only. Future Unity versions will provide the appropriate define to identify the version to your scripts.










Unity compiles all scripts to .NET dll files. The .dll files will be jit compiled at runtime.

This allows incredibly fast script execution. It is around 20 times  faster than traditional javascript and around 50% slower than native C++  code. Unity might take a second to compile all your scripts when you save it. You can see if Unity is still compiling with the small spinning progress  icon in the lower right corner of Unity's main window.

Script compilation is performed in 4 steps:

1. All scripts in "Standard Assets", "Pro Standard Assets" or "Plugins" are compiled first.

Scripts in one of these folders can't directly access scripts outside these folders.

It is not possible to reference the class or its variables directly, but it is possible to communicate with them using GameObject.SendMessage.

2. All scripts in "Standard Assets/Editor", "Pro Standard Assets/Editor" or "Plugins/Editor" are compiled first.

If you want to use the UnityEditor namespace you have to place your scripts in these folders. For example to add menu items or write custom wizards you have to place your scripts in those folders.

These scripts can access scripts from the previous group.

3. All scripts in "Editor" are compiled next.

If you want to use the UnityEditor namespace you have to place your scripts in these folders. For example to add menu items or write custom wizards you have to place your scripts in those folders.

These scripts can access all scripts in all previous groups. However they can not access scripts, in the last group.

This can be a problem when wirting editor code since you often want to edit scripts that are in the last group. There are two solutions: 1. Move the other script into the "Plugins" folder. 2. Take advantage of JavaScript's dynamic typing. In Javascript you don't need to know the type of a class to work with it. When using GetComponent you can just use a string instead of the type. You can also use SendMessage, which takes a string.

4. All other scripts are compiled last.

All scripts that are not in the folders above are compiled last.

All scripts that are compiled in this step have access to all scripts in  the first group ("Standard Assets", "Pro Standard Assets" or  "Plugins"). This allows you to let different scripting languages interoperate. For example, if you want to create a Javascript that uses a C# script:  place the C# script in the "Standard Assets" folder and the Javascript  outside of the "Standard Assets" folder. The Javascript can now reference the C# script directly.

Scripts that are placed in the first group, will take longer to compile,  since when they are compiled the third group needs to be recompiled  too. Thus if you want to reduce compile times, move scripts that seldomly  change into group 1 and scripts that change a lot into group 4.

Conditional compilation against the Unity version.

Starting with Unity version 2.6 a C# preprocessor define has been added.  The define identifies the version of Unity in use and is intended to allow conditional access to specific features.  For example:

// Specific version define including the minor revision

#if UNITY_2_6_0

// Use Unity 2.6.0 specific feature

#endif

// Specific version define not including the minor revision

#if UNITY_2_6

// Use Unity 2.6.x specific feature

#endif

This code can be used to enable game features that are only available with a specific version of Unity. Note that this define is present from version 2.6 only. Future Unity versions will provide the appropriate define to identify the version to your scripts.






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值