unity 中UnityScriptunity3d文件怎么打开 出现错误

JS or C#?不存在的脚本之争(UnityScript 不是 Javascript)
转自:http://www.infoq.com/cn/articles/js-or-csharp-non-existent-scripts-debate?utm_campaign=infoq_content&utm_source=infoq&utm_medium=feed&utm_term=global
周五的下午,偶然间晃了一眼游戏蛮牛Unity3D的QQ群,又看到了一个Unity3D开发中老生长谈的问题,“我的开发语言究竟是选择JavaScript呢?还是C#呢?”。对这个问题,小匹夫也觉得的确该认真地梳理一下了。那么为何说JavaScript和C#的争论根本就不存在呢?首先,我们要知道Unity3D中的JS脚本究竟是什么?最准确的学名,我想应该叫做 (因为Unity-Technologies在Github上托管的代码就叫这个名字)。那为何UnityScript不是JavaScript呢?我们就继续分析一下UnityScript
vs JavaScript好了。既然UnityScript不是JavaScript,但Unity3D的确有好几种脚本语言啊(C#,UnityScript,,Boo),那和C#相比,我们应该如何抉择呢?所以本文最后会分析一下C# vs UnityScript。
最熟悉的陌生人--UnityScript
小匹夫的上一篇文章“中介绍了一下Unity3D跨平台的基础。那就是借助了CIL,首先将源代码(例如C#)编译成CIL(其实是CIL
assembly),之后再通过JIT或者FULL-AOT将CIL编译成目标平台的原生代码,进而实现一套代码,多个平台使用的跨平台功能。所以可以想见,作为Unity3D中的“JS”(后文使用UnityScript)同样也会先被编译成CIL代码,之后再编译成对应平台的原生代码。换言之,Unity3D实现了一套在.NET平台上和C#处于“相同层面”的语言UnityScript。开发一套自己的语言,这听上去简直太疯狂了是吗?其实一点也不。刚才说了,源代码都要先编译成CIL,所以只要能有一套编译器,能够把UnityScript的语法分析识别并编译成CIL,那问题不就解决了吗?当然,如果有现成的,能符合以下三条的语言作为参考,那UnityScirpt的开发者应该是感激不尽了吧。哪三点呢?
是.Net层面的语言。
像脚本语言
有编译器能把它编译成CIL
没错,聪明的你一定想到了,那位一直隐藏的很深的幕后人物,Unity3D脚本三巨头之一的Boo了吧。都说Boo是Unity3D得脚本语言之一,可是为什么就没见有什么人用过呢?原因之一可能是,Unity3D最初引入Boo,纯粹是为了UnityScript服务的。Boo作为一个.NET平台的第三方语言,写起来也很像脚本语言,并且有对应的编译器能够实现从Boo到CIL的过程。Boo写起来是像下面这个样子。(更多关于Boo的内容请参见。)
import System
import System.Net
import System.Threading
url, local = argv
client = WebClient()
call = client.DownloadFile.BeginInvoke(url, local)
while not call.IsCompleted:
Console.Write(".")
Thread.Sleep(50ms)
Console.WriteLine()
简而言之,UnityScript是脱胎于Boo的。虽然看上去UnityScirpt和Boo长的不像,但要明白语法不是问题,语义才是。只要能把UnityScript的语法解析成Boo的编译器能认识的,那么UnityScript的编译器的大部分工作就可以交给Boo的编译器来实现了。所以,基于现成的Boo语言,开发UnityScript编译器的工作就只剩下语法解析而已了,事实上他们也的确是这样做的。
而当我们浏览UnityScript在Github的托管页面,发现竟然是Boo的开发者在维护,而UnityScript的编译处理逻辑所在的文件是一个Boo文件--UnityScriptCompiler.boo。
相关厂商内容
相关赞助商
QCon北京2016大会,4月21-23日,北京·国际会议中心,邀您参与!
虽然不懂boo语言,但是还是可以看到会引入Boo的编译器:
import Boo.Lang.Compiler
也会有针对UnityScript的语法进行解析以供Boo的编译器识别的过程:
pipeline.Insert(0,
UnityScript.Steps.PreProcess())
pipeline.Replace(Boo.Lang.Compiler.Steps.Parsing,
UnityScript.Steps.Parse())
pipeline.Replace(Boo.Lang.Compiler.Steps.IntroduceGlobalNamespaces,
UnityScript.Steps.IntroduceUnityGlobalNamespaces())
pipeline.InsertAfter(Boo.Lang.Compiler.Steps.PreErrorChecking,
UnityScript.Steps.ApplySemantics())
pipeline.InsertAfter(UnityScript.Steps.ApplySemantics,
UnityScript.Steps.ApplyDefaultVisibility())
pipeline.InsertBefore(Boo.Lang.Compiler.Steps.ExpandDuckTypedExpressions,
UnityScript.Steps.ProcessAssignmentToDuckMembers())
pipeline.Replace(Boo.Lang.Compiler.Steps.ProcessMethodBodiesWithDuckTyping,
UnityScript.Steps.ProcessUnityScriptMethods())
好吧,我才不会告诉你在同一个Github页面有关于UnityScript的介绍:
A JavaScript implementation based on the Boo programming language.
那么UnityScript的编译器到底放在哪里呢?(从UnityScript到CIL)请看下图。
Mac版的路径:/Applications/Unity/Unity.app/Contents/Frameworks/Mono/lib/mono/unity/us.exe
Win版的路径:U3D路径/Editor/Data/Mono/lib/mono/unity/us.exe
说了这么多,还是需要为这篇文章的主角UnityScript正个名:UnityScript是静态语言且需要编译,脱胎于Boo语言,和JavaScript除了后缀之外没有关系。所以与其纠结“U3D的JavaScript到底和JavaScript有多形似”,倒不如考虑下UnityScript和Boo有多神似。
UnityScript vs JavaScript
很多提出本文前言中提到的那个老生常谈问题的朋友,往往认为UnityScript和我们平时所说的JavaScript是一样的,即使有人意识到有所区别,但是认为本质上也还是和JavaScript属于同一范畴。期初小匹夫也是这样认为的,因为曾经使用过cocos2d-js开发游戏的缘故,所以当听说Unity3D竟然支持JS脚本,那叫一个开心啊。可是最初的开心往往也暗示着最后的失望。
因为最后小匹夫意识到了UnityScript和JavaScript是两种差别很大的语言。
其实所谓的JavaScript是一个很泛泛的名字,可以用来指任何实现了ECMAScript标准的语言(求JS大神轻喷……),而UnityScript主观上根本就没有试图去实现甚至是接近该标准。所以很多JavaScript的库如果只是单纯地复制粘贴,在Unity3D中并不会运行的特别“顺利”(之所以加引号是因为很多都运行不起来吧)。
那么两者究竟有多大的差别呢?最主要和本质的区别前文已经说过了,它俩除了长相差不多,压根就没什么联系。但是还是需要有个更直观的认识。那么下面就简单总结一下JavaScript和UnityScrip的差别吧。
JavaScript没有类的概念
JavaScript没有类的概念。因为它是一种基于原型的语言,继承发生在对象和对象之间(更灵活,换言之,更动态),而非类和类之间。
举个例子:
function Person() {
this.name = ["chenjiadong"];
var c = new Person();
console.log(typeof c.introduce);
Person.prototype.introduce = function() {
console.log("I am
"+this.name+".");
console.log(typeof c.introduce);
c.introduce();
如你所见,在小匹夫有限的JS知识中,同样存在着对象和原型的概念。通过关键字new,我们可以用方法Person创建出一个对象c,此时的小c还是很单纯的,不会introduce自己。但是如果Person经过进化,学会了介绍自己introduce,那么之前创建的小c也同样学会了介绍自己introduce。
但是在UnityScript中可不能这样,因为它有类的概念。你一旦定义了一个类,那么在程序运行时这个类也就不能改动了。
文件名的讲究
不知道各位朋友有没有发现,新建的UnityScript文件中好像并没有声明类。相反,看上去很像一般的JavaScript的写法。比如这样Test.js:
#pragma strict
function Start () {
function Update () {
其实原因就在于文件名。U3D中大多数.js文件都代表一个类,所以自然而然地,文件的名字就被用来称呼这个类了。(说大多数文件都是这样的含义就是,你也可以在一个文件中定义多个类,比如不继承自MonoBehav的类。)
所以上面的代码就等效于这样的C#代码:
using UnityE
public class Test : MonoBehaviour {
void Start () {
// Update is called once per frame
void Update () {
反观JavaScript,则仅仅是执行文件中的代码,而与文件名无关。
除了这两条比较“宏观”的差别之外,语法上是否还有什么不同呢?当然有啊,请继续往下看。
在JavaScript中,经常可以这么干:
var x = 1, y = 2;
但在UnityScript中这样写,U3D通常会这么说:
语法差异之分号的必要性
以前记得在微博上看到过一个大学教授吐槽过一个JavaScript的“bug”,如下图所示。
所以,让大V掉坑里的,JavaScript的特性之一,就是程序在执行时会默认在行尾加“;”,换句话说,作为人类或者猿类的我们可以不在行尾写分号。
而UnityScript为了避免这种很可能造成bug的写法,对分号做出了要求。接下来不用我多说了吧。
反正你不写分号,U3D大概会这么说:
语法差异之“赋值表达式”能否作为表达式赋值?
实话实说,小匹夫也不知道怎么想出这么一个绕口的小标题。但是小匹夫记得在JavaScript中可以这么写:
var x = 3; // x is 3
var y = (x=x+2); // x is 5, y is 5
所以这里,x=x+2这个赋值表达式作为一个表达式给y赋值。
但是在UnityScript中是不支持这种写法的。这次U3D会和你叽歪很多话。
语法差异之var和类型那点事
聊JavaScript终究绕不过去的一个话题,那就是声明变量时的var。假设声明变量时,不带var,则该变量会默认成为全局变量。但是声明变量不带var,在UnityScript中可行不通。
好吧,那妥协之,在UnityScript中我带var还不行嘛?那是不是就可以像JavaScript一样,在类型上无拘无束任我飞了?
比如下面的代码,我在JavaScript上和UnityScript上都运行得很完美啊。
//UnityScript 和 JavaScript都能运行
x = new Array();
这样看起来,貌似UnityScript是动态语言啊!简直是视类型如无物啊。好多朋友到这里就迷糊了,接着就产生了那样的错觉。
其实作为静态语言,在编译器进行编译时,变量到底是什么类型它必须非常清楚,所以在UnityScript中,上面代码里的x到底是什么类型可是确定好的。 觉得奇怪是吗?那我们把等效的代码写一下各位就明白了。
//在UnityScript中等效于下面
x = new Array();
对,原来x是Object类型。所有的类型都派生自它,换言之,所有的类型都能转化成它。所以3能转化为Object,Array也能转化成Object。这也就是UnityScript看起来是动态类型的原因。(频繁装箱,肯定会影响效率。)
所以如果调用一个Object没有的方法,可能会有这样的提示:
当然,关于var的话题还有很多,比如C#也有,但是和这里并非完全相同。同样,JavaScript和UnityScript可以聊的话题也还有很多,但是受限于篇幅,这里点到即止。
C# vs UnityScript
终于来到咱们经常争论的火药桶话题了,到底C#和Unity3D里的JS谁好呢?
最常见的问题无非是:用JS写的u3d游戏和用C#写的u3d游戏,到底谁的运行效率高啊?
最常见的回答为非是:肯定是C#啊,因为JS是动态的。肯定不如编译的语言好。
第二常见的问题无非是:用JS开发和用C#开发,哪个更快更适合我啊?
第二常见的回答无非是:JS适合个人开发,敏捷快速。 C#适合公司开发,规范严谨。
咱们还是用和刚才讨论与JavaScript的区别时一样的思路来整理C#和UnityScript的不同,也就是按照先本质,再表现的顺序。同时兼顾回答一下上面的两个问题。
本质求同存异
开篇就说了,UnityScript是和C#同一个层面的语言,也需要经历从源代码到CIL中间语言过渡,最终到编译成原生语言的过程。所以本质上,最终运行的都是从CIL编译而来的原生机器语言。但的确会有C#比较快的现象,那么问题出在哪呢?
一个可能但不是唯一的答案就是UnityScript和C#生成CIL中间语言不同。
这一点想想也很简单,就像上文提到的var的问题,如果使用Object来处理var的问题,则不可避免频繁地装箱拆箱操作,这对效率的影响是很大的。
所以的确,C#的速度更快,但原因是UnityScript会涉及频繁的装箱拆箱操作,进而生成的CIL代码与C#有差异,而并非UnityScript是动态语言且没有经过编译。
现实很单纯
开发到底是使用C#还是UnityScript呢?如果不考虑运行的效率,仅仅考虑开发时候的感受,小匹夫就谈谈自己的看法好啦——那就是珍惜时间,远离UnityScript。
首先有以下几个事实我们要清楚。
UnityScript是脱胎于.NET平台的第三方语言Boo的。所谓的第三方语言和C#的区别,就跟自己到底是不是亲生的,爹到底是不是隔壁老王是一样的。差距可能是全方位,立体式的。社区支持,代码维护,甚至是编译出来的CIL代码质量都可能有很大的差距。选择UnityScript之前,问问自己之前听说过Boo吗?别忘了UnityScript和Boo的渊源。
UnityScript和JavaScript除了长得像之外,根本就没有什么关系。你在JavaScript里如鱼得水,在UnityScript中如果不小心就可能埋下隐患,而一些隐患可能藏得很深。而且UnityScript也是静态语言,也需要编译,所以看不出来选择它作为开发语言为什么会有人觉得快。
插件的支持。貌似大多数都是C#写的吧。
好吧,如果上面的3点都不能说动你,那就看看官方的态度好了。
U3D官方团队基于数据分析做出的一个语言被使用的百分比图。
由于Boo语言的使用量基本可以忽略,所以从Unity5.0版本开始就会停止对Boo的文档支持。同时消失的还有从菜单创建Boo脚本的选项“Create Boo Script”。从U3D团队对Boo的态度,也可以窥见和Boo联系密切的UnityScript未来的走势。
同时U3D团队也会把支持的重心转移到C#,也就是说文档和示例以及社区支持的重心都在C#,C#的文档会是最完善的,C#的代码实例会是最详细的,社区内用C#讨论的人数会是最多的。
所以到底如何选择,各位朋友也都应该有了自己的认识了吧。
没有更多推荐了,
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!unity3d安卓文件怎么写入_百度知道
unity3d安卓文件怎么写入
我有更好的答案
  1.认识Unity3D
Unity3D是一个让开发者能够在多平台制作同一款游戏的游戏开发工具,有专业的图像处理和游戏引擎,能做出各式各样的游戏。
羽化以前认为Android游戏开发只能在Eclipse里面死活敲代码,也许是自己阅历不够,不知道游戏引擎能给游戏开发带来如此大的便利,无论是3D游戏还是2D游戏都可以用Unity3D开发而且转成IPHONE游戏也很简单,因为Unity3D很多移动开发功能IPHONE与Android是共用的,其中最主要的控制器就是一样的,这样我们就基本上告别Eclipse了。。。
由于Unity3D里面的脚本是用C#或者Java Script写的,学习过这两个语言最好,不会也没关系,还可以学嘛(和羽化一样),其实C#和JS与Java类似,看起来不会那么陌生,要注意的是JS中无论什么变量声明都是”var”表示,这点对于声明经常出错的羽化来说很好-0-
2. Unity3D环境搭建与Android软件生成方法
这里给大家介绍两个网站,在里面可以下载到最新的UnitySetup-3.3.0包括破解补丁U3v3.3.0f4_Win和脚本编辑器UnityScriptEditor2.55,还有很多学习资料,包括羽化正在学的Unity视频教程(全英文啊=。=),还有全中文帮助文档,虽然现在资料很少,但可以看出Unity3D越来越给力中。。。
安装过程就不详细写了,很简单的。这里要注意的是,安装的系统用户名不要是中文的,要不打开Unity3D以后Scene里面看不到东西,这是羽化的切生体验- -。
1)第一次打开Unity3D后会出现创建Project的界面,这就和Eclipse创建项目一样的道理,这时候可以添加一些插件包,这步操作羽化留在了软件打开后。
2)新建以后就出现了开发界面,这里简单介绍下:
Scene 开发视图:里面可以拖拽物体位置、改变大小、旋转角度等,是开发中最常的地方。
Game
游戏视图:点上面的运行以后游戏就会在Game视图里面运行,没点的时候可以看到摄像机当前的图像。
Hierarchy 层试图:放置游戏物件,在游戏运行时可以观察游戏物件变化
Project 工程视图:里面可以新建文件夹管理脚本,渲染,图片等。
Inspector 检查视图:显示物件属性等
最下面一条,一般情况下不会显示东西,如果出错或者打印语句都是显示在下面:
先不管那么多,生成个Android软件再说。
3)在Project里面右击 ——〉 Import Package ——〉 Standard Assets(Mobile)这是移动开发的包,全部Import导入吧。再在Project里面选中导入的Standard Assets(Mobile)———〉Control Setups——〉CameraRelativeSetup,这会提示保存Scene,我们就保存一个,可以看到Project里面多了一个我们保存的Scene,游戏运行就是从Scene开始,这时应该可以看到这个包的显示了。一眼就看出这是一个演示控制器的包,这个时候我们就不管这个工作原理,先放在Android手机里面看看效果。
4)点击左上角的File菜单——〉Build Settings——〉选中Android——〉右边Development Build勾打上——〉点击下面Player Settings,这时在Insperctor视图里面可以看到一些基本设定,第一个Resolution and Presentation是游戏视图设定,横屏还是竖屏随你可以默认它,点击Other Settings,这里主要设置Identification这个属性,里面第一个相当于项目包,这个一定不能默认,自己随便写个名字比如羽化就是com.LB.first其他设定大家可以自己研究,对于生成这个软件,这步必须改。
5)然后回到窗口点击Build,这里第一次点会跳出一个选中Android SDK的路径,大家都懂的,自己放哪的选哪,确定后,输入一个apk的名字,就叫作LB,如果发生什么错误,可以看看下面的提示。
6)软件已经生成好了后就可以丢到手机里面安装试试了,你可以直接丢在SD卡里面安装,这里羽化给大家介绍个简单的方法,对于模拟器还是真机都适用,首先设置环境变量,在Path里面添加如羽化自己目录的D:android-sdk-windowsplatform-tools,这样就可以在命令控制台里面打命令了,比如羽化安装的命令是cd C:UsersLiBeiDocumentsLB先到apk目录下,再输入adb install LB.apk这里要注意若你原来安装过相同名字软件,先卸载了再装。
7)实际运行效果左摇杆是控制位移,右摇杆是控制方向:
步骤看起很多,其实很简单。
3.Unity3D基本使用方法
这里羽化推荐大家看看视频,看视频学起来得很快,羽化就讲讲自己照视频做的例子,解压后可以通过Open Project选项打开这个例子,选中Scene里面的Scene1打开,运行是在电脑上。
1)场景创建
全是Cube搭建的,看一眼就知道了,Cube可以在上方Gameobject——〉create other里面创建,也点击Hierarchy层视图下面的Create创建,位置调整可以在Scene里面通过左上角的物件选项慢慢调整,第一个是观察,第二个是调整位置,第三个是调整角度,第四个调整大小。
2)主视角
这里主视角是用Standard Assets(这要自己导入)——〉Character Controllers——〉First Person Controller 可以看到这里能直接用的物件其实都是Prefab预设。这里可以看天空,其实是运用了Skybox组件,选中Main Camera可以在菜单中Component——〉Rendering——〉Skybox。
3)光
若无光运行的时候漆黑一片,这里放了个Point Light点光,数值可自行调整,添加和Cube一样。
4)脚本
脚本放在Scripts文件夹下,里面Door是控制门开关,Shoot是鼠标点击事件,Respawn是坠落返原地。注意这里脚本写好以后要拖到对应物体上才能运行。
5)动画
开门其实是个动画,创建在Component——〉Miscellaneous ——〉Animation
6)火焰
火焰是粒子产生的,粒子创建和Cube类似,Particle System里面的数值要做相应调整就会有火焰效果了。
再介绍几个Component里面重要的组件
1)Rigidbody 刚体
刚体顾名思义,有重量,带碰撞都是刚体的属性,若你为一个物件添加这个组件,证明你需要前面这几个属性。
2)Character 人物
其实里面放的都是控制视角或者是主角操作的脚本。
3)Trail Renderer 路径渲染器
很有用的组件,可以看到自己走过的路径,论坛上有个切水果刀光的例子就是用到它。
为您推荐:
其他类似问题
您可能关注的内容
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。[Unity3D]C#与JS脚本间调用出错
[问题点数:25分,结帖人yxlovemoney]
本版专家分:0
结帖率 96.59%
CSDN今日推荐
本版专家分:0
本版专家分:0
结帖率 96.59%
本版专家分:0
本版专家分:0
结帖率 96.59%
本版专家分:0
本版专家分:0
结帖率 96.59%
本版专家分:0
本版专家分:0
结帖率 96.59%
本版专家分:0
结帖率 96.59%
本版专家分:0
本版专家分:0
结帖率 96.59%
本版专家分:0
本版专家分:40
结帖率 71.43%
本版专家分:0
匿名用户不能发表回复!|
CSDN今日推荐只要功夫深,铁杆磨成针
Unity3D中的JavaScript语言基础
Unity中的JS,也称UnityScript,和基于浏览器的JS有比较大的区别,因为UnityScript是基于Mono的.net 的IL语言规范,CLR运行环境(Mono虚拟机)上设计的语言。
0.基本概念:
Unity3d中的脚本可以与游戏对象链接,变量数值的修改以及实时预览脚本修改后的游戏效果,节省了很多脚本调整和调试的时间,提高了开发效率。
简单的项目和Unity中的大量例子和脚本资源包都是用JS。商业项目基本都用C#,因为C#和C/C++交互方便,丰富的数据结构和面向对象的架构利于大型程序的编写,很多强大的第三方插件是用C#开发的,方便工作流程。
编译过程:
UnityScript运行环境使用Mono
的.NET Framework。实际上,UnityScript是用Boo实现的,Boo是运行在Mono虚拟机上的一种语言,并且编译成本机代码。JavasScript很多典型的运行环境如String和Math库由Mono提供。你也就知道了为什么UnityScript中方法名要大写了,因为要与Mono中相同。
Unity中的脚本和传统的解释型(JIT解释)语言不同,都是需要经过编译的,因此速度都一样快。
这三种语言的代码最后都会被编译执行,而且脚本可以互相访问。
库的调用:
Unity的脚本基于Mono的.net平台上运行,脚本都可以使用.net库,为xml,数据库,正则表达式提供了良好的解决方案。
Unity中js想调用mono的.net库,直接import即可。
import System.IO;
否则,你带指定完整的命名空间来调用函数,如System.IO.File.Open(),而不是File.Open()。
1.基本类型和语句:
1)数据类型:
数值类型:char,byte,short, ushort, int, uint, long, float, decimal.
布尔值:boolean
字符串:String,[index]符号
字符串[0]是字符串取下标为0的字符。
var s: String = "Whatever_it_may_be";
s =s.Replace("_"[0], " "[0]); // replace all the underscoreswith spaces
2)变量声明:
变量必须先声明[必须](编译缘故,且声明类型有利于减少太多常量,避免内存泄露发生),可以定义类型[可选]:
var playerName:S
函数的参数也要声明类型:
function Test( playerName:String, baseInfo:Object )
如果声明时候定义或赋值了类型,那么不能再改变类型,除非声明时候不定义类型。
var a= "test";
a =5;// 报错
a ="test";
a =5;//正确
变量前面可以加public,protected, private来修饰;不写默认是public的,public的变量可以在Inspector视图中查看和编辑。
内建自定义数组(快功能简单):
var values : int[] = {1,2,3};
转换到Array数组(需要对数组处理),var arr = new Array(values);
Array对象数组(慢动态增长排序合并功能):
var arr = new Array(); arr.Push("good");
转换到内建数组(需要比较高的性能时候),var bArray : int[] = arr.ToBuiltin(int);
4)链表和泛型:
UnityScript可以使用泛型,所以当用到动态大小的数组时,最好用List来替代Array。基本上就没有什么理由要用到Array了,List更快并且功能更多。如果你需要混合类型的数组,你可以用Object List。UnityScript中泛型的语法与C#中接近,除了要加一个额外的“.”符号在“&&”之前。如C#中的"varmyList = new List&int&();"在UnityScript中对应的写法为:"var
myList = new List.&int&();"。
5)运算符和表达式:
每行必须写分号; 比C多了for in 用于遍历对象元素,for(var i:int = 0; i & 10; i++)。
switch可以使用String变量。
声明规则:
function函数名(参数1:参数类型, 参数2:参数类型...):返回值类型
unityScript中的函数可以视为Function类型对象,可以像变量一样进行赋值比较等操作。
不能写匿名函数。
Math需要用Mathf。
3.类(DOM js中没有类):
在Unity里,一个js文件就是一个类,unity引擎会为js文件自动生成一个类。
对于UnityScript脚本,Unity编译该文件时会自动的为脚本添加一个与脚本文件名相同的类,并自动地继承于MonoBehaviour。但对于C#或Boo,则需要在脚本中显式的写出类名和继承关系。要创建不继承自MonoBehaviour的类,用C#语言,或者从外部添加js脚本资源(就可以自己直接new对象出来了)。
//SayHello.js
#pragma strict // 严格类型检测,尽早生成错误,禁用动态类型,强制用静态类型(强类型)
function sayHello()
等价于C#中:
#pragma strict
public class SayHello extends MonoBehaviour
function sayHello()
但是,你可以在同一个文件中声明多个类,尤其是当你需要使用一些辅助工具类时非常有用,一般这种辅助类没有继承自MonoBehaviour。
class ButtonState {
var currentState :
var offset : Vector2;
如果你在一个文件中声明了MonoBehaviour的子类,但类名与文件名不匹配的话,即使是大小写不一致,你也会碰到麻烦。
一定要理解,当你在js文件中编写行为脚本是,你实际上在编写一个类:
a) 类及其对象:文件名就是类名,如果文件名是foo.js,你就可以在其他地方以var x = new foo()的格式进行调用;
b)类的方法和预定义方法:有一些特定的方法是实现系统预先定义的一些事件处理器,如Start、FixedUpdate等。任何事件中,声明的一个函数就是这个文件所代表的类的一个方法。
c) 类的属性:文件中在函数定义之外编写的代码都在该类的范围之内执行,声明的变量也是该类的成员变量。类中的静态函数、变量本质上是类的方法与属性。
/*whenyou drag the behavior onto a gameobject, these values will be visible andeditable
public name : S
/*otherscripts which have a reference to this object (e.g. if they're attached to thesame object) can see public functions
publicage :
/*privatemembers are NOT visible to other scripts, even if they have a reference to thisobject
private favoriteColor : C
/*youcan assign a value to bestFriend by dragging a gameObject with an attached copyof the foo behavior to this property. This will give you access to bestFriend'spublic methods and members
public bestFriend :
/*this function will be called every frame by Unity, so it's actually an eventhandler
function Update(){
/*transform is a property inherited from thegameObject the behavior is attached to*/
function Bar(){
// this is just a function, if you don't callit yourself, it will never do anything
Unity里需要extends关键字:
class MyHello extends Hello
DOM js中用prototype里的bind()方法。
Unityjs里面还提供了虚拟函数。
类的继承也是不同的。在JavaScript和C#中,方法是隐型并且不可重载,除非方法声明中添加虚拟关键字。不同的是C#只重载那些包含重载关键字override的方法。而JavaScript不需要关键词,只要重载类方法就可以覆盖,其它的都可继承得到。
var foo = "hello, world";
function doEet () {
// does nothing, intended to be overridden
将会生成:
import UnityE
classFoo extends MonoBehaviour {
public var foo = "hello, world";
public function doEet () {
// does nothing, intended to be overridden
子类写法:
//PrintingFoo.js
class PrintingFoo extends Foo {
function doEet() {
print( foo );
创建虚函数:
virtual function DoSomething ()
Debug.Log("from baseclass");
//SubFoo.js
class SubFoo extends Foo
virtual function DoSomething()
Debug.Log("from subclass");
//Elsewhere
varfoo : Foo = new SubFoo();
foo.DoSomething();//printsfrom sub class
如果你要调用父类的方法,用关键字super。示例如下:
class SubFoo extends Foo
virtual function DoSomething()
super.DoSomething();// 不是虚函数,应该不需要super修饰就可以直接调用。
Debug.Log("from sub class");
//Elsewhere
varfoo : Foo = new SubFoo();
foo.DoSomething();//prints"from base class" and "from sub class"
类间通信:Use-a方式(关联关系)比继承耦合度底得多,易于修改维护
/*Foo.js */
varbar : B
function Start(){
bar = gameObject.GetComponent(Bar);
function doEet(){
// do my own thing
if( bar ){
bar.doEet();
/*Bar.js */
function doEet(){
// do something special
Unity中不一定可以用new
创建对象(普通类可以,特殊类不行,各种脚本都一样)。特殊类:用编辑器工程视图右键或者组件Create js 或者C#的类都是继承自MonoBehaviour类,对这种类型的类不能new出来一个对象,原因是Unity会为这种类自动创建对象,并调用被重载的方法。
使得用Unity非常有趣的一件事是,它的类采用了非常自由的mixin策略。通常你可以非常快速简单的查到你所需要的类。最通用的一个例子是Transform类,对于你正在处理的一个对象,所有被附加到该对象的相关联的类,都可以简单快速的获取它的属性和方法。
比如,典型的动作就是你会访问名叫"transform"的变量,它代表与该对象关联的Transform类的实例。如果你需要相关的位置坐标,就访问transform.position(一个 Vector3对象);如果你需要它的GameObject,就访问transform.gameObject;如果你需要它的渲染器,就访问transform.renderer。等等。一般如果你一个对象的主要属性,你就可以快速获取该对象所有其他的属性。
6.js和C#单向通信,不能双向通信,因为编译问题
js访问C#脚本组件:
//createa variable to access the C# script
private var csScript : CSharp1;
function Awake()
//Get the CSharp Script
csScript =this.GetComponent("CSharp1");//Don't forget to place the 'CSharp1'file inside the 'Standard Assets' folder
//rendertext and other GUI elements to the screen
function OnGUI()
//render the CSharp1 'message' variable
GUI.Label(new Rect(10,30,500,20),csScript.message);
C#访问js脚本组件:
using UnityE
using System.C
public class CSharp2 : MonoBehaviour
//create a variable to access the JavaScriptscript
private JS1 jsS
void Awake()
//Get the JavaScript component
jsScript = this.GetComponent&JS1&();//Don'tforget to place the 'JS1' file inside the 'Standard Assets' folder
//render text and other GUI elements to thescreen
void OnGUI()
//render the JS1 'message' variable
GUI.Label(newRect(10,10,300,20),jsScript.message);
7.使用第三方库:
第三方.NET库如XML-RPC可以以新建资源Asset的方式引入。
可以用print函数,Log()函数或者Debug.Log(),想设置断点,用Debug.Break()函数。
print() 函数将会生成消息,并输出到状态栏及控制台中,但仅限MonoBehavioour类范围内。
更好的办法是使用Debug.Log("insert messagehere");,该方法到处都可使用。还可用Debug.LogWarning 和 Debug.LogError生成警告和错误消息。
Debug.Break(); 可以将游戏暂停在一个精确的点。当一种特定的情条件发生时,如果你想检查对象的状态的时候,这个特性非常有用。
开发环境运行项目时,编辑界面也是完全实时更新的,你可以查看对象实例的内部状态。
参考整理自:
http://www.cnblogs.com/x3d/p/3838619.html
更多的细节:阅读和编写大量unityScript代码。
没有更多推荐了,
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!

我要回帖

更多关于 unity3d文件解包 的文章

 

随机推荐