APP下载

基于Unity3D的VR射击游戏的研究与实现

2019-12-02刘雨嘉杨键冯梦雨四川大学锦城学院计算机与软件学院

数码世界 2019年3期
关键词:羊圈狼群牧羊人

刘雨嘉 杨键 冯梦雨 四川大学锦城学院 计算机与软件学院

1 引言

近年来,随着计算机图形学、多媒体信息技术和计算机软硬件的快速发展,虚拟现实技术逐渐在军事、教育、游戏、建筑、医疗、工业设计等多个领域广泛应用,越来越多的人们愿意带上VR设备来体验虚拟现实带来的全新体验。本文介绍了利用unity3d游戏引擎开发的一款休闲射击类游戏。

2 游戏分析

此款射击游戏的玩法规则是羊群从地图的一端向着地图的另一端的羊圈慢慢运动,期间会有狼从山中跑出来攻击羊群,牧羊人(第一视角)则会对攻击羊群的狼进行设计,一次射击未将狼击倒,狼则会转向攻击牧羊人,牧羊人可通过瞬移进行躲避。羊群在进入羊圈之

前被狼全部吃掉或牧羊人被狼击中或者游戏倒计时为零则游戏结束。要达到以上内容,需从这几方面着手:1.地形;2.羊群;3.狼群;4.第一游戏视角(牧羊人)。下面分别介绍:

地形:游戏设计要控制狼从出生点开始,狼群会向着羊群的方向运动,这就要求狼群在寻路的过程中需要改变狼群原有的最短路线最好经过牧羊人的初始位置,牧羊人看见狼群从而进行射击,从而达到消灭狼群的目的。

羊群:在草原的一定范围内随机生成,先在草地上逗留一会或吃草或环顾四周后向着羊圈运动,这期间就可能会受到狼群攻击。

狼群:在山中的三个随机位置生成,生成后会向着羊群追赶,并攻击。

第一游戏视角(即牧羊人):通过手柄控制枪支进行射击,保护羊群,驱赶狼群。

3 游戏设计

本次设计主要体现在牧羊人、狼追赶羊、羊群、牧羊人与狼群的交互以及UI 界面包括倒计时以及重新开始的设计上。 游戏开始便进入游戏场景,牧羊人为第一视角,倒计时开始,游戏时长可以选择。

倒计时结束后,所有狼群和羊群停止动作,羊圈处出现重新开始字样,可枪击中间的小羊图案进行重新开始。游戏过程中,羊群向着羊圈慢慢移动,狼群从山中三处随机产生并向着狼群运动,在距离羊群一定距离时发起攻击。牧羊人可在发现狼群时向狼群发起攻击。羊群中的所有羊死亡即游戏结束并游戏任务失败或者倒计时结束也即游戏结束。

整个游戏分为牧羊人,羊群,狼群三大模块。

4 游戏实现

游戏的场景设定是在一个四面环山的草原上。在场景搭建中包括牧羊人居住的帐篷,帐篷中取暖的火焰,羊圈的栅栏, 望塔等场景中的基本建筑。其中火焰是采用unity中的粒子效果实现的,栅栏通过3dsmax建模完成。

4.1 狼群

狼群在整个游戏中的主要任务是向羊群发起攻击;

首先涉及到寻找羊的过程:

1.选中地形Terrain,在Inspector视图中名称右侧的Static处选择Navigation Static;

2.烘培地形:(unity for Mac)Window->Navigation,进入Navigation界面中的Object选项,勾选Navigation Static。在进入Bake选项,点击Bake,现在开始烘培地形。

3.在狼的预制体拖入Hierarchy视图中,选中狼的预制体添加Nav Mesh Agent组件;

4.需要为狼添加动画控制器:

5.创建一个动画控制器命名为WolfMoving;

6.双击进入动画控制器,找到动画“run”,拖入动画控制器编辑区中,自动Entry会指向“idle1”,表示狼的初始动作为奔跑的“run”,即狼群一开始生成就回开始跑向羊群。

7.狼群如果在奔跑过程当中遇到羊群,会发起攻击。所以需要将动画“runBite”拖入动画控制器编辑区。

8.狼群也不总是在奔跑,也可以速度变慢停下来四处走动。所以需要将动画“walk”拖入动画控制器编辑区。

9.狼群还会停下来观察四周,查看是否适合进攻,将动画“idleLookAround”拖入动画控制器编辑区。

10.狼群收到牧羊人的枪击会死亡,所以需要将动画“death”,拖入动画控制器编辑区。

11.设置不同的状态之间的转换条件:

从“run”到“runBite”:控制bool变量Attack为真,取消勾选Has Exit Time选项;从“runBite”回到“run”:bool变量Attack为假,取消勾选Has Exit Time选项;

