本小节的目的是制作Tank的生命条,也就是如图8-106所示的形式,有一圈绿色生命条包围在坦克的周围。图8-115TankExplosion预件设置完成以上改动后,接下来要思考一个问题,坦克的生命条UI界面有了,但还需要让它动态地减少,即在坦克受到伤害的时候会扣除生命值,那么该怎么实现呢?......
2023-10-17
本小节的目标是创建一个管理脚本,统一管理该游戏场景中的两辆坦克,并且添加输赢的游戏逻辑,让游戏有始有终。
在上一节中,我们把根目录下的Tank删除了,需要在游戏的过程中动态生成两个Tank,而不是一开始就设置好。因此我们需要两个Tank的出生点。在Hierarchy下新建两个空对象,分别命名为SpawnPoint1和SpawnPoion2。
选中SpawnPoint1,做以下修改(见图8-126)。
选中SpawnPoint2,做以下修改(见图8-127)。
图8-126 创建空对象1
图8-127 创建空对象2
接着,在Hierarchy层级下新建一个Canvas(GameObject→UI→Canvas),重命名为MessageCanvas。接着,在Scene View中单击2D模式,如图8-128所示。
图8-128 新建Canvas
选中MessageCanvas,右键新建一个Text,让其成为MessageCanvas的子对象,选中Text对象,修改它的数据,如图8-129所示。
下一步,在Text内新建一个组件:Shadow,为Text添加阴影效果(见图8-130)。
图8-129 Text对象设置
图8-130 为Text添加阴影
接着,取消刚才设置的2D视图模式。
选中CameraRig,单击Edit→Frame Selected按钮,在CameraRig的脚本组件那里,之前设置了m_Targets为已经被删除的Tank,所以我们要把该数组的长度设置为0,并按回车确认。再打开CameraControl脚本来编辑:这里只需要把之前提及的“HideInInspector”的注释去掉即可,也就是说隐藏掉该公共变量。
下面就来创建我们的游戏管理者,在Hierarchy层级创建一个空对象,命名为GameManager,在/Scripts/Managers文件夹内找到GameManager脚本,把它拖拽到GameManager对象内。先初始化它的几个公共变量,如图8-131所示。
图8-131 GameManager公共变量初始化
接下来先整理一下我们的游戏逻辑。
(1)先从游戏的整个流程来梳理(见图8-132)。从官方的教程中可以知道,Game Manager充当一个管理全局的角色,首先它初始化的过程中,会在出生点生成两个坦克供玩家控制,并且把摄像机的目标设置为该两辆坦克,由此完成初始化。接着是正常的游戏流程,这里涉及游戏的输赢判定,使用的是分回合的形式,每一回合获胜则获得一分,经过若干回合后,总分最高者获胜。每一回合结束之后,会回到初始化过程,重新生成坦克。具体到每一个回合上,坦克的控制就交给Tank Manager来控制。
图8-132 游戏流程(1)
从图8-133可以看出,Tank Manager控制了坦克的移动和射击的脚本以及UI的展示。
(2)从游戏者的角度来梳理(见图8-134)。GameManager可以分为若干个Tank Manager,Game Manager负责管理每个Tank Manager,而具体的游戏坦克的行为则交给每一个Tank Manager负责。这里就实现了解耦的作用,假如以后需要拓展游戏功能,如增加多个玩家,那么只需要修改Game Manager就可以了。
图8-133 游戏流程(2)
(www.chuimin.cn)
图8-134 游戏流程(3)
接着,我们打开GameManager脚本,对它进行完善与编辑。
编辑完毕之后,再来看看TankManager这个脚本,该文件也在Manager文件夹内,但是不需要把它拖拽到任何游戏对象上。因为它由GameManager来管理。
经过上一小节的测试后,游戏已经算是高度完成了,最后这一小节还需要完善一下音效效果。
首先,右键单击AudioMixer文件夹,新建一个Audio Mixer,命名为MainMix。双击打开该文件(见图8-135)。
图8-135 新建Audio Mixer文件
确保左上角选中的是MainMix,然后在Groups选项下单击“+”来创建三个子对象,并分别命名为Music、SFX、Driving(如果无法重命名,则单击开始游戏再结束游戏)。接着对三个子对象的属性进行更改:
(1)选 中Music,把Attenuation选 择 为-12,并 且 通 过“Add...”按钮新建一个Duck Volume。
(2)选中SFX,新建一个Send,设置Receive为Music\Duck Volume。
(3)选中Driving,把Attenuation选择为-25。
(4)重新选择Music,在Inspectior界面做更改,如图8-136所示。
然后,在Prefabs文件夹内找到Tank,展开第一个Audio Source,把Output选择为Driving(见图8-137)。
展开第二个Audio Source,把Output选择为SFX(见图8-138)。
在Prefabs文件夹内找到Shell,展开,选中ShellExplosion,把Audio Source的Output选择为SFX。在Prefabs文件夹找到TankExplosion,把Audio Source的Output选择为SFX。在Hierarchy选择GameManager,新建Audio Source组件,音效选择为BackgroundMusic,Output选择为Music。选择Loop项。
图8-136 Inspectior界面修改
图8-137 Audio Source的Output设置
图8-138 Output设置
最后,保存场景,运行游戏。整个Tanks游戏的开发流程到此完毕。
有关虚拟现实理论基础与应用开发实践的文章
本小节的目的是制作Tank的生命条,也就是如图8-106所示的形式,有一圈绿色生命条包围在坦克的周围。图8-115TankExplosion预件设置完成以上改动后,接下来要思考一个问题,坦克的生命条UI界面有了,但还需要让它动态地减少,即在坦克受到伤害的时候会扣除生命值,那么该怎么实现呢?......
2023-10-17
1)案例简述这个案例实现一个非常简单的拾取宝物游戏,主角是一个小球,玩家通过键盘控制小球拾取全部宝物。这是因为,记录分数的text只需要更改其显示内容,即只对它的text组件进行操作,因此只需要获得它的text组件;而winText不同,我们需要它在游戏胜利时显示出来,也就是控制一整个对象,因此需要获得整一个GameObject。......
2023-10-17
尝试添加一个刚体到刚创建的物体上。选择该物体并从菜单中选择Component→physics→Rigidbody。它们使用一个粒子发射器,粒子动画和粒子渲染器来创建一组移动的粒子。音频剪辑是一个引用属性。移除组件如果你想移除一个组件,在检视面板的头部使用option-或右击然后选择移除组件。例如,如果你想访问变换组件的变换功能,你只需要使用transform.Translate()或gameObject.transform.Translate()。使用GetComponent()有许多组件不能成为一个游戏物体类的成员。通过调用GetComponent并存储一个引用到结果中。......
2023-10-17
图9-71创建游戏管理器的逻辑脚本游戏胜负逻辑是与GameManager等脚本关联起来的。图9-76添加Look At Target组件运行游戏,发现收集物状态UI已经可以正常显示,面向摄像机了。图9-78添加Wall Mover组件图9-79组件关联在Scripts文件夹内右键Create→C# Script,重命名GoalZone,用于处理到达终点的逻辑。找到VR Win Panel→Exit Game Button上的Button组件,设置On Click事件调用为Game Manager UI→GameManager.ExitGame方法。图9-84设置完成的效果显示成功拾取到4个盾牌收集物到达GoalZone,也会弹出VR Win Panel的UI,可以进行一样的操作。......
2023-10-17
图8-177CameraFollow脚本offset是相机初始时与主角之间的距离,speed是相机移动的速度,target设置为public,待会直接拖动主角挂到这里。Lerp是插值的概念,简单来说就是使相机平滑地移动而不是瞬间移位。图8-178脚本挂到相机将游戏场景中的物体加入BoxColider。图8-179加入BoxColider单击Window→Navigation自动寻路组件,Unity只对静止的物体计算,选中所有的场景物体,选择static项。图8-183加入NavMeshAgent组件图8-184添加Player标签图8-185怪物出生点设置图8-186新建脚本EnemyManager将这个脚本挂在一个空物体上。......
2023-10-17
首先创建一个文件夹Animation用来存放GameController文件,在文件夹内右击新建一个Animator Controller。图8-163发现新Tab将PlayerController放到主角身上的Animator组件里面的Controller。图8-173加入函数到Update()图8-174主角移动,播放Move动画又一个bug出现,主角停下来时,还是播放Move动画,因为刚刚的Animator并没有设计从Move状态转为Idle状态的条件。图8-175主动停止,仍在播放Move动画isMoving设置false,再运行游戏,主角就正常的Move和Idle了。......
2023-10-17
对于场景创建及前期准备,首先新建一个工程,命名为Tanks,然后进入该工程,打开Asset Store,搜索Tanks,把素材下载下来并且导入当前的工程中,导入成功后,你的project列表应该如图8-84所示。在Unity右上角,把布局形式更改为2 by 3,并把“Project”标签拖拽到“Hierarchy”标签的下面,如图8-85所示。图8-85布局更改接下来,我们选中Directional Light,把它删除掉。下一步是添加游戏场景,在下载好的素材包里面,游戏场景已经创建好了,只需要把Prefabs文件夹下的LevelArt拖拽到Hierarchy下面即可。......
2023-10-17
移动VR一般受到一些设备的限制,操作方式比较有限。现在需要添加移动VR专属的角色控制脚本。运行游戏,检测移动VR的编辑器模拟模式。角色可以顺利跟随导航标识移动到目标位置。图9-121确定Mouse Control是否勾选图9-122检测移动VR的编辑器模拟模式在VRUIPanel中有这么一段代码:主要就是为了Cardboard而实现的Cardboard输入操作就是通过这个Input.GetTouch来实现的。......
2023-10-17
相关推荐