查看原文
其他

Unity教程|3D无尽跑酷游戏(下)

2016-10-26 Unity官方 Unity官方平台

昨天为大家分享了使用Unity创建3D无尽跑酷游戏的上半部分,介绍了两种类型的跑酷游戏可以共用的一些类,今天将继续分享两种关卡需要单独实现的内容。


请点击[阅读原文]下载示例工程及资源文件,并查看所有代码。


Straight Paths Level
层级结构列表中的游戏对象:

Straight Paths Level中游戏对象的层级结构 

所有的路径都是通过预制件(见上图蓝色的WideStraightPath)来复制的,直线型道路的路径要比旋转型道路更宽。


为了节省内存资源,游戏不会在一开始就生成所有路径。实际上,游戏需要生成N+1条路径,N是当前Max所在的路径位置。可以利用一个简单的碰撞器BoxCollider,当Max与它发生碰撞, 则通过PathSpawnCollider脚本生成新路径。在直线型道路的关卡中,新生成的路径位于“NewPathSpawn”坐标,这个坐标就是当前路径的终点。


当玩家与PathSpawnCollider发生碰撞时,在NewPathSpawn位置生成新路径


NewPathSpawn的位置就是新路径的生成点 Character游戏对象下包含相机和Max模型,此外还有Character Controller 组件和CharacterSidewaysMovement脚本。通过该组件和脚本的控制,相机会始终保持在Max上方的位置,这是第三人称视角游戏中的常见角色控制方式。 Canvas包含两个文本对象。Directional Light就是很简单的平行光光照,ScriptHolder对象包含了本教程上半部分介绍的GameManager单例脚本。 
PathSpawnCollider类
此脚本适用于两种关卡,主要功能是根据Max当前奔跑位置来生成下一段路径。

 

脚本首先设置了几个公共变量,可以在Unity编辑器中设置。
  • PositionY:用于将RedBorder放置到正确的Y轴位置。

  • 数组PathSpawnPoints:用于保存下一段路径及边界的生成坐标。在“直线型道路”关卡中,数组内只有一个元素。但“旋转型道路“关卡中,该数组需要3个元素,其中一个是新路径的位置,另外两个是RedBorder障碍物(Max一旦碰撞到它,则游戏失败)。

  • Path:物体包含路径预制件。

  • 数组DangerousBorder:包含了用于“旋转型道路”关卡的RedBorder预制件,在“直线型道路”关卡中为null。


Stuff Spawner类Stuff Spawner脚本用于生成糖果、障碍物等游戏道具,两个关卡均有用到。首先声明一些可以在Unity编辑器中设置的公共变量。
  • StuffSpawnPoints:包含所有要被实例化物体的位置(糖果或者障碍物)。

  • 数组Bonus:包含所有的糖果预制件。

  • 数组Obstacles:中包含所有的障碍物预制件。

  • RandomX:该变量只有在“直线型道路”关卡中才会是true。它会随机在X轴的位置([minX, maxX]之间)生成各类糖果和障碍物,以显得每段路径都不一样。


CharacterSidewaysMovement类

该脚本仅用于在“直线型道路”关卡中移动Max。Max带有CharacterController组件。如果想了解如何对带有CharacterController组件的游戏对象进行移动控制,请查阅Unity文档。


此外,在Start中设置moveDirection向量,用于帮助Max以给定的速度直线前进。然后为组件的相关变量设置正确的值,并更改游戏状态以开始游戏。


Update方法的最后一部分在Max死亡时调用,即Dead状态。当Max死亡,系统会将AnimationStarted参数设置成false,并提示玩家点击屏幕重新开始游戏。


如果有兴趣可以通过点击[阅读原文]查看更为详细的解释.

 
Rotated path关卡
 “旋转型道路”关卡与“直线型道路”关卡有些相似,但路径的预制件不一样。对比“直线型道路” 关卡,“旋转型道路”关卡中包含了更多的NewPathSpawns,以及一个SwipeCollider。

Rotated path关卡的层级结构

PathSpawnCollider用作生成下一段路径和RedBorder预制件的触发器。SwipeCollider是唯一允许玩家进行滑动操作的地方。SpawnPoints就是糖果及障碍物的生成点:



 当Max进入PathSpawnCollider时,从数组NewPathSpawn的3个位置中随机选择一个位置,实例化一段新的路径。



NewPathSpawnPoint左边

 


NewPathSpawnPoint右边 


NewPathSpawnPoint前方 在这三个位置中随机选择一个作为下一段路径的起点,并在其它两个位置生成RedBorder障碍物。
 
Swipe Collider类

在“旋转型道路”关卡中,当玩家位于路径中途时不允许滑动,只有到达某个特定空间才可以通过滑动让Max转向。可以在场景中放置一个隐形碰撞体Swipe Collider,当Max与Swipe Collider对象进行碰撞时,玩家才能进行滑动动作。


SwipeCollider脚本只用于设置GameManager对象的公共变量,该变量控制Max是否可以左右滑动。


CharacterRotateMovement
该脚本与之前“直线型道路”关卡中的CharacterSidewaysMovement脚本非常相似,主要区别在于DetectJumpOrSwipeLeftRight方法,游戏通过Quaternion.AngleAxis来实现Max的转向。


代码里没有使用OOP的继承来创建所有的移动类,是因为这里涉及的移动比较简单。如果您游戏的移动机制比较复杂,建议使用继承会更加便于代码管理。 
总结
以上示例虽然包含了3D无尽模式跑酷游戏的基本机制,但也还有一些可以继续改善的地方。例如,加入对象池、增加关卡难度、完善Max的死亡动画动作等,希望大家可以自行发挥。 点击[阅读原文]即可下载示例工程。关于本教程如有任何疑问,也请访问Unity官方中文社区提问。


更多Unity实例教程

Unity教程|3D无尽跑酷游戏(上)

制作一款3D射击游戏(上)

制作一款3D射击游戏(下)

简单两步使用Unity制作ZigZag游戏

为非程序员打造的Unity游戏框架


Unity官方活动




点击“阅读原文”立即下载示例工程

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存