![Unity 4.3游戏开发项目实战(C#、JavaScript版本)](https://wfqqreader-1252317822.image.myqcloud.com/cover/700/23370700/b_23370700.jpg)
2.2 飞机移动
要实现飞机移动,首先需要实现显示飞机,然后实现飞机移动,最后实现飞机的左、右循环移动。
2.2.1 显示飞机
下面介绍如何在Unity3D中显示飞机。
1.打开游戏项目资源,新建场景
首先找到光盘中的游戏项目资源——2.太空射击游戏项目资源——SpaceShoot,将整个文件夹SpaceShoot拷贝到系统的C盘根目录,如图2-12所示。
![](https://epubservercos.yuewen.com/E586E6/11989104003033406/epubprivate/OEBPS/Images/figure_0037_0002.jpg?sign=1738858764-ArKFTSgSkoEmOWis6ih0ECBtVf69Xr20-0-e7ef074219341a66f139fc8859cd9b48)
图2-12 SpaceShoot项目文件
然后启动Unity3D软件,如果Unity3D自动打开以前的项目文件,如图2-13所示,则需要单击菜单 “File”,选择 “Open Project” 命令,在如图2-14所示的对话框中,选择 “Open Project”窗格,然后在该窗格中选择文件夹SpaceShoot,这样就可以打开太空射击游戏SpaceShoot的项目资源,如图2-15所示。
![](https://epubservercos.yuewen.com/E586E6/11989104003033406/epubprivate/OEBPS/Images/figure_0038_0001.jpg?sign=1738858764-8B3P546FRFgbOrWitIwhxIp0WHrtBjSu-0-d7d12c9c6e22d130916632ec29cd654f)
图2-13 打开新的项目文件
![](https://epubservercos.yuewen.com/E586E6/11989104003033406/epubprivate/OEBPS/Images/figure_0038_0002.jpg?sign=1738858764-oOsuJBXVjuaUKoG8E2qX8hC8DHRGZk7M-0-630aee1ad26f0eb15621125b960d6235)
图2-14 打开新项目对话框
![](https://epubservercos.yuewen.com/E586E6/11989104003033406/epubprivate/OEBPS/Images/figure_0039_0001.jpg?sign=1738858764-q7XC5AFvQYld5TC5fjuc0tecHPXBJ1ij-0-da5f8f9fd41b801ac55c7b6f150759f6)
图2-15 打开SpaceShoot项目资源文件
如果Unity3D是第一次运行,以前没有创建游戏项目文件,则会打开如图2-14所示的对话框,选择“Open Project”窗格,并需要单击“Open Other”按钮,打开“浏览文件夹”对话框,在“浏览文件夹”对话框中选择文件夹SpaceShoot,同样可以打开如图2-15所示的运行界面。
在图2-15中,SpaceShoot项目资源文件中包括三个资源文件夹,它们分别是Image、 prefabs和sound。
在Image文件中提供了各种图片,以便实现太空射击游戏项目的各种对象,如飞机、陨石、炮弹以及爆炸的效果帧序列图等,如图2-16所示。
![](https://epubservercos.yuewen.com/E586E6/11989104003033406/epubprivate/OEBPS/Images/figure_0039_0002.jpg?sign=1738858764-BiOI9wpHCCsZmXf2xIwNsL3O780UP5p6-0-d1f711038f37af3b2272477a7cf0b531)
图2-16 Image目录下的各种图片资源
在prefabs文件中,则提供了一个sprite预制对象,用于专门显示2D图片,以便构建游戏场景,如图2-17所示。
![](https://epubservercos.yuewen.com/E586E6/11989104003033406/epubprivate/OEBPS/Images/figure_0040_0001.jpg?sign=1738858764-uI6VkPENbXqeuys6ev826bJfvIokERgI-0-97eaa01375761c3d9da12973f8fd21e2)
图2-17 prefabs目录下的资源
在如图2-18所示的sound文件夹中,提供了各种声音文件,选择相关声音文件,单击图片右下方的播放按钮,可以在Unity3D中直接播放声音。
![](https://epubservercos.yuewen.com/E586E6/11989104003033406/epubprivate/OEBPS/Images/figure_0040_0002.jpg?sign=1738858764-slirMAKi5a1uMefkGVsYWp4V6NpgwIqB-0-0ec3137c77dc3f3ef9d29241b7065c36)
图2-18 sound目录下的各种声音文件
由此可见,在太空射击这个2D游戏的资源文件中,主要是图片、声音和预制对象。
在图2-15中,首先单击菜单“File”→“New Scene”命令;然后再单击菜单“File”→“Save Scene as”命令,打开如图2-19所示的保存场景对话框,在其中输入Level场景名称,单击“保存”按钮,即可保存该场景。
![](https://epubservercos.yuewen.com/E586E6/11989104003033406/epubprivate/OEBPS/Images/figure_0040_0003.jpg?sign=1738858764-rWylyPBdD7qNsbX1S4UMOag1WoL45IMs-0-93526d5ee0f21541825c5853462477a1)
图2-19 保存场景对话框
保存场景后的项目窗格如图2-20所示。
![](https://epubservercos.yuewen.com/E586E6/11989104003033406/epubprivate/OEBPS/Images/figure_0040_0004.jpg?sign=1738858764-xl5IpUZGFv2uR2pvGUMI9DiQ6DmbtDxg-0-ab8ac56c461657006a10ac17b3757bcb)
图2-20 项目窗格中的场景
2.设置游戏窗口分辨率
为方便游戏场景的设计,这里设置游戏的输出界面为固定大小,将游戏窗口的分辨率设置为800×600。
在图2-11中,单击“Build Setting”命令,打开如图2-22所示的构建设置对话框,选择平台“Platform”下拉框中的“PC, Mac & Linux...”,单击下方“Player Settings”按钮,在检视器中出现如图2-23所示的界面。
![](https://epubservercos.yuewen.com/E586E6/11989104003033406/epubprivate/OEBPS/Images/figure_0041_0002.jpg?sign=1738858764-hzldAZ7wxwnBafp2FNaGtNqutxx1JY7S-0-e00443f1f87c16c6f29afb73772dec8c)
图2-22 构建设置对话框
![](https://epubservercos.yuewen.com/E586E6/11989104003033406/epubprivate/OEBPS/Images/figure_0041_0003.jpg?sign=1738858764-bhalDWKEYcEOSdGktIJwrHILsYv3Pq9B-0-b53cb56502f2f1b603b4210856fb1952)
图2-23 设置分辨率
![](https://epubservercos.yuewen.com/E586E6/11989104003033406/epubprivate/OEBPS/Images/figure_0041_0001.jpg?sign=1738858764-QeZPEfKsVqpErGKTEqJpctU387ZmxEPn-0-2f9301ba7a0b3601aa50f9dbb9703b4f)
图2-21 构建设置
在图2-23中,选择排在第二个的PC分辨率窗格,设置游戏界面的输出大小为分辨率800 ×600,然后关闭如图2-23所示的对话框。
3.设置摄像机
摄像机是Unity3D游戏开发中的一个重要组件。当新建一个场景时,Unity3D会自动生成一个Main Camera摄像机对象。
在图2-15中,选择层次Hierarchy窗格中的Main Camera对象,在游戏场景Scene窗格中,通过相关场景按钮、游戏对象平移按钮,调整摄像机的显示大小和旋转位置,出现如图2-24所示的游戏场景Scene界面。
![](https://epubservercos.yuewen.com/E586E6/11989104003033406/epubprivate/OEBPS/Images/figure_0042_0001.jpg?sign=1738858764-qTfvxg9981YT4ayxTkVSskFQvhX8sIZL-0-76128e3d5e4dd630e106f1a1943ae80e)
图2-24 摄象机的形状
在图2-24中,摄象机的形状显示为一个四棱锥体,只有在这个四棱锥体范围内的游戏对象,才能被摄象机所看到,也就是在游戏输出窗格中出现。这个四棱锥体的大小由检视器窗格中的相关参数来决定,如图2-25所示。
![](https://epubservercos.yuewen.com/E586E6/11989104003033406/epubprivate/OEBPS/Images/figure_0042_0002.jpg?sign=1738858764-e1z47NN7o5n30QMnHvX7ugaHGkXItxwa-0-a26c13f1e49cafae06308e3ff177005d)
图2-25 摄像机参数
在图2-25所示的摄像机Camera组件中,其中的三个参数决定摄像机四棱锥体的大小和形状,它们分别是Field of View视角,默认情况为60度,该角度决定了四棱锥体的角度,相当于真实世界中照相机的广角。如果将视角设置为45度,摄像机的游戏场景Scene界面如图2-26所示;剪切平面Clipping planes中的两个参数为近端平面near和远端平面far,如果设置near为30, far为100,此时摄像机的游戏场景Scene界面如图2-27所示。
![](https://epubservercos.yuewen.com/E586E6/11989104003033406/epubprivate/OEBPS/Images/figure_0042_0003.jpg?sign=1738858764-tEAk3XunNS0NgNjndJGIjVL3whsszE2y-0-518f0ab1697143c417b234ad25e3686b)
图2-26 摄象机形状
![](https://epubservercos.yuewen.com/E586E6/11989104003033406/epubprivate/OEBPS/Images/figure_0043_0001.jpg?sign=1738858764-rsAgxDFgYxaopuWAZWsU2ruPeiDKepbC-0-36b091bfe60ed21be04a630cd246fd80)
图2-27 摄象机形状
从图2-27中可以看出,近端平面near参数决定四棱锥体上截面的位置,远端平面far决定四棱锥体的底面位置。只有在这两个平面之间的四棱锥体内的游戏对象,才能在游戏输出窗口中显示。
在图2-25所示的摄像机参数中,还有一个重要的参数就是投影方式Projection。在默认情况下,Unity3D设置的投影方式为透视投影Perspective,也就是3D投影,其摄像机形状是四棱锥体。
如果设置投影方式Projection为正交投影Orthographic,此时的投影方式则转为2D投影,其摄像机形状是长方体,如图2-28所示。
![](https://epubservercos.yuewen.com/E586E6/11989104003033406/epubprivate/OEBPS/Images/figure_0043_0002.jpg?sign=1738858764-cdj7P7uJmUIiLfW4FkmsGpoJJ52FPEK5-0-34debd51aa15edd7d0e21c895b341389)
图2-28 正交投影的摄象机形状
从上述的图2-28所示可以看出,只有在这个长方体内的游戏对象,才能在游戏输出窗格中显示。
需要开发的太空射击游戏项目是一个2D的游戏,这里需要设置投影方式Projection为正交投影Orthographic,其他参数的设置,如图2-29所示。
![](https://epubservercos.yuewen.com/E586E6/11989104003033406/epubprivate/OEBPS/Images/figure_0044_0001.jpg?sign=1738858764-qyBl6jh6DuhrDXqbKjjH4tQrnozVFcnK-0-124e40b3d35aefc27bcf21b423e48e4b)
图2-29 摄像机参数
4.新建Player对象
在项目Project窗格中,选择prefabs文件夹中的sprite对象,直接拖放该对象到层次Hierarchy窗格中,并将该对象的名称修改为Player,如图2-30所示。
![](https://epubservercos.yuewen.com/E586E6/11989104003033406/epubprivate/OEBPS/Images/figure_0044_0002.jpg?sign=1738858764-ri8ArvNK3GdcAy8RJsm6yVuZjka8kJE8-0-ac7e43a11cd70ac066ae349d955838a3)
图2-30 拖放sprite对象
在成功拖放游戏sprite对象之后,游戏窗格中将会显示该对象,如图2-31所示。但是该对象的显示结果是非常暗淡,这里需要说明的是,光源也是Unity3D中的一个重要组件,而sprite对象,则是专门用来显示2D图片的一个预制件prefab。
![](https://epubservercos.yuewen.com/E586E6/11989104003033406/epubprivate/OEBPS/Images/figure_0044_0003.jpg?sign=1738858764-Kq1fj6xkfHEaXjvfC90KBR07jmCfgod2-0-438b23fc8084163374732d751d187ce6)
图2-31 游戏窗格
下面说明如何设置光源以便照亮上述游戏场景,以便可以看得清楚游戏对象Player。
单击菜单“GameObject”→“Create Other”→“Directuional Light”命令,如图2-32所示,此时就会在游戏场景中创建一个平行光对象,该平行光对象的基本属性可以在检视器中设置,如图2-33所示。
![](https://epubservercos.yuewen.com/E586E6/11989104003033406/epubprivate/OEBPS/Images/figure_0044_0004.jpg?sign=1738858764-8EQLA6a1B2RmEaunfcrFFT4IeccxlZen-0-50c5ead2837fb4f30bbf6ce872e4ea9d)
图2-32 创建平行光
![](https://epubservercos.yuewen.com/E586E6/11989104003033406/epubprivate/OEBPS/Images/figure_0044_0005.jpg?sign=1738858764-gFqCvtG0oRJARZ5A1DoKrk6UZT8zb23i-0-6d88c239acc5487d813cd657b5fee0c6)
图2-33 平行光设置
在图2-33中,设置该平行光的角度为0,以便直射照到Player对象上,至于位置则无关紧要,并不影响游戏的效果,就像太阳的效果一样,只与角度有关,而与位置无关。
设置完成平行光之后,游戏对象Player就变得明亮起来,其效果如图2-34所示。
![](https://epubservercos.yuewen.com/E586E6/11989104003033406/epubprivate/OEBPS/Images/figure_0045_0001.jpg?sign=1738858764-CVpO3TYdkKWBTUR0GFHJKZshVKXCxBLZ-0-1845be3d2a30dc1a7ef4723bba732f5e)
图2-34 游戏窗格
5.显示飞机Player
在项目Project窗格中,选择Image文件夹中的Player图片,直接拖放该对象到层次Hierarchy窗格中的Player对象之上,如图2-35所示。
![](https://epubservercos.yuewen.com/E586E6/11989104003033406/epubprivate/OEBPS/Images/figure_0045_0002.jpg?sign=1738858764-uZDgWdCAiyhzbRCBa87aMx79RPRXUVIo-0-0158e941d5f70705bec7a8e80f929028)
图2-35 拖放飞机图片
飞机图片拖放成功之后,就会在游戏窗格中显示出该飞机图片,如图2-36所示。
![](https://epubservercos.yuewen.com/E586E6/11989104003033406/epubprivate/OEBPS/Images/figure_0046_0001.jpg?sign=1738858764-VzS6Q6VudhjaHg2KEwlSNmzU6augl1EZ-0-fcac26a047da5a8ffa356e454cdf0818)
图2-36 显示飞机
从图2-36中可以看出,尽管原始的飞机图片背景是透明的,可是在Unity3D中显示的飞机却不是透明的。
下面来设置飞机的背景透明化。
在图2-37中,单击飞机图片Shader右边的下拉菜单,在出现的快捷菜单中选择“Transparent”→“Diffuse”命令,就可以将原有的飞机透明背景,设置为在Unity3D中也是透明的背景,显示的飞机Player,如图2-38所示。
![](https://epubservercos.yuewen.com/E586E6/11989104003033406/epubprivate/OEBPS/Images/figure_0046_0002.jpg?sign=1738858764-YFITJcpGRiCQs3DxHuy6MT9GwNUISpYf-0-8de8b63af2764835265a7c4f64e22d1b)
图2-37 背景透明化设置
![](https://epubservercos.yuewen.com/E586E6/11989104003033406/epubprivate/OEBPS/Images/figure_0046_0003.jpg?sign=1738858764-TIfb61KaeviAw7eTvmLhAW8WGaIQgsiY-0-744b2136074ba640f188171ab2d0fc3a)
图2-38 显示飞机
2.2.2 飞机移动
要实现飞机移动,开发者需要编写代码,实现游戏对象移动的功能需求;然后将该实现代码拖放到飞机Player对象之上,这样Player就可以执行该代码,实现飞机移动。
1.移动飞机Player
在编写代码之前,首先在Project项目窗格中创建一个“Script”的文件夹,专门存放相关代码。
如图2-39所示,在右键出现的快捷菜单中选择“Create”→“Folder”命令,创建一个新的文件夹“Script”,如图2-40所示。
![](https://epubservercos.yuewen.com/E586E6/11989104003033406/epubprivate/OEBPS/Images/figure_0047_0001.jpg?sign=1738858764-GZyxWDrOcsPoUtvTYKhDBjUgPISXVZWt-0-495aa34febf927f524b06a3d6c5da206)
图2-39 新建文件夹
![](https://epubservercos.yuewen.com/E586E6/11989104003033406/epubprivate/OEBPS/Images/figure_0047_0002.jpg?sign=1738858764-XM0Gg0vd1i6ellBGnyN2gKT0h72ceVnI-0-928d6b621b0ed9317852ad215dc3d4c9)
图2-40 创建“Script”
对于C#开发者来说,在图2-41中,选择Script文件夹,在右键出现的快捷菜单中选择“Create”→“C# Script”命令,创建一个C#文件,该文件名称为PlayerController,如图2-42所示。
![](https://epubservercos.yuewen.com/E586E6/11989104003033406/epubprivate/OEBPS/Images/figure_0047_0003.jpg?sign=1738858764-5ZiaiYkK0kpaeA5MaTy3NIxPI5ayq38i-0-3279505cb4daaf913c6544d35a05e478)
图2-41 新建C#文件
![](https://epubservercos.yuewen.com/E586E6/11989104003033406/epubprivate/OEBPS/Images/figure_0047_0004.jpg?sign=1738858764-EGbUGThqP9Jz7cQMYxOix9Vt6dsys3DX-0-a713484601a0608fb0e16cf2849d84c1)
图2-42 新建PlayerController.cs文件
对于JavaScript开发者来说,在图2-43中,选择Script文件夹,在右键出现的快捷菜单中选择“Create”→“Javascript”命令,创建一个JavaScript文件,该文件为playerController.js文件,如图2-44所示。
![](https://epubservercos.yuewen.com/E586E6/11989104003033406/epubprivate/OEBPS/Images/figure_0048_0001.jpg?sign=1738858764-ljk4VaGhhPhDG5ym4HuZjl4IpRXKZ5zk-0-1514ee2ebe2d7dd5234f1c4d32f1fb1e)
图2-43 新建Javascript文件
![](https://epubservercos.yuewen.com/E586E6/11989104003033406/epubprivate/OEBPS/Images/figure_0048_0002.jpg?sign=1738858764-Nd1THIivzrUQZG9metn9cHuT896RuzHd-0-6fc3e6e845d713cd2311152cae988e8c)
图2-44 新建playerController.js文件
对于C#开发者来说,在图2-42中,双击PlayerController文件,Unity3D打开如图2-45所示的代码编辑界面。
![](https://epubservercos.yuewen.com/E586E6/11989104003033406/epubprivate/OEBPS/Images/figure_0048_0003.jpg?sign=1738858764-8LboZXwBdnbmnIabVgQJKDCmzm1lSpmF-0-bf7b8e08f212b87eff45a0e4ac65d99c)
图2-45 C#代码编辑界面
在图2-45中书写相关代码,PlayerController的C#代码文件见代码2-1。
代码2-1 PlayerController的C#代码
1: using UnityEngine; 2: using System.Collections; 3: 4: public class PlayerController: MonoBehaviour 5: { 6: 7: void Update() 8: { 9: transform.Translate(Input.GetAxis("Horizontal")*Time.deltaTime,0,0); 10: } 11: }
在上述C#代码中,首先需要注意的是C#的类名称一定要与文件名称一致,这里类的名称为第4行代码中PlayerController,与文件名称PlayerController是一致的。
开发者需要在第7行到第10行之间的Update()中实现相关代码,以便Unity3D逐帧运行Update()中的相关游戏业务逻辑代码。
在第9行中,通过transform对象获得执行该代码的游戏对象Player,然后通过transform对象的Translate方法,实现Player的移动。
在Translate方法中,需要输入一个3D的矢量值,由于只需要实现飞机Player的左、右移动,因此只需要在3D矢量值中设置x的变量,其他2个值保持为0。
在实现沿X变量轴的左、右移动时,为了检测游戏玩家是否按下键盘左、右键,设置了Input.GetAxis("Horizontal")。如果按下了键盘左键,则Input.GetAxis("Horizontal")的值为-1;如果按下了键盘右键,则Input.GetAxis("Horizontal")的值为1。
通过Time.deltaTime,获得每帧之间的时间数值,默认情况下大约为0.02秒。
在图2-46中,选择PlayerController代码文件,拖放到层次Hierarchy窗格中的Player对象之上,如果代码没有编译错误,则可以成功拖放,并在右下角出现PlayerController代码组件;如果代码存在编译错误,不能成功拖放,则需要修改错误代码直到编译成功。
![](https://epubservercos.yuewen.com/E586E6/11989104003033406/epubprivate/OEBPS/Images/figure_0049_0001.jpg?sign=1738858764-8lHvekZGHcYbSnXTcIb83FAiNExd79EI-0-5a3bab862a26ffdeebbf1c7b07b1e79a)
图2-46 拖放PlayerController.cs文件
这里需要说明的是,初学者常常多次重复拖放相同代码,在图2-47中,已经拖放了2次PlayerController代码;单击代码右边的齿轮按钮,在出现的快捷菜单中选择“Remove Com-ponent”命令,即可删除多余的代码,如图2-48所示。
![](https://epubservercos.yuewen.com/E586E6/11989104003033406/epubprivate/OEBPS/Images/figure_0050_0001.jpg?sign=1738858764-6XjOuNgwdSgXkmxUInmY0sm9auUUwAyx-0-85d01e42e52e555478a2e2ed957ce641)
图2-47 重复的PlayerController.cs文件
![](https://epubservercos.yuewen.com/E586E6/11989104003033406/epubprivate/OEBPS/Images/figure_0050_0002.jpg?sign=1738858764-07F9dhcm5jnIbqgyC5HDtYq3wpiiD7Nd-0-00df7129b3005b515778ba358f008fdc)
图2-48 删除多余的PlayerController.cs文件
对于JavaScript开发者来说,在图2-44中,双击playerController文件,Unity3D打开如图2-49所示的的代码编辑界面。
![](https://epubservercos.yuewen.com/E586E6/11989104003033406/epubprivate/OEBPS/Images/figure_0050_0003.jpg?sign=1738858764-EgV3Yev1BNIQD6cgx3Y1PcpHrFD4G6o5-0-fb91d35403e7f629622154c98a8fe9d4)
图2-49 JavaScript代码编辑界面
在图2-49中书写相关代码,playerController的JavaScript代码文件见代码2-2。
代码2-2 playerController的JavaScript代码
1: function Update() 2: { 3: transform.Translate( Input.GetAxis("Horizontal")*Time.deltaTime,0,0); 4: }
在上述JavaScript代码中,开发者需要在第1行到第4行之间的Update()中实现相关代码,以便Unity3D逐帧运行Update()中的相关游戏业务逻辑代码。
在第3行中,通过transform对象获得执行该代码的游戏对象Player,然后通过transform对象的Translate方法,实现Player的移动。
在Translate方法中,需要输入一个3D的矢量值,由于只需要实现飞机Player的左、右移动,因此只需要在3D矢量值中设置x的变量,其他2个值保持为0。
在实现沿x变量轴的左、右移动时,为了检测游戏玩家是否按下键盘左、右键,设置了Input.GetAxis("Horizontal")。如果按下了键盘左键,则Input.GetAxis("Horizontal")的值为-1;如果按下了键盘右键,则Input.GetAxis("Horizontal")的值为1。
通过Time.deltaTime,获得每帧之间的时间数值,默认情况下大约为0.02秒。
在图2-50中,选择playerController代码文件,拖放到层次Hierarchy窗格中的Player对象之上,如果代码没有编译错误,则可以成功拖放,并在右下角出现playerController代码组件;如果代码存在编译错误,不能成功拖放,则需要修改错误代码直到编译成功。
![](https://epubservercos.yuewen.com/E586E6/11989104003033406/epubprivate/OEBPS/Images/figure_0051_0001.jpg?sign=1738858764-vPlnTc29QCNqrImNot08GBrGVJF3zfFI-0-d2bf61122cbae4f22b1e465007b168ff)
图2-50 拖放playerController.js文件
这里需要说明的是,初学者常常多次重复拖放相同代码,在图2-51中,已经拖放了2次playerController代码;单击代码右边的齿轮按钮,在出现的快捷菜单中选择 “Remove Component”命令,即可删除多余的代码,如图2-52所示。
![](https://epubservercos.yuewen.com/E586E6/11989104003033406/epubprivate/OEBPS/Images/figure_0052_0001.jpg?sign=1738858764-9pQLpiQbh7C6LtjfvfxtCQSFoarObuQ7-0-ae9a6da7066dd73a10b9790f5db128eb)
图2-51 重复的playerController.js文件
![](https://epubservercos.yuewen.com/E586E6/11989104003033406/epubprivate/OEBPS/Images/figure_0052_0002.jpg?sign=1738858764-7RyYunqm9gM7lbCDP9t4U0vHKGPF3j1x-0-5a7fec6ba7a23f7d38de1e972d5550d7)
图2-52 删除多余的playerController.js文件
单击Unity3D中的运行按钮,运行游戏,按下键盘左、右键,此时就会实现飞机移动。
但是左、右移动飞机的速度是不可以调整的,不利于游戏的调试,这里需要添加一个移动的速度变量speed。
对于C#开发者来说,添加速度变量speed之后,PlayerController的C#代码文件,见代码2-3。
代码2-3 PlayerController的C#代码
1: using UnityEngine; 2: using System.Collections; 3: 4: public class PlayerController: MonoBehaviour 5: { 6: public float speed=2.0f; 7: void Update() 8: { 9: transform.Translate(speed* Input.GetAxis("Horizontal")*Time.deltaTime,0,0); 10: } 11: }
在上述C#代码中,在第6行添加了一个速度变量speed,这里定义的speed变量的类型为public,对于公有属性变量speed,可以在Unity3D中的检视器中显示,方便开发者实时设置变量调试,如图2-53所示。
![](https://epubservercos.yuewen.com/E586E6/11989104003033406/epubprivate/OEBPS/Images/figure_0052_0003.jpg?sign=1738858764-6llBbPG3vZj2LPdLyoR3xoJ2qHgPpxQw-0-d2fc068b516d2491a6c97ed3d9da5dbe)
图2-53 公有属性变量speed
然后在第9行,根据添加的速度变量,实现真正的速度乘以时间等于移动的距离。
对于JavaScript开发者来说,添加速度变量speed之后,playerController的JavaScript代码文件,见代码2-4。
代码2-4 playerController的JavaScript代码
1: var speed:float=2.0f; 2: function Update() 3: { 4: transform.Translate(speed* Input.GetAxis("Horizontal")*Time.deltaTime,0,0); 5: }
在上述JavaScript代码中,在第1行添加了一个速度变量speed,这里定义的speed变量的类型为public,对于公有属性变量speed,可以在Unity3D中的检视器中显示,方便开发者实时设置变量调试,如图2-54所示。
![](https://epubservercos.yuewen.com/E586E6/11989104003033406/epubprivate/OEBPS/Images/figure_0053_0001.jpg?sign=1738858764-s29Fd6CARUoNhtHo2maIXUQvQoMyhq51-0-4d85ba347b3c38aa383553d6c81faf09)
图2-54 公有属性变量speed
然后在第4行,根据添加的速度变量,实现真正的速度乘以时间等于移动的距离。
再次单击Unity3D中的运行按钮,运行游戏,选择合适的speed变量值,按下键盘左、右键,此时就会实现飞机的合适移动。
2.循环左、右移动飞机Player
在上一节中,已经可以实现飞机的左、右移动,但是一旦飞机超出屏幕范围,则飞机再也看不见了。
下面实现一旦飞机超出屏幕左边,则飞机从右边屏幕出来;一旦飞机超出屏幕右边,则飞机从左边屏幕出来,实现所谓的左、右循环移动。
首先设置游戏输出界面的大小,以便在游戏场景中设置相关与界面有关的参数,如什么时候超出屏幕范围等。
在游戏Game窗格中单击Free Aspect下拉菜单,选择“Standalone (800×600)”,如图2-55所示,就会设置Game窗格的输出界面大小为800×600,如图2-56所示。
![](https://epubservercos.yuewen.com/E586E6/11989104003033406/epubprivate/OEBPS/Images/figure_0053_0002.jpg?sign=1738858764-AEwefcfk4vwtZBB69jFQNTJ7Ty1s5qaM-0-63fd4d5dcea71032ae3507dd33ada702)
图2-55 设置分辨率
![](https://epubservercos.yuewen.com/E586E6/11989104003033406/epubprivate/OEBPS/Images/figure_0053_0003.jpg?sign=1738858764-dwzEI5cqURnq1Q7gsEDTVLQdags4V4cx-0-85b1349973a3e65c868f8cad236a868f)
图2-56 设置游戏界面大小
为寻找飞机移动的左边边界和右边边界,在监视器中调整X轴的数值,当飞机刚刚消失之时,此时X轴的边界数值设定为-3.2和3.2,分别如图2-57和2-58所示。
![](https://epubservercos.yuewen.com/E586E6/11989104003033406/epubprivate/OEBPS/Images/figure_0054_0001.jpg?sign=1738858764-KWi2vVsXFv5sfYiBNqQczhnxI7MIvg9D-0-85545df887e843c3eb605c67f54747f4)
图2-57 寻找飞机移动的左边边界
![](https://epubservercos.yuewen.com/E586E6/11989104003033406/epubprivate/OEBPS/Images/figure_0054_0002.jpg?sign=1738858764-HAIbvkdljW4eeGwBjvtjdNPptIadGeQE-0-fb5388cdb4fd3c82188f6f4ba87303d5)
图2-58 寻找飞机移动的右边边界
对于C#开发者来说,为实现循环左、右移动飞机,PlayerController的C#代码文件,见代码2-5。
代码2-5 PlayerController的C#代码
1: using UnityEngine; 2: using System.Collections; 3: 4: public class PlayerController: MonoBehaviour 5: { 6: public float speed=2.0f; 7: 8: void Update() 9: { 10: if(transform.position.x < 3.2f && transform.position.x>-3.2f) 1: transform.Translate( speed*Input.GetAxis("Horizontal")*Time.deltaTime,0,0); 12: 13: if(transform.position.x<=-3.2f) 4: transform.position=new Vector3(3.1f, transform.position.y, transform.position.z); 15: 16: if(transform.position.x>=3.2f) 7: transform.position=new Vector3(-3.1f, transform.position.y, transform.position.z); 18: 19: } 20: }
在上述C#代码中,第10行判断飞机如果在屏幕之内,则执行原有的第11行飞机移动的代码;第13行如果飞机处于左边边界,则第14行代码将飞机设置为右边的边界位置;第16行如果飞机处于右边边界,则第17行代码将飞机设置为左边的边界位置。
这里需要说明的是,在C#中设置飞机的位置时,需要使用14行的方法,而不能直接设置其中的一个X值,与后面所述的JavaScript代码是不一样的。
对于JavaScript开发者来说,为实现循环左、右移动飞机,playerController.js的JavaScript代码文件见代码2-6。
代码2-6 playerController的JavaScript代码
1: var speed:float=2.0f; 2: 3: function Update() 4: { 5: if(transform.position.x>-3.2f && transform.position.x<3.2f) 6: transform.Translate( speed*Input.GetAxis("Horizontal")*Time.deltaTime,0,0); 7: 8: if(transform.position.x<=-3.2f) 9: transform.position.x=3.1f; 10: 11: if(transform.position.x>=3.2f) 12: transform.position.x=-3.1f; 13: }
在上述JavaScript代码中,第5行判断飞机如果在屏幕之内,则执行原有的第6行飞机移动的代码;第8行如果飞机处于左边边界,则第9行代码将飞机设置为右边的边界位置;第11行如果飞机处于右边边界,则第12行代码将飞机设置为左边的边界位置。
此时单击Unity3D中的运行按钮,运行游戏,选择合适的speed变量值,按下键盘左、右键,就会实现飞机的左、右循环移动。