从“Any State”到“death”:设置Trriger条件Death,不勾选Has Exit Time选项;

12.编写脚本:

其中主要的部分

一是在Start()函数中获取游戏对象涉及的游戏组件:

nav = GetComponent<NavMeshAgent>();// 获取寻路组件

ani = GetComponent<Animator>();// 获取动画控制器组件

以及获取狼群寻路的目标的位置:

target = GameObject.FindGameObjectWithTag("Sheep").transform;//狼寻路的目标为标签为“Sheep”的游戏对象

设置Update (),开始寻路,寻路目标为target的位置即羊群的位置:

nav.SetDestination(target.position);

Unity中设置:

1.因为需要在几个不同的位置生成狼群,先创建一个Perfabs文件夹,将Hierarchy视图中的狼拖入该文件夹再删除Hierarchy视图中的狼;

2.创建三个空物体分别命名为WolfManager、Wolf1、Wolf2;

3.编写脚本

实现逻辑为:使用一个函数由于生成狼的预制体,然后每隔一段时间重复调用这个函数

public float spawnTime = 3f;// 延迟时间

public GameObject wolf;// 狼的预制体

public Transform[] spawnPoints;

在Start()函数中实现重复调用生成函数:

InvokeRepeating("Spawn",2f, spawnTime);//2 秒后开始调用Spawn()函数,每spawnTime即3秒后再次调用

编写Spawn()函数即生成函数:

intspawnPointIndex = Random.Range(0, spawnPoints.Length);

Instantiate(wolf, spawnPoints[spawnPointIndex].position,spawnPoints[spawnPointIndex].rotation);

4.有两个生成点,需要拖入两个脚本进入WolfManager中,每个脚本需要拖入,狼的预制体以及设置延迟时间,将Spawn Points数值设为1之后拖入生成位置(transform)即之前设置的Wolf1或Wolf2。

4.2 牧羊人

牧羊人在整个游戏里的作用是保护羊群击杀狼群。牧羊人为游戏的第一视角利用的是SteamVR中的CameraRig实现的。在CameraRig中的Controller(right)下用枪的模型替换Model;

大多数时间牧羊人不会受到狼群攻击,因为牧羊人可以在整个场景中瞬移,速度较快。关于在场景中的瞬移需要用到SteamVR和VRTK的集成。

4.3 羊群

羊群在这个游戏中属于被牧羊人保护,受到狼群追赶,最终目的是回到羊圈里。为了游戏的真实性,实现在草原上会放置十几个羊的预制体,让玩家能看到羊在草原上吃草的情形,

首先需要为其添加动画控制器,其设置动画控制器过程与狼类似,这里不再赘述。

4.4 游戏的结束以及重新开始

这一部分即时游戏的UI部分,是关于游戏结束与游戏重新开始的设置:

1.在Unity中的Hierarchy视图中创建一个空物体重命名为GameManager,用于管理整个UI;

2.选中需要显示倒计时的位置( 望塔),右键单击->UI->Canvas,在UI下创建一个空物体命名为restartPos即重新开始图样出现的位置,重置其transform。在Canvas下分别创建time、timetext、score、scoretext并设置;

3.在GameManager脚本中:

设置Unity初始值:包括分数,记录剩余的时间,重启游戏图标产生的位置,判断游戏是否结束等参数。

在Start()中调用ini()函数

编写包括增加分数函数,初始化游戏函数,游戏结束函数,重新计数函数,重新开始游戏函数。

最后设置FixedUpdate()中通过判断IsGameOver是否为真,如果为真直接跳出函数,如果为假,调用onGameOver()函数。

4.将GameManager脚 本 拖 入Hierarchy视 图 中 的GameManager上,将 time、timetext、score、scoretext拖入对应的文件框中。

5 结束语

VR技术是仿真技术的一个重要方向,是仿真技术与计算机图形学人机接口技术多媒体技术传感技术网络技术等多种技术的集合,是一门富有挑战性的交叉技术前沿学科和研究领域。本文介绍了基于Unity3D的VR射击游戏的研究与开发过程,包括基于Unity的场景设置和脚本的挂载。感知是指理想的VR应该具有一切人所具有的感知。此射击游戏利用了人的视觉的、运动等感知,是游戏更具真实感。但是这款游戏还有待改进,未来工作是优化游戏代码和模型,希望能给玩家带来更加真实的游戏体验。

猜你喜欢

羊圈狼群牧羊人
母性的力量
去可可托海,做一个牧羊人
主动出击
牧羊人和狼
立体羊圈
亡羊补牢
重返·狼群真实版“与狼共舞”
农庄里的羊圈
“6个羊圈”
牧羊人