谁有unity4.X,急求unity editor logUtiltiy脚本

1036人阅读
unity3d(13)
这是一个关于Unity内部脚本如何工作的简单概览。
Unity内部的脚本,是通过附加自定义脚本对象到游戏物体组成的。在脚本对象内部不同志的函数被特定的事件调用。最常用的列在下面:
Update:这个函数在渲染一帧之前被调用,这里是大部分游戏行为代码被执行的地方,除了物理代码。
FixedUpdate:这个函数在每个物理时间步被调用一次,这是处理基于物理游戏的地方。
在任何函数之外的代码:
在任何函数之外的代码在物体被加载的时候运行,这个可以用来初始化脚本状态。
注意:文档的这个部份假设你是用Javascript,参考用C#编写获取如何使用C#和Boo编写脚本的信息。
你也能定义事件句柄,它们的名称都以On开始,(例如OnCollisionEnter),为了查看完整的预定义事件的列表,参考MonoBehaviour 文档。
大多数游戏物体的操作是通过游戏物体的Transform或Rigidbody来做的,在行为脚本内部它们可以分别通过transform和rigidbody访问,因此如果你想绕着Y轴每帧旋转5度,你可以如下写:
function Update(){
transform.Rotate(0,5,0);
如果你想向前移动一个物体,你应该如下写:
function Update(){
transform.Translate(0,0,2);
Time类包含了一个非常重要的类变量,称为deltaTime,这个变量包含从上一次调用Update或FixedUpdate(根据你是在Update函数还是在FixedUpdate函数中)到现在的时间量。
所以对于上面的例子,修改它使这个物体以一个恒定的速度旋转而不依赖于帧率:
function Update(){
transform.Rotate(0,5*Time.deltaTime,0);
移动物体:
function Update(){
transform. Translate (0, ,0,2*Time.deltaTime);
如果你加或是减一个每帧改变的值,你应该将它与Time.deltaTime相乘。当你乘以Time.deltaTime时,你实际的表达:我想以10米/秒移动这个物体不是10米/帧。这不仅仅是因为你的游戏将独立于帧而运行,同时也是因为运动的单位容易理解。( 米/秒)
另一个例子,如果你想随着时间增加光照的范围。下面的表达式,以2单位/秒改变半径。
function Update (){
light.range += 2.0 * Time.deltaT
当通过力处理刚体的时候,你通常不必用Time.deltaTime,因为引擎已经为你考虑到了这一点。
访问其他组件
组件被附加到游戏物体,附加Renderer到游戏物体使它在场景中渲染,附加一个Camera使它变为相机物体,所有的脚本都是组件,因为它们能被附加到游戏物体。
最常用的组件可以作为简单成员变量访问:
Component& && && && & 可如下访问
Transform& && && && & transform
Rigidbody& && && && & rigidbody
Renderer& && && && &&&renderer
Camera& && && && && & camera (only on camera objects)
Light& && && && && &&&light (only on light objects)
Animation& && && && & animation
Collider& && && && &&&collider
对于完整的预定义成员变量的列表。查看Component,Behaviour和MonnoBehaviour类文档。如果游戏物体没有你想取的相同类型的组件,上面的变量将被设置为null。
任何附加到一个游戏物体的组件或脚本都可以通过GetComponent访问。
transform.Translate(0,3,0);&&//等同于
GetComponent(Transform).Translate(0, 1, 0);
注意transfom和Transform之间大小写的区别,前者是变量(小写),后者是类或脚本名称(大写)。大小写不同使你能够从类和脚本名中区分变量。
应用我们所学,你可以使用GetComponent找到任何附加在同一游戏物体上的脚本和组件,请注意要使用下面的例子能够工作,你需要有一个名为OtherScript的脚本,其中包含一个DoSomething函数。OtherScript脚本必须与下面的脚本附加到相同的物体上。
function Update(){
otherScript = GetComponent(OtherScript); //这个在同一游戏物体桑找到名为OtherScript的脚本
otherScript.DoSomething(); //并调用它上加的DoSomething
Unity使用Vector3类同一表示全体3D向量,3D向量的不同组件可以通过想x,y和z成员变量访问。
var aPosition : Vector3;
aPosition.x = 1;
aPosition.y = 1;
aPosition.z = 1;
你也能够使用Vector3构造函数来同时初始化所有组件。
var aPosition = Vector3(1, 1, 1);
Vector3也定义了一些常用的变量值。
var direction = Vector3. // 与 Vector3(0, 1, 0);相同
单个向量上的操作可以使用下面的方式访问:
someVector.Normalize();
使用多个向量的操作可以使用Vector3类的数;
theDistance = Vector3.Distance(oneVector, otherVector);
(注意你必须在函数名之前写Vector3来告诉JavaScript在哪里找到这个函数,这适用于所有类函数)
你也可以使用普通数学操作来操纵向量。
combined = vector1 + vector2;
查看Vector3类文档获取完整操纵和可用属性的列表。
成员变量 & 全局变量
定义在任何函数之外的变量是一个成员变量。在Unity中这个变量可以通过检视面板来访问,任何保存在成员变量中的值也可以自动随工程保存。
var memberVariable = 0.0;
上面的变量将在检视面板中显示为名为&Member Variable&的数值属性。
如果你设置变量的类型为一个组件类型(例如Transform, Rigidbody, Collider,任何脚本名称,等等)然后你可以在检视面板中通过拖动一个游戏物体来设置它们。
var enemy : T
function Update()
if ( Vector3.Distance( enemy.position, transform.position ) & 10 );
print(&I sense the enemy is near!&);
你也可以创建私有成员变量。私有成员变量可以用来存储那些在该脚本之外不可见的状态。私有成员变量不会被保存到磁盘并且在检视面板中不能编辑。当它被设置为调试模式时,它们在检视面板中可见。这允许你就像一个实时更新的调试器一样使用私有变量。
private var lastCollider : C
function OnCollisionEnter( collisionInfo : Collision ) {
lastCollider = collisionInfo.
你也可以使用static关键字创建全局变量,这创造了一个全局变量,名为someGlobal
static var someGlobal = 5;// 你可以在脚本内部像普通变量一样访问它
print(someGlobal);// 'TheScriptName.js'中的一个静态变量
someGlobal = 1;
为了从另一个脚本访问它,你需要使用这个脚本的名称加上一个点和全局变量名。
print(TheScriptName.someGlobal);
TheScriptName.someGlobal = 10;
用C#编写脚本
除了语法,使用C#或者Boo编写脚本还有一些不同。最需要注意的是:
1.从MonoBehaviour继承
所有的行为脚本必须从MonoBehaviour继承(直接或间接)。在Javascript中这自动完成,但是必须在C#或Boo脚本中显示申明。如果你在Unity内部使用Asset -& Create -& C Sharp/Boo Script菜单创建脚本,创建模板已经包含了必需的定义。
public class NewBehaviourScript : MonoBehaviour {...} // C#
class NewBehaviourScript (MonoBehaviour): ... # Boo
2.使用Awake或Start函数来初始化
Javascript中放置在函数之外的代码,在C#或Boo中要放置在Awake或Start中。
Awake和Start的不同是Awake在场景被加载时候运行,而Start在第一次调用Update或FixedUpdate函数之前被调用,所有Awake函数在任何Start函数调用之前被调用。
3.类名必须与文件名相同
Javascript中,类名被隐式地设置为脚本的文件名(不包含文件扩展名)。在c#和Boo中必须手工做。
4.在C#中Coroutines有不同语法。
Coroutines必有一个IEnumerator返回类型,并且yield使用yield return… 而不是yield…
using System.C
using UnityE
public class NewBehaviourScript : MonoBehaviour {
// C# coroutine
IEnumerator SomeCoroutine ()
yield return 0;// 等一帧
yield return new WaitForSeconds (2);//等两秒
5.不要使用命名空间
目前Unity还不支持将代码放置在一个命名空间中,这个需要将会出在未来的版本中。
6.只有序列化的成员变量会显示在检视面板中
私有和保护成员变量只在专家模式中显示,属性不被序列化或显示在检视面板中。
7.避免使用构造函数
不要在构造函数中初始化任何变量,使用Awake或Start实现这个目的。即使是在编辑模式中Unity也自动调用构造函数,这通常发生在一个脚本被编译之后,因为需要调用构造函数来取向一个脚本的默认值。构造函数不仅会在无法预料的时刻被调用,它也会为预设或未激活的游戏物体调用。
单件模式使用构造函数可能会导致严重的后果,带来类似随机null引用异常。
因此如果你想实现,如,一个单件模式,不要使用构造函数,而是使用Awake。其实上,没有理由一定要在继续自MononBehaviour类的构造函数中写任何代码。
最重要的类
Javascript中可访问的全局函数或C#中的基类
移动/旋转物体
FPS或第二人称角色控制器
脚本编译在4个步骤中执行:
1.所有在&Standard Assets&, &Pro Standard Assets& 或 &Plugins&的脚本被首先编译。
在这些文件夹之内的脚本不能直接访问这些文件夹之外脚本。不能直接引用或它的 变量,但是可以使用GameObject.SentMessage与它们通信。
2.所有在&Standard Assets/Editor&, &Pro Standard Assets/Editor& 或 &Plugins/Editor&的脚本被首先编译。
如果你想使用UnityEditor命名空间你必须放置你的脚本在这些文件夹中,例如添加菜单项或自定义的向导,你都需要放置脚本到这些文件夹。这些脚本可以访问前一组中的脚本。
3.然后所有在&Editor&中的脚本被编译
如果你想使用UnityEditor命名空间你必须放置你的脚本在这些文件夹中。例如添加菜单单项或自定义的向导,你都需要放置脚本到这些文件夹。这些脚本可以访问所有前面组中的脚本,然而它们不能访问后面组中的脚本。这可能会是一个问题,当编写编辑器代码编辑那些在后面组中的脚本时。有两个解决方法:1、移动其他脚本到&Plugins&文件夹 2、利用JavaScript的动态类型,在javascript中你不需要知道类的类型。在使用GetComponent时你可以使用字符串而不是类型。你也可以使用SendMessage,它使用一个字符串。
4.所有其他的脚本被最后编译
所有那些没有在上面文件夹中的脚本被最后编译。所有在这里编译的脚本可以访问第一个组中的所有脚本(&Standard Assets&,&ProStandard Assets& or &Plugins&)。这允许你让不同的脚本语言互操作。例如,如果你想创建一个JavaScript。它使用一个C#脚本;放置C#脚本到&Standard Assets&文件夹并且JavaScript放置在&Standard Assets&文件夹之外。现在JavaScript可以直接引用c#脚本。放置在第一个组中的脚本,将需要较长的编译时间,因为当他们被编译后,第三组需要被重新编译。因此如果你想减少编译时间,移动那些不常改变的到第一组。经常改变的到第四组。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:154396次
积分:3079
积分:3079
排名:第9501名
原创:145篇
转载:39篇
评论:50条
(1)(1)(1)(1)(1)(3)(4)(43)(32)(24)(13)(10)(6)(7)(28)(12)(1)【教程】unity5时代来了~怎么把Unity 4.x的项目迁移到Unity 5呢?_unity吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:19,482贴子:
【教程】unity5时代来了~怎么把Unity 4.x的项目迁移到Unity 5呢?收藏
转发自:开发《RÉPUBLIQUE》的团队最近在干一件大事,把Unity 4.x的项目迁移到Unity 5,为您详尽解说他们迁移的全过程。视频先奉上~!视频来自:准备使用Unity5最重要的一步就是将工程从Unity4.x中移植过来。这对我20人的team来说是一个需要谨慎思考、规划的巨大挑战。各位的工程可能不如我们的大,但仍希望你们能从我们的经验中有所收获。首先从版本控制系统中复制出一份工程分支。这个分支作为工程的过渡版本—主工程坏掉几天不能用了,是因为team一直在修正移植到Unity5时的插件,或我们自己编写的代码引起的问题。(稍后说明)复制这个独立的分支使得美工和策划能够继续使用Unity 4.x的版本进行工作而不至于停止工作,直到项目在Unity 5能够正常运行。在几周之前,我们把一个减掉很多功能的版本移植到Unity 5。它被美术用来开发和测验Unity 5根据物理上色功能设计的烘托通道。去掉了一切第三方的插件——任何感觉可能会阻止移植的东西。当Unity 5的项目分支测验没问题后,就可以让所有team迁移到新分支上,并将旧分支备份。假如你们也正在Revision control(版本控制),推荐你们一定要复制一个工程分支(其实不管在任何时候都强烈推荐用Revision control)。无论怎样,保证你升级到Unity 5之前备份一下原本能run的工程。我们的UI设计师及源码操控专家, Charlie Helman,担任我们所有team的移植工作,他与我们共享了移植进程的笔记和截屏。这是从旧有的Unity 4.x工程拷贝的新分支。《Republique》的Unity工程相比于其它移动游戏来说是个头很大的,有45.7GB!将工程导入到一些机器上会花24小时之久。但用Cache Server 能够将这个时刻缩短到30分钟。翻开你的工程之前,保证在Unity 5的Preferences 中启用了Cache Server。也顺便设置比方说”外部代码和图像编辑器(Visual Studio 或 Photoshop)“。要设置这些,需要使用Unity 5来创建一个新的工程。新工程创建并打开的第一时间,就前往首选项Preferences(Mac: Unity & P Windows:Edit & Preferences)在Preferences 的Cache Server 选项卡中,保证“Use Cache Server”被勾选,并将IP设置为缓存服务器地址(这里简单地填了“Server”)。使用“Check Connection”来验证它是不是工作,然后就可以把这个工程关闭了。到此,我们已经准备好打开真正的工程了。几分钟后,看到了导入的进度条。每隔一会儿,就会看到这样的提示。因为Unity 5的API 很多改动。改动一个地方即是全部的“快捷”引用(譬如.rigidbody或.transform,在以前它内部其实是调用一个 .GetComponent&T&() 函数),如今都是显示地调用 GetComponent。所以myCharacter.rigidbody如今有必要改写成 myCharacter.GetComponent&Rigidbody&()。Unity 去掉了一切的“快捷”引用,而且主动帮你处理这个变换的事情。当点击“I Made a Backup. Go Ahead!”,Unity 就开始处理。Unity 5的自动化升级工具太棒了。最让人满意的是,它可以剖析你的全部代码库来作最合适的更新。提到这,那就来看看一些Unity 5脚本的改变,以及Camouflaj 怎么让它们正常运转的。Unity 5的脚本升级 在Unity 5中,会发现脚本中一些名字和API 发生了改变。通常是在旧的名字上加上Obsolete的属性,这样编译器会给出替代方案的建议。然而有时候不仅是名字发生了改变:你也许需要思考多个可代替计划。譬如,AnimatorStateInfo nameHash被更换成了shortHash和fullPathHash。shortHash是不以层名或状态机名为前缀的状态名,大多数情况下这就够了。假如不一样的状态用了一样名字,但是在不一样的状态机或层下面,那么你可以用fullPathHash。假如你想让你的脚本与老的Unity 版别保持向后兼容,你可以用Unity版本宏。我们更喜欢用这种方法来处理Unity 的各种版本,譬如Unity 5或更高的版别。这样在下次更新时,就可以不用复核这段代码了。下面是一段有多个Unity 版本代码共存的案例。#if (UNITY_3_0 || UNITY_3_1 || UNITY_3_2 || UNITY_3_3 || UNITY_3_4 || UNITY_3_5 || UNITY_3_6 || UNITY_3_7 || UNITY_3_8 || UNITY_3_9)
// Code specific to Unity 3 versions.
// 针对Unity3的代码 #elif (UNITY_4_0 || UNITY_4_1 || UNITY_4_2 || UNITY_4_3 || UNITY_4_4 || UNITY_4_5 || UNITY_4_6 || UNITY_4_7 || UNITY_4_8 || UNITY_4_9)
// Code specific to Unity 4 versions.
// 针对Unity4的代码 #else
// Code specific to other versions of Unity.
// 针对其它Unity版本的代码
// Here will we shall assume this is Unity 5 and later, and in doing so choose not to support Unity 2 or earlier.
// 这里我们假定是Unity 5 或更高版本的代码,这么选择是不再支持 Unity 2或更低的版本
// There may be a few defines for Unity 2 if you wish to support those versions.
// 如果你想要支持Unity 2的话,这里可以加上一些Unity 2的宏定义。 #endif 着色器更新 Unity5中,着色器编译器从Cg2.2切换成HLSL,你会发现需求愈加严厉了。在HLSL中,未彻底初始化的输出变量会致使一个编译过错。许多情况下我们都没有初始化色彩变量中的alpha值,或position变量中的w。要处理这个疑问,你就需要把变量初始化为0,可以用UNITY_INITIALIZE_OUTPUT宏。有时,仍会发现有彻底没有用过的数据从顶点函数传递到片元函数,即便已经从v2f构造中将它们去掉了。手工编辑而非脚本自动升级 代码中有少量几处要自己手动修正的之一即是经过组件名而不是类型来获取组件,Unity 不再使用该方法。在脚本自动更新器的过程中,Unity 将那些以名字来取组件的老代码:GetComponent(“MyMonoType”)更改为:UnityEngineInternal.APIUpdaterRuntimeServices.GetComponent(go, &Assets/PathToMyMonoType/Scripts/MyMonoType.cs (207,8)&, &MyMonoType&)你可能会看到有些这样的变换在控制台输出错,因为理论上这些修正编译不过。这种组件获取的错误一般来自于第三方的插件,由于是尽最大努力使《Republique》代码库尽可能地类型安全。但是,在的一些旧的AI 代码中,现在已将GOAP 体系设定为这样一种方法,即Actions 和Goals 能够以动态列表的方式来指定,而列表是经过名字来使用MonoBehaviors 的 。这使得我们能够灵敏地在运行时动态配置,但Unity 5取组件的新限制就让这种机制失效了。在这种特别情况下,就不再需要将基础的Action 和Goal 类派生自MonoBehavior ,而是仅仅是把它们变换为标准的类就能够处理这个问题。对其它那些要手工修正的取类型的地方,经过一个新的方法来处理这个问题,即是像下面这样经过姓名来获得类型。System.Type.GetType(&MyMonoType&)美术工具 终究让你看一下我们在根据物理上色方面的工作内容,我们将会在下一篇开发日志中具体叙述。为了预备将《Republique》现有的材质进行根据物理上色,就要重新考虑怎么制作材质对应的文理。在之前,大多数的材质只对应的少数的文理。在根据物理上色中,咱们的材质有必要对应许多的材质。为了快速处理现有的材质,我们的程序员写了一个材质变换东西。这个东西为变换节省了许多时刻:它把老的材质和对应的源材质存档,移动而且重命名已有的源材质(运用Unity 的AssetDatabase的方法来获得已有的到预制、模型的链接,以及链接本身)。然后它就连接到新的根据物理的文理映射,设定需要的一系列文理导入设置,而且最终生成打包后的map和表示纹理映射的资源。这使得美工组每天能够变换数百个材质,这极大的改进了他们的作业流程且减少了变换过程中出错几率。如果你正从Unity 4.x移植到Unity 5,且有许多的材质要变换时,强烈建议写一个这样的工具——会发现这使美工的材质变换四件缩短了30%以上。听起来像是不多,但如果你在一个像我们相同的快节奏的工作环境下,任何小改动都会带来很大的帮助。注意:大多数的工作是利用Unity 5的各种测试版本进行,旗舰版的经验可能会有所不同。
登录百度帐号推荐应用
为兴趣而生,贴吧更懂你。或Unity内部脚本初级知识 - 博客频道 - CSDN.NET
构建从理论到实现再到应用,多层次化结构化的强大知识体系!
分类:图形学 unity3d
这是一个关于Unity内部脚本如何工作的简单概览。
Unity内部的脚本,是通过附加自定义脚本对象到游戏物体组成的。在脚本对象内部不同志的函数被特定的事件调用。最常用的列在下面:
Update:这个函数在渲染一帧之前被调用,这里是大部分游戏行为代码被执行的地方,除了物理代码。
FixedUpdate:这个函数在每个物理时间步被调用一次,这是处理基于物理游戏的地方。
在任何函数之外的代码:
在任何函数之外的代码在物体被加载的时候运行,这个可以用来初始化脚本状态。
注意:文档的这个部份假设你是用Javascript,参考用C#编写获取如何使用C#和Boo编写脚本的信息。
你也能定义事件句柄,它们的名称都以On开始,(例如OnCollisionEnter),为了查看完整的预定义事件的列表,参考MonoBehaviour 文档。
大多数游戏物体的操作是通过游戏物体的Transform或Rigidbody来做的,在行为脚本内部它们可以分别通过transform和rigidbody访问,因此如果你想绕着Y轴每帧旋转5度,你可以如下写:
function Update(){
transform.Rotate(0,5,0);
如果你想向前移动一个物体,你应该如下写:
function Update(){
transform.Translate(0,0,2);
Time类包含了一个非常重要的类变量,称为deltaTime,这个变量包含从上一次调用Update或FixedUpdate(根据你是在Update函数还是在FixedUpdate函数中)到现在的时间量。
所以对于上面的例子,修改它使这个物体以一个恒定的速度旋转而不依赖于帧率:
function Update(){
transform.Rotate(0,5*Time.deltaTime,0);
移动物体:
function Update(){
transform. Translate (0, ,0,2*Time.deltaTime);
如果你加或是减一个每帧改变的值,你应该将它与Time.deltaTime相乘。当你乘以Time.deltaTime时,你实际的表达:我想以10米/秒移动这个物体不是10米/帧。这不仅仅是因为你的游戏将独立于帧而运行,同时也是因为运动的单位容易理解。( 米/秒)
另一个例子,如果你想随着时间增加光照的范围。下面的表达式,以2单位/秒改变半径。
function Update (){
light.range += 2.0 * Time.deltaT
当通过力处理刚体的时候,你通常不必用Time.deltaTime,因为引擎已经为你考虑到了这一点。
访问其他组件
组件被附加到游戏物体,附加Renderer到游戏物体使它在场景中渲染,附加一个Camera使它变为相机物体,所有的脚本都是组件,因为它们能被附加到游戏物体。
最常用的组件可以作为简单成员变量访问:
Component& && && && & 可如下访问
Transform& && && && & transform
Rigidbody& && && && & rigidbody
Renderer& && && && &&&renderer
Camera& && && && && & camera (only on camera objects)
Light& && && && && &&&light (only on light objects)
Animation& && && && & animation
Collider& && && && &&&collider
对于完整的预定义成员变量的列表。查看Component,Behaviour和MonnoBehaviour类文档。如果游戏物体没有你想取的相同类型的组件,上面的变量将被设置为null。
任何附加到一个游戏物体的组件或脚本都可以通过GetComponent访问。
transform.Translate(0,3,0);&&//等同于
GetComponent(Transform).Translate(0, 1, 0);
注意transfom和Transform之间大小写的区别,前者是变量(小写),后者是类或脚本名称(大写)。大小写不同使你能够从类和脚本名中区分变量。
应用我们所学,你可以使用GetComponent找到任何附加在同一游戏物体上的脚本和组件,请注意要使用下面的例子能够工作,你需要有一个名为OtherScript的脚本,其中包含一个DoSomething函数。OtherScript脚本必须与下面的脚本附加到相同的物体上。
function Update(){
otherScript = GetComponent(OtherScript); //这个在同一游戏物体桑找到名为OtherScript的脚本
otherScript.DoSomething(); //并调用它上加的DoSomething
Unity使用Vector3类同一表示全体3D向量,3D向量的不同组件可以通过想x,y和z成员变量访问。
var aPosition : Vector3;
aPosition.x = 1;
aPosition.y = 1;
aPosition.z = 1;
你也能够使用Vector3构造函数来同时初始化所有组件。
var aPosition = Vector3(1, 1, 1);
Vector3也定义了一些常用的变量值。
var direction = Vector3. // 与 Vector3(0, 1, 0);相同
单个向量上的操作可以使用下面的方式访问:
someVector.Normalize();
使用多个向量的操作可以使用Vector3类的数;
theDistance = Vector3.Distance(oneVector, otherVector);
(注意你必须在函数名之前写Vector3来告诉JavaScript在哪里找到这个函数,这适用于所有类函数)
你也可以使用普通数学操作来操纵向量。
combined = vector1 + vector2;
查看Vector3类文档获取完整操纵和可用属性的列表。
成员变量 & 全局变量
定义在任何函数之外的变量是一个成员变量。在Unity中这个变量可以通过检视面板来访问,任何保存在成员变量中的值也可以自动随工程保存。
var memberVariable = 0.0;
上面的变量将在检视面板中显示为名为&Member Variable&的数值属性。
如果你设置变量的类型为一个组件类型(例如Transform, Rigidbody, Collider,任何脚本名称,等等)然后你可以在检视面板中通过拖动一个游戏物体来设置它们。
var enemy : T
function Update()
if ( Vector3.Distance( enemy.position, transform.position ) & 10 );
print(&I sense the enemy is near!&);
你也可以创建私有成员变量。私有成员变量可以用来存储那些在该脚本之外不可见的状态。私有成员变量不会被保存到磁盘并且在检视面板中不能编辑。当它被设置为调试模式时,它们在检视面板中可见。这允许你就像一个实时更新的调试器一样使用私有变量。
private var lastCollider : C
function OnCollisionEnter( collisionInfo : Collision ) {
lastCollider = collisionInfo.
你也可以使用static关键字创建全局变量,这创造了一个全局变量,名为someGlobal
static var someGlobal = 5;// 你可以在脚本内部像普通变量一样访问它
print(someGlobal);// 'TheScriptName.js'中的一个静态变量
someGlobal = 1;
为了从另一个脚本访问它,你需要使用这个脚本的名称加上一个点和全局变量名。
print(TheScriptName.someGlobal);
TheScriptName.someGlobal = 10;
用C#编写脚本
除了语法,使用C#或者Boo编写脚本还有一些不同。最需要注意的是:
1.从MonoBehaviour继承
所有的行为脚本必须从MonoBehaviour继承(直接或间接)。在Javascript中这自动完成,但是必须在C#或Boo脚本中显示申明。如果你在Unity内部使用Asset -& Create -& C Sharp/Boo Script菜单创建脚本,创建模板已经包含了必需的定义。
public class NewBehaviourScript : MonoBehaviour {...} // C#
class NewBehaviourScript (MonoBehaviour): ... # Boo
2.使用Awake或Start函数来初始化
Javascript中放置在函数之外的代码,在C#或Boo中要放置在Awake或Start中。
Awake和Start的不同是Awake在场景被加载时候运行,而Start在第一次调用Update或FixedUpdate函数之前被调用,所有Awake函数在任何Start函数调用之前被调用。
3.类名必须与文件名相同
Javascript中,类名被隐式地设置为脚本的文件名(不包含文件扩展名)。在c#和Boo中必须手工做。
4.在C#中Coroutines有不同语法。
Coroutines必有一个IEnumerator返回类型,并且yield使用yield return… 而不是yield…
using System.C
using UnityE
public class NewBehaviourScript : MonoBehaviour {
// C# coroutine
IEnumerator SomeCoroutine ()
yield return 0;// 等一帧
yield return new WaitForSeconds (2);//等两秒
5.不要使用命名空间
目前Unity还不支持将代码放置在一个命名空间中,这个需要将会出在未来的版本中。
6.只有序列化的成员变量会显示在检视面板中
私有和保护成员变量只在专家模式中显示,属性不被序列化或显示在检视面板中。
7.避免使用构造函数
不要在构造函数中初始化任何变量,使用Awake或Start实现这个目的。即使是在编辑模式中Unity也自动调用构造函数,这通常发生在一个脚本被编译之后,因为需要调用构造函数来取向一个脚本的默认值。构造函数不仅会在无法预料的时刻被调用,它也会为预设或未激活的游戏物体调用。
单件模式使用构造函数可能会导致严重的后果,带来类似随机null引用异常。
因此如果你想实现,如,一个单件模式,不要使用构造函数,而是使用Awake。其实上,没有理由一定要在继续自MononBehaviour类的构造函数中写任何代码。
最重要的类
Javascript中可访问的全局函数或C#中的基类
移动/旋转物体
FPS或第二人称角色控制器
脚本编译在4个步骤中执行:
1.所有在&Standard Assets&, &Pro Standard Assets& 或 &Plugins&的脚本被首先编译。
在这些文件夹之内的脚本不能直接访问这些文件夹之外脚本。不能直接引用或它的 变量,但是可以使用GameObject.SentMessage与它们通信。
2.所有在&Standard Assets/Editor&, &Pro Standard Assets/Editor& 或 &Plugins/Editor&的脚本被首先编译。
如果你想使用UnityEditor命名空间你必须放置你的脚本在这些文件夹中,例如添加菜单项或自定义的向导,你都需要放置脚本到这些文件夹。这些脚本可以访问前一组中的脚本。
3.然后所有在&Editor&中的脚本被编译。
如果你想使用UnityEditor命名空间你必须放置你的脚本在这些文件夹中。例如添加菜单单项或自定义的向导,你都需要放置脚本到这些文件夹。这些脚本可以访问所有前面组中的脚本,然而它们不能访问后面组中的脚本。这可能会是一个问题,当编写编辑器代码编辑那些在后面组中的脚本时。有两个解决方法:1、移动其他脚本到&Plugins&文件夹 2、利用JavaScript的动态类型,在javascript中你不需要知道类的类型。在使用GetComponent时你可以使用字符串而不是类型。你也可以使用SendMessage,它使用一个字符串。
4.所有其他的脚本被最后编译
所有那些没有在上面文件夹中的脚本被最后编译。所有在这里编译的脚本可以访问第一个组中的所有脚本(&Standard Assets&,&ProStandard Assets& or &Plugins&)。这允许你让不同的脚本语言互操作。例如,如果你想创建一个JavaScript。它使用一个C#脚本;放置C#脚本到&Standard Assets&文件夹并且JavaScript放置在&Standard Assets&文件夹之外。现在JavaScript可以直接引用c#脚本。放置在第一个组中的脚本,将需要较长的编译时间,因为当他们被编译后,第三组需要被重新编译。因此如果你想减少编译时间,移动那些不常改变的到第一组。经常改变的到第四组。
排名:第7294名
(20)(3)(60)(87)(15)(16)(11)(8)(9)(2)(7)(3)(1)(2)(0)

我要回帖

更多关于 unity editorwindow 的文章

 

随机推荐