下载

1下载券

加入VIP
  • 专属下载特权
  • 现金文档折扣购买
  • VIP免费专区
  • 千万文档免费下载

上传资料

关闭

关闭

关闭

封号提示

内容

首页 Unity脚本入门

Unity脚本入门.pdf

Unity脚本入门

withcoco
2014-03-27 0人阅读 举报 0 0 暂无简介

简介:本文档为《Unity脚本入门pdf》,可适用于IT/计算机领域

Unity脚本入门在Unity中脚本是必不可少的组成部分,因为它将定义你游戏的各种行为这个教程将介绍JavaScript的基本使用课时:小时作者:GrahamMcAllister译者:威阿()目录教程目的前提命名规范Player输入连接变量访问组件实例调试常见脚本类型教程目的在Unity中,脚本是用来界定用户在游戏中的行为(或规则)Unity推荐使用的编程语言是Javascript,但是C#或Boo同样也可以本教程不仅介绍了脚本的基础,也介绍了脚本的重要内容(API)你可以专注于您的游戏设计并缩短开发周期充分理解了这些的基础教程能使你更充分的使用Unity前提本教程的重点是Unity脚本基础,假设你已经熟悉了Unity的界面(如果不是,你应该阅读UnityGUI教程)为了使脚本更容易理解,最好有个支持JavaScript语法高亮的代码编辑器,也就是将关键字用不同的颜色显示出来SubEthaEdit就是这样的编辑器注:如果需要实际操作的文字,会被加””前缀命名规范在开始前,先说一下在Unity中的一些规范变量–首写是小写字母变量用来储存游戏状态中的任何信息函数–首写是大写字母函数是一个代码块,只需要写一次,在需要时候可以被再次重用类–首写是大写字母可以被认为是函数的库提示:当阅读范例代码或者Unity的API,要注意首写字母,这将有助于你更好的理解对象之间的关系Player输入我们第一个项目是在一个简单的游戏场景中走动设置场景启动Unity首先,让我们创建一个用来行走的平面,用一个扁的Cube创建一个Cube,缩放x,y,z为”,,”,它现在看起来应该是一个大平板在层次视图(HierarchyView)中重命名为”Plane”创建第二个Cube,将它放置在这个大平板的中心位置如果在游戏视图(GameView)看不到它们,那么改变主相机位置使它们可见重命名该物体为”Cube”你也应该建立一个点光源,并且放在大平板之上,使它们更清晰保存选择菜单File>SaveAs保存这个场景文件我们第一个脚本我们现在开始游戏设计我们打算让Player移动通过控制主相机的位置来实现,要做到这一点,我们现在要写一个脚本来读取键盘的输入然后把脚本和相机链接起来(更多的在下一节)首先创建一个空脚本选择”Assets>Create>Javascript”并在项目面板重命名为”Move”双击Move脚本,它将打开,并且默认包含有Update()函数,我们将我们的代码插入这个函数,任何加入Update()函数中的代码都将在每一帧(frame)执行一次在Unity中为了移动一个游戏对象我们需要用transform来更改它的位置,属于Translate,这个Translate函数有x,y和z三个参数,因为我们想通过光标键控制主相机,我们只需要下面这些代码,来决定按键按下后参数的变化:functionUpdate(){transformTranslate(InputGetAxis("Horizontal"),,InputGetAxis("Vertical"))}InputGetAxis()函数返回或的一个值,例如在横轴上左光标键映射为,有光标键映射为注意参数为y轴,因为我们不希望镜头上仰横轴和竖轴是在输入设置(InputSettings)中预先定义好的从Edit>ProjectSettings>Input中很容易重定义按键映射打开脚本Move并输入上面的代码,注意大小写连接脚本现在我们第一个脚本写完了,怎么让Unity的游戏对象具有这个脚本行为呢我们要做的是赋予这个脚本给游戏对象来体现脚本的行为首先点击你希望应用此脚本的游戏对象,对于我们而言,这里将是主相机,你可以从层次视图和场景视图中选择它然后从菜单中选择Components>Scripts>Move,将这个脚本赋予相机,你在检视面板中看到主相机有Move这个组件提示:你也可以从项目视图拖拽脚本到场景视图的游戏对象上点击播放按钮运行游戏,你能通过光标键或W,S,A,D键来移动主相机你也许注意到了,摄影机移动的有点太快了,让我们来找一种更好的办法来控制摄像头的速度Deltatime正如先前在Update()函数里的代码,相机的速度是按帧执行的然而我们需要游戏对象的移动按秒执行为了实现这一目标,我们需要将返回的值乘以InputGetAxis()函数中的TimedeltaTime:varspeed=functionUpdate(){varx=InputGetAxis("Horizontal")*TimedeltaTime*speedvarz=InputGetAxis("Vertical")*TimedeltaTime*speedtransformTranslate(x,,z)}将上面的代码更新到Move脚本注意Update()外的这个速度变量这是所为的暴露变量,这个变量会在检视面板中看到它是很有用的,实际使用中可以方便的调整它的值,这比改变代码来说方便的多连接变量通过Unity界面来连接变量是非常强大的Unity的功能它允许在Unity界面上拖拽(draganddrop)的方式来赋予脚本代码这是快速又简洁的主意这样在Unity界面中完成连接变量,我们知道我们总是需要脚本代码中暴露的变量,以便我们在检视面板中指派参数为了演示连接变量的概念,我们建立一个跟随玩家(主相机)的聚光灯添加一个聚光灯到场景视图,移动它靠近其他游戏对象创建一个JavaScript脚本并重命名为Follow让我们想想我们要做的,我们希望主相机的地方有个聚光灯所照耀事实上,Unity中有个函数能做到这一点transformLookAt()如果你开始想”我该怎么做”和已经想了很多代码那么要记得经常查看Unity的函数API,我们能同样的猜想查看API中的”transform’”章节,为感兴趣的游戏对象的位置和旋转现在,我们来到连接变量章节,我们如何使用LookAt()参数呢我们可以编写代码指定一个游戏对象,但是我们是想通过UnityGUI来指派变量,因此我们将用一个暴露变量(Transform类型)我们的Followjs脚本应该如下:vartarget:TransformfunctionUpdate(){transformLookAt(target)}赋予脚本给聚光灯,当这个脚本成功添加后,”target”变量就会暴露了选中聚光灯,从层次视图拖拽主相机到监视面板中的”target”暴露变量上分配给target变量,即聚光灯将跟随主相机如果我们想聚光灯跟随不同的对象,我们也可以拖拽不同的对象过去(当然只要它的类型是Transform)播放游戏,在场景视图中你能看到聚光灯跟随在主相机周围你可以改变聚光灯的位置来改变效果访问组件作为一个游戏对象能有多个脚本(或其他组件)它不可避免的要访问其他组件的函数或变量Unity中通过GetComponent()函数来实现这个我们现在要添加另外的脚本来让按下跳跃键(默认空格键)时让聚光灯射向Cube让我们先思考这个问题,我们要做的是:监视跳跃键被按下当跳跃键按下时,聚光灯将照射Cube我们如何做到这一点呢那么Follow脚本包含一个”target”变量,其值确定哪些游戏对象被聚光灯所照射我们需要为这个值设定一个新的参数我们可以写代码给这个值为cube(看本节后的”写代码”),但我们知道暴露了这个变量,通过GUI上指定变量的值是更好的办法:创建一个新的JavaScript脚本并重命名为Switch,添加代码到Switchjs:varswitchToTarget:TransformfunctionUpdate(){if(InputGetButtonDown("Jump"))GetComponent(Follow)target=switchToTarget}尤其注意关注GetComponent()的值,这将返回一个参考给Follow脚本,我们就可以用它来访问”target”变量添加Switch脚本到聚光灯和将在检视视图中指定Cube给switchToTarget值运行游戏,走动验证聚光灯像往常一样跟随着你,然后你按下空格键,聚光灯的焦点将转到Cube上这样写代码前面的教程中我们提到,可以通过写代码的方式指定变量(而不是通过Unity界面),让我们看看如何做记住,这只是用来比较,建议通过Unity界面来给变量赋值早先按下空格时告诉聚光灯聚焦到Cube上我们的解决方案是做一个暴露变量在Switch脚本,我们便可以在Unity的界面上拖拽Cube上去在代码中主要有两种方法做到这一点:使用游戏对象的名称(name)使用游戏对象的标签(tag)游戏对象名称可以从层次视图中看到游戏对象的名称用GameObjectFind()函数来使这些名称作为参数因此如果我们想按下跳跃键时候切换聚光灯从主相机到Cube,代码如下::functionUpdate(){if(InputGetButtonDown("Jump")){varnewTarget=GameObjectFind("Cube")transformGetComponent(Follow)target=newTarget}}注意没有暴露变量而是直接使用代码查看API获得更多Find()的用法游戏对象标签游戏对象表情是字符串用于识别一个组件在检视视图中点击Tag按钮查看内建的标签你也可以创建自己的标签GameObjectFindWithTag()函数能通过具体标签寻找组件和返回一个字符串作为参数代码如下:functionUpdate(){if(InputGetButtonDown("Jump")){varnewTarget=GameObjectFindWithTag("Cube")transformGetComponent(Follow)target=newTarget}}实例通常在运行时创建(create)对象(如游戏正在播放)要这样做,我们要用到Instantiate函数让我们讲述如何在每次按下开火按钮(或按鼠标左键或左Ctrl键)后通过实例(建立)一个新的游戏对象那么我们怎么做呢我们希望用户像往常一样走动,当按下开火按钮,实例化创建一个新的对象思考以下几点:哪个物体做我们的实例在哪里做实例化关于哪个对象到实例,最好的解决办法是暴露变量这意味着我们随时可以通过拖拽游戏对象到变量来改变对象为实例至于哪里做实例化,现在我们只要实现当按下开火按钮时在用户(主相机)当前位置创建新的游戏对象实例化函数有三个参数:()我们要建立一个对象,()对象的三维位置和()对象的旋转位置完整的代码如下(Createjs):varnewObject:TransformfunctionUpdate(){if(InputGetButtonDown("Fire")){Instantiate(newObject,transformposition,transformrotation)}}不要忘记,transformposition和transformrotation是附加到脚本的transform的位置和选择的,这里假如是主相机(MainCamera)然而,当一个对象被实例化,通常将对象设置为预设(prefab),我们现在将Cube游戏对象设置为预设首先,让我们嫩创建一个空的预设,选择Assets>Create>Prefab重命名这个预设为”Cube”从层次视图拖拽Cube游戏对象到项目视图的Cube预设上注意预设图标的变化现在我们创建Javascript代码创建一个新的脚本和命名为Create,并插入上面的代码把这个脚本赋予给主相机(MainCamera)和将Cube预设赋予主相机上的newObject变量运行游戏,并向以往一样走动每当按下开火按钮(鼠标左键或左Ctrl)你都能看到一个新的Cube出现调试调试是发现和修正你的代码中人为错误的技巧,Unity中提供了Debug类,我们现在看看DebugLog()函数LogLog()函数允许用户发送信息到Unity的控制台这样做的原因可能包括:在运行时要验证某部分代码是否达成报告变量的状态我们现在使用Log()函数,当用户点击开火按钮时发送一个消息到Unity控制台打开创建的脚本并在”Instantiate’”代码内”if”处添加如下代码:DebugLog("Cubecreated")运行游戏和点击开火按钮,你能看到Unity界面下方显示”Cubecreated”,你可以点击这个提示详细查看Unity控制台Watch另外一个有用的功能是用于调试私有变量这使得当Debug模式被选中时检视视图中的变量,但它不能被编辑为了证明这一点,我们将暴露一个私有变量作为Cube实例的计数再次打开创建的脚本并添加两行:()添加私有变量引用cubeCount()当一个cube实例创建后增加这个变量完整代码如下(Createjs):varnewObject:TransformprivatevarcubeCount=functionUpdate(){if(InputGetButtonDown("Fire")){Instantiate(newObject,transformposition,transformrotation)DebugLog("Cubecreated")cubeCount}}运行游戏并点击开火按钮创建一些Cube,注意每当一个新的Cube实例创建后cubeCount变量的递增同样这个数值是灰色的,意味着变量是只读的(不能编辑)常见脚本类型每当一个新Javascript被创建,默认情况下将包含Update()函数这一届将讲述其他常见的函数,简单的从下面列表中替换Update()函数名字FixedUpdate()置于这个函数中的代码每隔一定间隔执行(固定的帧率)它通常被用来Rigibody中用力的时候ApplyaupwardsforcetotherigidbodyeveryframefunctionFixedUpdate(){rigidbodyAddForce(Vectorup)}Awake()这里的代码将被用作初始化Start()这个函数将在Update()之前,但在Awake()之后执行Start()函数和Awake()函数的不同点在于Start()函数仅在脚本启用时候执行(检视视图如果它的复选框被选中)OnCollisionEnter()当游戏对象的碰撞脚本与另外的游戏对象碰撞时执行这个函数内的代码OnMouseDown()当鼠标在一个载有GUI元素(GUIElement)或碰撞器(Collider)的游戏对象里按下时执行该函数内的代码Loadsthelevelnamed"SomeLevel"asaresponsetotheuserclickingontheobjectfunctionOnMouseDown(){ApplicationLoadLevel("SomeLevel")}OnMouseOver()当鼠标在一个载有GUI元素(GUIElement)或碰撞器(Collider)的游戏对象里的按下动作抬起后执行该函数内的代码FadestheredcomponentofthematerialtozerowhilethemouseisoverthemeshfunctionOnMouseOver(){renderermaterialcolorr=*TimedeltaTime}查看UnityAPI获得这些函数的更多信息此教程介绍了Unity脚本的基本概念你现在应该看看其他Unity教程或自己试试吧!

用户评价(0)

关闭

新课改视野下建构高中语文教学实验成果报告(32KB)

抱歉,积分不足下载失败,请稍后再试!

提示

试读已结束,如需要继续阅读或者下载,敬请购买!

文档小程序码

使用微信“扫一扫”扫码寻找文档

1

打开微信

2

扫描小程序码

3

发布寻找信息

4

等待寻找结果

我知道了
评分:

/7

Unity脚本入门

VIP

在线
客服

免费
邮箱

爱问共享资料服务号

扫描关注领取更多福利