,Unity,脚本入门,深圳市国泰安信息技术有限公司,一,、,命名规范,二,、,第一个脚本,三,、,连接变量,四、,访问组件,五、,实例,六,、调试,一,、,命名规范,在,开始前,先说一下在,Unity,中的一些规范,.,1,、变量,首写是小写字母,.,变量用来储存游戏状态中的任何信息,.,2,、函数,首写是大写字母,.,函数是一个代码块,只需要写一次,在需要时候可以被再次重用,.,3,、类,首写是大写字母,.,可以被认为是函数的库,.,二,、,第一个,脚本,我们的第一个,脚本是,在一个简单的游戏场景中走动,.,第一,步:设置场景,即在游戏场景中添加地面和游戏对象。,地面,可由一个扁的,Cube,代替,.,创建,一个,Cube,缩放,x,y,z,为”,5,0.1,5”,它现在看起来应该是一个大平板,.,在层次视图,(Hierarchy View),中重命名为”,Plane”.,二,、,第一个,脚本,我们的第一个脚本游戏是在一个简单的游戏场景中走动,.,第一步:设置场景,即在游戏场景中添加地面和游戏对象。,地面可由一个扁的,Cube,代替,.,创建一个,Cube,缩放,x,y,z,为”,5,0.1,5”,它现在看起来应该是一个大平板,.,在层次视图,(Hierarchy View),中重命名为”,Plane”.,二,、,第一个,脚本,游戏,对象可由另一个,Cube,代替,.,创建,第二个,Cube,将它放置在这个大平板的中心位置,.,如果在游戏视图,(Game View),看不到它们,那么改变主相机位置使它们可见,.,重命名该物体为”,Cube1”.,还,应该建立一个点光源,并且放在大平板之上,使它们更清晰,.,二,、,第一个,脚本,我们的第一个脚本游戏是在一个简单的游戏场景中走动,.,第一步:设置场景,即在游戏场景中添加地面和游戏对象。,地面可由一个扁的,Cube,代替,.,创建一个,Cube,缩放,x,y,z,为”,5,0.1,5”,它现在看起来应该是一个大平板,.,在层次视图,(Hierarchy View),中重命名为”,Plane”.,二,、,第一个,脚本,要想让游戏对象,cube1,运动起来,就需要加入脚本。,通过控制主相机的位置来实现,要做到这一点,我们现在要写一个脚本来读取键盘的输入,.,然后把脚本和相机链接起来,。,首先,创建一个空脚本,.,选择,”,Assets-Create-Javascript”,并在项目面板重命名为”,Move1”.,双击,Move1,脚本,它将打开,并且默认包含有,Update(),函数,我们将我们编写的代码插入这个函数,任何加入,Update(),函数中的代码都将在每一帧,(frame),执行一次,.,二,、,第一个,脚本,二,、,第一个,脚本,Update,(),函数:,这个,函数在渲染一帧之前被调用。这里是大部分游戏行为代码被调用的地方。,在,Unity,中为了移动一个游戏对象我们需要用,transform,来更改它的位置,属于,Translate,这个,Translate,函数有,x,y,和,z,三个参数,因为我们想通过光标键控制主相机,我们只需要下面这些代码,来决定按键按下后参数的变化,:,Input.GetAxis,(),函数返回,-1,或,1,的一个值,例如在横轴上左光标键映射为,-1,右光标键映射为,1.,横轴和竖轴是在输入设置,(Input Settings),中预先定义好的,.,从,Edit-Project Settings-Input,中很容易重定义按键映射,.,注意:参数,0,为,y,轴,因为我们不希望镜头上仰,.,function Update(),transform.Translate(Input.GetAxis(“Horizontal”),0,Input.GetAxis(Vertical);,二,、,第一个,脚本,打开脚本,Move1,并输入上面的代码,注意大小写,.,现在我们第一个脚本写完了,怎么让,Unity,的游戏对象具有这个脚本行为呢,?,第一,步:首先点击你希望应用此脚本的游戏对象,对于我们而言,这里将是主相机,你可以从层次视图和场景视图中选择它,.,第二,步:从菜单中选择,Components-Scripts-Move1,将这个脚本赋予相机,你在检视面板中看到主相机有,Move1,这个组件,.,二,、,第一个,脚本,二,、,第一个,脚本,提示,:,也,可以从项目视图拖拽脚本到场景视图的游戏对象上,.,点击,播放按钮运行游戏,你能通过光标键或,W,S,A,D,键来移动主相机,.,你也许注意到了,摄影机移动的有点太快了,让我们来找一种更好的办法来控制摄像头的速度,.,正如,先前在,Update(),函数里的代码,相机的速度是按帧执行的,.,然而我们需要游戏对象的移动按秒执行,.,为了实现这一目标,我们需要将返回的值乘以,Input.GetAxis(),函数中的,Time.deltaTime:,二,、,第一个,脚本,varspeed=5.0;,function Update(),varx=Input.GetAxis(Horizontal)*Time.deltaTime*speed;,varz=Input.GetAxis(Vertical)*Time.deltaTime*speed;,transform.Translate(x,0,z);,将上面的代码更新到,Move1,脚本,.,注意:,Update(),外的这个速度变量,.,这是所为的,public,变量,这个变量会在检视面板中看到,.,它是很有用的,实际使用中可以方便的调整它的值,这比改变代码来说方便的多,.,三、,连接变量,通过,Unity,界面来连接变量的功能是非常强大的,.,Unity,允许在其界面上用拖拽,(drag and drop),的方式来赋予游戏对象脚本代码,.,这是快速又简洁的方式,.,这样在,Unity,界面中完成连接变量的功能。,我们总是需要脚本代码中暴露的变量,以便我们在检视面板中设置数值,.,为了演示连接变量的概念,我们建立一个跟随玩家,(,主相机,),的聚光灯,.,添加,一个聚光灯到场景视图,移动它靠近其他游戏对象,.,创建,一个,JavaScript,脚本并重命名为,Follow.,我们,希望主相机的地方有个聚光灯所照耀,.,事实上,Unity,中有个函数能做到这一点,.,transform.LookAt,().,我们,可以使用一个暴露变量,(Transform,类型,),。,Follow.js,脚本如下,:,vartarget:Transform;,function Update(),transform.LookAt(target);,三、,连接变量,赋予,脚本给聚光灯,当这个脚本成功添加后,”target”,变量就会暴露了,.,选中,主相机,从层次视图拖拽主相机到聚光灯监视面板中的”,target”,暴露变量上分配给,target,变量,即聚光灯将跟随主相机,.,如果我们想聚光灯跟随不同的对象,我们也可以拖拽不同的对象过去,(,当然只要它的类型是,Transform).,播放,游戏,在场景视图中你能看到聚光灯跟随在主相机周围,.,你可以改变聚光灯的位置来改变效果,.,四、,访问组件,作为一个游戏对象可以有多个脚本,(,或其他组件,).,它不可避免的要访问其他组件的函数或变量,.Unity,中通过,GetComponent(),函数来实现这个功能,.,现在我们要添加另外的脚本来实现按下跳跃键,(,默认空格键,),的同时让聚光灯射向,Cube1.,让,我们先思考这个问题,我们要做的是,:,1.,监视,跳跃键被按下,.,2,.,当跳跃键按下时,聚光灯将照射,Cube1.,四、访问组件,我们,如何做到这一点呢,?,创建一个新的,JavaScript,脚本并重命名为,Switch,添加代码到,Switch.js:,varswitchToTarget:Transform;,function Update(),if(Input.GetButtonDown(Jump),GetComponent(Follow).target=switchToTarget;,四、访问组件,尤其注意关注,GetComponent(),的值,这将返回一个参考给,Follow,脚本,我们就可以用它来访问”,target”,变量,.,添加,Switch,脚本到聚光灯和将在检视视图中指定,Cube1,给,switchToTarget,值,.,运行,游戏,走动验证聚光灯像往常一样跟随着你,然后你按下空格键,聚光灯的焦点将转到,Cube1,上,.,除了,上面的方式之外,可以通过写代码的方式指定变量,(,而不是通过,Unity,界面,),让我们看看如何做,.,记住,这只是用来比较,建议通过,Unity,界面来给变量赋值,.,早先按下空格时告诉聚光灯聚焦到,Cube1,上,.,我们的解决方案是做一个暴露变量在,Switch,脚本,我们便可以在,Unity,的界面上拖拽,Cube1,上去,.,写,代码的方式主要有两种方法做到这一点,:,1.,使用游戏对象的名称,(name),2,.,使用游戏对象的标签,(tag,),四、访问组件,游戏,对象名称,可以,从层次视图中看到游戏对象的名称,.,用,GameObject.Find,(),函数来使这些名称作为参数,.,因此如果我们想按下跳跃键时候切换聚光灯从主相机到,Cube1,代码如下,:,function Update(),if,(Input.GetButtonDown(Jump),varnewTarget=GameObject.Find(Cube1).transform;,GetComponent(Follow).target=newTarget;,四、访问组件,注意,:没有暴露变量而是直接使用代码,.,1.,查看,API,获得更多,Find(),的用法,2.,游戏对象标签,游戏对象标签是字符串用于识别一个组件的标志,.,在检视视图中点击,Tag,按钮查看内建的标签,.,你也可以创建自己的标签,.,四、访问组件,GameObject.FindWithTag(),函数能通过具体标签寻找组件和返回一个字符串作为参数,.,代码如下,:,function Update(),if(Input.GetButtonDown(Jump),varnewTarget,GameObject.FindWithTag(Cube1).transform;,GetComponent(Follow).target=newTarget;,五、实例,通常,在运行时创建,(create),对象,(,如游戏正在播放,).,这时我们要用到,Instantiate,函数,.,下面,我们学习如何在每次按下开火按钮,(,或按鼠标左键或左,Ctrl,键,),后通过实例,(,建立,),一个新的游戏对象,.,我们怎么做呢,?,我们希望用户像往常一样走动,当按下开火按钮,实例化创建一个新的对象,.,思考,以下几点,:,哪个,物体做我们的实例,?,在,哪里做实例化,?,关于,哪个对象到实例,最好的解决办法是暴露变量,.,这意味着我们随时可以通过拖拽游戏对象到变量来改变对象为实例,.,五、实例,至于,哪里做实例化,现在我们只要实现当按下开火按钮时在用户,(,主相机,),当前位置创建新的游戏对象,.,实例化函数有三个参数,:,(1),我们要建立一个对象,(2),对象的三维位置,(3),对象的旋转位置,.,完整的代码如下,(Create.js):,varnewObject:Transform;,function Update(),if(Input.GetButtonDown(Fire1),Instantiate(newObject,transform.position,transform.rotation);,五、实例,不要,忘记,transform.position,和,transform.rotation,是附加到