基于unity3d的手部模拟器的设计与实现_第1页
基于unity3d的手部模拟器的设计与实现_第2页
基于unity3d的手部模拟器的设计与实现_第3页
基于unity3d的手部模拟器的设计与实现_第4页
基于unity3d的手部模拟器的设计与实现_第5页
已阅读5页,还剩27页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

绪论选题的目的和意义游戏行业日益高涨,游戏硬件的更新换代,游戏的种类也越来越多,绝大部分游戏走向更加真实震撼的效果,如使命召唤系列等各种震撼的特效和超高真实度的人物模型。少数部分的游戏走向电竞这条道路,它们更加追求游戏的平衡性和团队合作性,更贴合大众。极为少数的一部分游戏却走向那种注重新奇玩法的道路,它们不追求极致的画质,甚至你能看见在Steam上有火柴人打架都售价50以上,这种游戏有着丰富的想象力。然而,这种游戏往往玩的是最开心的,不需要高配置的电脑,可以跟着朋友一起玩爆笑一整天。在这极少数游戏中就有一种仿真模拟类游戏,如造桥模拟器、卡车模拟器等等这种类型游戏能勾起玩家的兴趣,更能陷入其中。选择unity3d是因为可以让制作者更加轻松的创建玩家手部骨骼的动画、各种场景道具的三维模型。正因unity3d可以实现多平台,我们才可以在以后推出PC端、手机端等各种平台的游戏实现,让大众在各种平台体验。仿真模拟类游戏可以让人们在游戏中尽可能地真实的体验,而本款手部模拟器更加真实,细节到手的每一个骨骼每一个关节,真实的体验每一个场景,不需要长时间进行,并且有较高的娱乐性,非常适合大众在玩过各种大型游戏后放松一下。国内外研究现状仿模拟类游戏的重心是仿真。“仿”字代表着模仿模拟,根据真实世界而进行模仿,一切符合现实的构造,没有一点的虚构因素。而“真”字则是真实的世界,越高的仿真度能带来的效果就越有意义,对我们的生活给予帮助。相反的,仿真程度很低从而添加游戏乐趣则与模拟这个冲突,偏离这类型游戏的主题,得不偿失。现在市面上主要的类型是训练类模拟游戏。它对应着模拟。而训练类则是模拟类游戏里最多的。因为它门槛低,能够从生活中种种简单的活动中实现,例如垃圾分类、烹饪、画画等等。现在有不少的教育机构采用这种游戏让学生们对学习更加有动力。但是仿真度越高的则会变成一种训练器,体验这些游戏的就不是为了娱乐了。而实更深层度的提高某些技能的水平,但实际上两种都是一样的。模拟类的游戏好处已经收到许多用户的注意,有更多的游戏公司投资开发这类型的游戏。仿真模拟类游戏更加的贴近生活和现实。玩家在玩这类游戏的时候都会觉得是真实的,没有一丝异样,而且在游戏中发生的一切也是非常的生活性,仅有缺点就是不切实际的夸张,为了达到效果,某些小事情会被放大显得不太真实。仿真模拟类游戏的到来让全世界的人对游戏的看法发生改变。模拟游戏表明了游戏就是娱乐的这种说法是片面的,游戏是一把双刃的剑,有好的一面也有坏的一面,模拟类游戏正是可以让游戏与生活联系起来,相互的发挥各有的价值。论文组织结构 论文从最初构思来源于小学期的试用品,当时想做一个模拟类型的游戏,可是技术有限无法完成,现在结合了专业3D游戏开发资料,进行了一个仿真手部操作戏的设计制作,其中,具体介绍游戏的制作步骤,包括游戏的系统功能设计和一系列代码的编写。论文分为七章,各章节细节安排如下: 第一部分:绪论,主要讲述该毕业设计的制作背景、国内外对相关课题的研究现状和本设计的介绍; 第二部分:介绍了本文制作游戏使用的各类开发工具和Unity3D的介绍; 第三部分:详细介绍游戏的设计的基本思路;第四部分:游戏的功能实现; 第五部分:游戏的界面功能实现;  第六部分:运行游戏进行测试,打包封装; 第七部分:结论以及今后的改进。

开发工具介绍Unity3D游戏引擎Unity3D软件介绍Unity3D是一款面对用户开发的游戏引擎。它适用于2D和3D的游戏开发。它有着完美的跨平台系统。在PC端、安卓端和IOS端尤为显著。它适用于制作小类型的游戏,它轻巧、快捷、功能强大,有各种接口。它不仅仅是一个制作游戏的引擎,它还可以制作3D渲染场景图,也能搭载动画。它有着一个良好的互动,独特的编辑界面,简单方便,能够与Windows平台和MacOS平台上进行互动。它有着良好的视图分配,在制作过程中简洁分清设计者需要的编辑视图,还能自定义分布,符合各种开发者的需求。它拥有着自己各种脚本语言进行编辑的常用环境,识别市面上常见的语言,例如:C#、javascript等。API接口Unity3D拥有十分丰富的API接口,可以完成这种接口完成各种各样的需求。API是一种函数,预先定义的,可以帮助开发人员在不访问代码的情况下访问一组例程,还有了解内部的机制细节。在U3D里,有一个非常完整的一套API函数的库存,开发者可以实现该项目的初始阶段是为了方便这些功能,能检测每个模块的是否有触发响应、离开触发相应、调出数据等等。物理引擎在非特定游戏的基础上,物理效果是游戏开发的一大难点,也是游戏中关键的一部分,任何一款网络游戏的设计都需要一个符合实际物体特性的合理,这样才显得更加真实。U3D则有着一套几乎完美的物理引擎,可以是物体的色彩亮度、渲染、平行光、点光源、色彩亮度、正常映射等,游戏材料可以给我们带来真实的视觉效果,宛如身临其境。而在力的方面,U3D有着简洁简单的刚体编辑,只要不是过于困难的类型,我们只要改几项数据就可以完成一种真实的物理效果。Unity常用生命周期的函数Unity3D游戏引擎不像常规的程序直接在Main函数入口运行,而是在内部实现了自己的生命周期事件。通过对这些生命周期的事件进行写入,Unity内部就会不断地迭代这些生命周期函数。下面按照脚本的执行顺序介绍游戏中比较常用的Unity事件函数。Awake():当游戏对象被初始化的时候调用,无论该对象是否已被激活。Start():在Awake事件后调用,但只有被激活的时候才能够执行。Update():游戏中的帧事件,因为游戏大部分都是按帧率来执行逻辑的。FixedUpdate():游戏的固定帧事件,基本同Update(),但该事件可由开发者去控制执行频率。OnEnable():Start事件调用之后,只有被激活时将执行。OnDisable():当游戏研究对象被禁止通过激活的时候会调用。OnDestroy():当游戏对象被销毁时执行。Unity3D脚本将基本上是从基类继承MonoBehaviour。一般不继承于MonoBehavior的类会用自己来写出了一些重要工具类。通常来说,它在整个程序运行的过程中都是存在的,除非自己手动GC释放内存。GUI(图形用户界面)Ugui,本项目的UI层是用UGUI进行开发,GUI的意思是图形用户界面。而UGUI则是Unity的GUI系统的简称,UGUI能让开发者简单快捷的添加各种种类的界面部件,通过控件的创建同时实例化。使你用少量的代码创建一个功能齐全的基本框架。3DsMax软件3dsmax是一个以电脑操作系统为基础的三维动画渲染和三维对象制作的软件,是当代模型制作最常用的建模平台。它的前身是一个以dos操作系统为基础的3dstudio软件,软件的最初功能是制作游戏中的动画,到现在已经拓展到制作影视电影中的特效制作。C#开发语言C#是一种开发语言,是由微软公司开发并运行在.net

framework上,是一种面向对象的高级程序设计语言。它跟java类似即是一种语言也是一种工具。但它并不是跨平台的开发语言,由于mono的实现使得它能在Unity这种跨平台引擎上编写,它语法简单明了,能方便使用类库,在Unity上开发发C#为首要。VisualStudio2017VisualStudio2017也就是VS2017,它是由微软公司推出的开发环境,它有着最新的集成开发环境,也带来了更快地为Android、iOS和Windows创建移动应用。微软还在官网上强调了VisualStudio2017的其它主要方面的改进,声称可以为任意开发、任意app、任意平台提供“无与伦比的生产力”。它也支持各种数据库。游戏设计在模拟游戏中有很多种类型,游戏的名字就决定了游戏的核心侧重。这款游戏的侧重点是手,整个游戏最基本都要有一双可控制的手和一些可交互的物品。以下就讲述手和场景的如何设计。游戏总体设计我根据文献中学到基本流程[]。手部设计3.1.1手部的移动设计在手的移动上必须满足几个点,一是能比较简单的操作最好是通过鼠标前后左右平移的方法实现手的移动,但这样就会遇到一个问题,手如何上下提高和下降。鼠标不能高低移动,但鼠标上的按键很多,这里我选择用滚轮,我觉得滚轮的滚上滚下很适合手的上下升降。二者是移动的距离要比较精确,幅度要小。这里我选择检测鼠标XY轴的移动再乘一个速度,这个速度可控,可以达到比较精细的移动。如图3-1。图3-1控制手部移动的物体三是手的合理关节,人的手很复杂,它有各种骨头和筋,每个移动都要各个部位协调完成,在游戏中也不例外,在玩家移动手时,连接手掌后的手臂手肘也应该接连运动。在这种情况下很难通过代码方式限制角度。在Animator中则有一个方法,IK的方法,如图3-2。图3-2控制手部移动的物体在玩家控制物体移动的同时,手会有绑定骨骼似的旋转拉伸。当玩家控制的物体超过手所触及的距离,手也不会断开去跟随,而实在最大值附近停留。3.1.2手部的抓取设计在手的抓取上有几个必须的功能,一、是手手掌的握拳张开,能有单独的手指控制最好。在选择上,我觉得动画机的控制最好,能控制单独控制手指,所有手指弯曲就是握拳的效果。但是在这种方法不能准确与物体碰撞体交互,所以也准备了另外一种手的设计,运用ConfigurableJoint来控制各条手指的弯曲程度实现握拳张开,但是具体代码比较复杂,只能有简单的表现。二、手以掌心为基点,玩家通过手掌手指来抓取物体而不是用手肘夹着或者手的拨动。三、手的合理翻转抓取,在手的翻转上,有手腕的左右旋转上下翻转,都有着角度限制,而IK的方法则不能实现这种效果。在旋转上我限制了角度,让手的旋转和翻转都有一个固定的限度,这样手就不会穿模或者模型撕裂不正常。3.1.3抓取效果设计抓取效果是一个很难的点,它既与物理效果有关也与碰撞有关,如果单纯用刚体碰撞通过手指卡死物体实现抓取,这样没有精确的物理数据会导致被抓物体的莫名弹飞,从而实现不成抓取效果。与物体的碰撞,rigidbody很复杂,难以真实实现。我就让它简单化,让手抓取效果换成IK跟随目标切换,让本来控制手移动的移动Cube,在Collier碰撞加上鼠标点击下,目标转换成抓取的地方,那样简单又少bug,如图3-3.还有一种是用fixedjoint的方法,手指弯曲触碰到碰撞体的时候就会停止弯曲,并将触碰到的碰撞体与手指连接生产fixedjoint,松手的时候再删除fixedjoint,刚好有个能实现它项目例子。图3-3控制手部移动的物体场景设计3.2.1场景的选择在这款游戏里,玩法是玩家对手的理解和操作,不需要控制人物移动或者道具拾取,在场景的选择上应该以手的操作为重点,这里我选择了钓鱼场景和汽车场景,钓鱼场景需要玩家对鱼竿鱼饵控制,钓鱼需要玩家对鱼竿控制要求很高,要精准抓到鱼竿的底端,还要旋转角度正握,其次还要玩家抓鱼饵挂钩和钓鱼上船,能让玩家对手的操控熟悉。汽车场景的话更深一步的熟悉操控,汽车场景的重点是方向盘,玩家通过控制方向盘的旋转来控制车辆的左右行动,不仅仅是方向盘,还要玩家控制车辆的挡位。3.2.2钓鱼场景的设计在钓鱼的场景中,我更加注重玩家对鱼竿的控制,而不是钓多少鱼。对鱼竿的控制大致是对手的抓取要求更高,所以我选择了用碰撞来抓,考虑到物理结构的复杂,我查阅了各种资料,决定用fixedjoint物理连接来实现,用ConfigurableJoint来控制手的弯曲程度,通过方法让碰撞体接触到物体的碰撞体后停止弯曲,达到抓住的感觉,再用fixedjoint来连接接触位置和物体之间,鱼饵和鱼竿的鱼钩之间也需要玩家合理的操作平移旋转双手才能做到,所以我觉得钓鱼场景能体验该手的功能性。所用到的鱼饵和鱼竿如图3-4图3-4鱼竿和鱼饵3.2.3汽车场景的设计在汽车场景里,我更注重玩家左右手的合理搭配,左手该做的事情就是控制好方向盘,右手则是要换挡,再抓取方向盘。搭配很重要,汽车本身也大概根据现实的汽车,挡位打前只能走前,打后才能倒车。方向盘方面我根据方向盘的转动角度来改变车轮的转动角度,因为技术的问题,不能写到真实方向盘那样打满两圈多,而是180度为尽头打满。汽车系统有网上插件,只要改好几项参数再改代码就能实现手部控制汽车移动。鱼竿和汽车的设计3.3.1鱼竿的设计在钓鱼场景里关键的是钓鱼的鱼竿,鱼竿的基本功能要有杆体、钓鱼线和鱼钩,如果可以的话还能加上控制钓鱼线伸长缩短的轮子。考虑到精确游玩的问题,轮子没有添加,而实要玩家通过抬高钓鱼竿的方式来钓鱼。杆体上要有一个可以与玩家手接触碰撞的检测,可以让手握住抓的地方。单纯使用rigidbody不行,会因为刚体穿过而让鱼竿莫名击飞,这时我运用了网上手部关节的例子让碰撞的手指与物体进行连接,达到抓取不掉的效果。鱼线方面则是用网上带的绳子系统,经过调试,线已经比较接近能用的程度,可以达到不断不穿模的状态,但还是有点莫名的晃动。鱼钩则更简单,放一个可以与鱼饵和鱼交互的物体碰撞交互。3.3.2汽车的设计汽车场景里关键的是汽车,在这款游戏中有一个注意的点,就是不能让手部模拟器变成一个汽车模拟器,所以汽车的功能不能太精细,也不能太简陋。我保留了汽车的行驶功能,在行驶功能上添加了方向盘和自动杆的功能。方向盘是灵魂,玩家通过方向盘控制前轮实现转弯,通过自动杆实现前进倒退。如图3-5图3-5方向盘游戏界面设计场景1为菜单界面,菜单界面包括汽车场景开始,钓鱼场景开始和退出键,均使用UGUI制作。钓鱼场景、汽车场景开始按钮:用来进入钓鱼场景,即进入游戏主界面。当通过鼠标按下该按钮,就可以载入所要进行的游戏。玩家把鼠标移动到按钮上方或移出时,按钮会有相应的颜色状态变化。退出按钮:用来退出游戏。游戏操控设计手的操控有很多,例如五只手指的弯曲、手的移动和手腕部位的旋转。考虑到按键过多的问题,应该设计的简单一点,具体操控如下表3-6。表3-6游戏操控表按钮表现备注适用场景按键A食指弯曲点击或长按钓鱼场景按键S中指弯曲点击或长按钓鱼场景按键D无名指弯曲点击或长按钓鱼场景按键F尾指弯曲点击或长按钓鱼场景空格大拇指弯曲点击或长按钓鱼场景鼠标移动手的XZ轴移动滑动钓鱼场景/汽车场景滚轮手的Y轴移动滑动钓鱼场景/汽车场景右键+鼠标移动手腕的旋转右键长按滑动鼠标钓鱼场景中键+鼠标移动手腕的旋转中键长按滑动鼠标汽车场景按键W汽车前进长按汽车场景按键S汽车倒退长按汽车场景空格汽车刹车长按汽车场景游戏实现首这章讲的是如何实现这款游戏,通过上述的游戏设计,重点是手的实现,其次是场景有关的实现,下述重点描述的是是手的移动、抓取动画和抓取效果,其次描述的是场景的实现,包括其中鱼竿和汽车的实现。手部的实现导入两种手部模型首第一种用动画控制的手部模型,如图4-1,在游戏中体现的样子是图4-2,该模型是我从网上找的,手的操控逻辑是我自己写的,该角色模型上挂着动画控制脚本、左右手的旋转脚本、左右手的移动脚本和头部的跟随脚本。他的整条手臂会合理的进行移动,受骨骼的影响显得真实。手臂的移动主要以IK的方式进行移动调整,部分代码如下:public

Transform

Righttarget;

public

Transform

Lefttarget;

public

Animator

animator;

private

void

OnAnimatorIK(int

layerIndex)

{

//设置右手谷歌的权重,0-1,可自行改变查看效果

animator.SetIKPositionWeight(AvatarIKGoal.RightHand,

1f);

animator.SetIKRotationWeight(AvatarIKGoal.RightHand,

1f);

//设置右手骨骼的ik目标为胶囊体的坐标和旋转

animator.SetIKPosition(AvatarIKGoal.RightHand,

Righttarget.position);

animator.SetIKRotation(AvatarIKGoal.RightHand,

Righttarget.rotation);

//设置左手谷歌的权重,0-1,可自行改变查看效果

animator.SetIKPositionWeight(AvatarIKGoal.LeftHand,

1f);

animator.SetIKRotationWeight(AvatarIKGoal.LeftHand,

1f);

//设置左手骨骼的ik目标为胶囊体的坐标和旋转

animator.SetIKPosition(AvatarIKGoal.LeftHand,

Lefttarget.position);

animator.SetIKRotation(AvatarIKGoal.LeftHand,

Lefttarget.rotation);

}

手指手掌的弯曲则用动画控制,加入AvatarMask来限制部分部位进行动画,设置好骨骼权重使得整个过程合理。具体Animator如图4-1图4-1人物模型图4-2游戏效果第二种是在网上找的模拟器,他的好处是通过物理进行操控的,显得抓取物体会更加真实更加容易操作,不好地方是它的项目已经是很多年以前,代码已经弃用了使得运用上比较困难。游戏里如下图4-3,如图所示,他只有两条手臂,原理上可以转移到躯体上,但是过程比较复杂就没有转移,只能这样用着了。他的是用ConfigurableJoint来进行抓取物体。图4-3游戏效果两种手部移动的实现两种手是跟随物体移动,我们主要控制隐形的物体,让该物体进行移动或者旋转从而实现手的跟随移动旋转。个别手的代码如下:void

HandHorizontal()

{

//float

Ax

=

A.transform.position.x;

//float

Az

=

A.transform.position.z;

float

mouseX

=

Input.GetAxis("Mouse

X")

*

moveSpeed;

float

mouseY

=

Input.GetAxis("Mouse

Y")

*

moveSpeed;

Vector3

movent

=

new

Vector3(mouseX,

0,

mouseY);

transform.Translate(movent

*

moveSpeed

*

Time.deltaTime);

}

void

HandVertical()

{

float

Vertical

=

0.5f;

if

(Input.GetAxis("Mouse

ScrollWheel")

>

0)

{

Vector3

vertical

=

new

Vector3(0,

Vertical,

0);

transform.Translate(vertical

*

moveSpeed

*

Time.deltaTime);

}

//Zoom

in

if

(Input.GetAxis("Mouse

ScrollWheel")

<

0)

{

Vector3

vertical

=

new

Vector3(0,

-Vertical,

0);

transform.Translate(vertical

*

moveSpeed

*

Time.deltaTime);

}

}

void

Cushion()

{

float

Vertical

=

0.1f;

Vector3

vertical

=

new

Vector3(0,

-Vertical,

0);

transform.Translate(vertical

*

VerticalSpeed

*

Time.deltaTime);

return;

}

void

Rotate()

{

if

(Input.GetMouseButton(1))

{

float

mouseX

=

Input.GetAxis("Mouse

X")

*

moveSpeed;

Vector3

_movent

=

new

Vector3(mouseX,

0,

0);

rotate.transform.Rotate(_movent

*

Time.deltaTime

*

RotateSpeed);

}

途中我们用键盘左边的Shift键来切换左右手,玩家只能同时控制一只手移动。当正在控制任意一只手的时候,代码就会实时监控场景里的移动cube,通过检测鼠标的前后左右移动实现cube的前后左右的移动,让模型的手通过IK跟cube移动,从而实现手的移动效果。同理,手的上下升降为检测鼠标滑轮的值,判断手的升降。手腕翻转则是通过点击右键开始检测鼠标的前后左右滑动的值改变cube的翻转,在加上角度的限制,从而实现手腕的翻转。两种手部手指抓取动画的实现第一种手的抓取动画机Animator,因为考虑到开车操作问题,真实上用不到这么复杂,已经减去手指的单独行动,演变成只能握拳和展开。第二种手的抓法不是用动画表现得,通过我的观察和实验,是通过ConfigurableJoint里面带的方法实现的,具体也说不清楚。根据动画文献了解基本实现。部分控制代码如下:void

RightHand()

{

if

(Input.GetMouseButtonDown(0))

{

Righthand.SetFloat("RightAll",

2f);

Click

=

true;

}

if

(Input.GetMouseButtonUp(0))

{

Righthand.SetFloat("RightAll",

0f);

Righthand.SetFloat("RFinger1",

0f);

Righthand.SetFloat("RFinger2",

0f);

Righthand.SetFloat("RFinger3",

0f);

Righthand.SetFloat("RFinger4",

0f);

Righthand.SetFloat("RFinger5",

0f);

Click

=

false;

}

}

void

LeftHand()

{

if

(Input.GetMouseButtonDown(0))

{

Righthand.SetFloat("All",

2f);

}

if

(Input.GetMouseButtonUp(0))

{

Righthand.SetFloat("All",

0f);

}

}

第动画机如图4-4,比较繁琐。图4-4animator状态另外一种方法则比较简单,如图4-5,这种方法比较简单,角色关节(characterjoint):可以模拟角色的骨骼关节。通过控制各个关节位碰撞体的角度实现手的弯曲,有现成的模拟器参照。关节是一个游戏组件,在导航菜单栏中选择component——physics然后从中选择一种关节组件,即可完成关节组件的添加。使用breakforce可设置关节断裂的力,一旦力超过它,关节将会断裂。断裂时,通过onjointbreakforce方法可监听相关事件。图4-5characterjoint关节两种手部手指抓取效果的实现让玩家控制手部与场景进行交互我参考了文献中的内容图4图4-6抓取效果第一种汽车场景的手的抓取效果逻辑是让手触碰到特定的collider后进行记录,然后检测此时玩家有没有点击鼠标左键来判断isTouch是否为真,若为真,玩家就不再控制手的移动cube的移动,而是控制当前所碰撞的特定collider,人的手IK就会切换目标,从而实现手放在上面进行操控一样。该方法可能会造成穿模的现象,但是胜在简单容易实现,也不会因为各种rigidbody不规范而产生各种bug。部分代码如下,SteeringWeelCount的多少是判断玩家触碰各种特定物品变化,只要数字是多少,点击了鼠标就会让手挂在上方。抓取效果如图4-6第二种钓鱼场景的手的抓取效果是由Unity自带的fixedjoint实现的,通过我的观察与实验,该手模拟器是通过控制ConfigurableJoint里面的数值来改变手指的弯曲程度,当手指弯曲时碰到有碰撞体的物体时就会让碰撞的点与被碰撞物进行fixedjoint物理连接,只要玩家不松开左键,这个物理关节就会一直链接,直到玩加松开左键才会断开。这种效果会更加真实,因为它会根据物体大小来改变手指握住的那个曲度,像是真的握在上面一样。难点就是对于rigidbody的数值比较严格,很难有合理的效果。抓取效果如图4-1-4-2图3-1-2抓取效果场景的实现在Unity中分了一个环境物体,里面放着该场景的所有环境物体,在这钓鱼环境中我加入了汪洋大海,大海上加入了一个小岛,小岛上有几棵椰子树,因为素材上树有动画,加入WindZone风向让树叶有吹动效果。在岸边加入了一个小船,玩家在船上,船边有本场景的关键道具鱼竿和鱼饵,玩家通过道具钓到一条鱼到船上就算胜利。如图3-1所示图3-1钓鱼场景图3-1-2汽车场景钓鱼场景的实现钓鱼场景,视觉会一直跟随左手或者右手,玩家可以切换左右手来切换视觉跟随。汽车场景会有些不同,当玩家操控方向盘的时候,头部的跟随会回到正前方,方便玩家操控汽车,当玩家松开方向盘,摄像机就会回到左右手的跟随。汽车场景的实现接在汽车场景中,我们加入一个大赛道给玩家移动,如图3-1-2,玩家通过控制车中的方向盘和挡位进行车的移动,玩家操控汽车通过指定的点完成游戏。钓鱼场景鱼竿的实现钓鱼场景的鱼竿由三部分组成,一是一个带碰撞体的鱼竿模型,二是一条由Obi插件提供的钓竿线,这条线数值十分复杂,到现在也只能调整到比较正常的度,三是一个可以跟鱼饵碰撞的鱼钩。钓鱼的基本逻辑,玩家通过右手握紧鱼竿调整角度,让鱼钩能放在自己面前,再通过左手抓住鱼饵挂在鱼钩上,鱼饵跟鱼钩碰撞就会让他们之间生成一个fixedpoint而实现挂在上面,然后玩家通过右手调整鱼竿角度让鱼饵浸到水里,水里有一个collider检测鱼饵是否在水里,经过几秒后,如果鱼饵在水里,挂在鱼钩上隐藏的大鱼就会显现,而原本托起鱼钩在水面的collider就会消失,而实现一个鱼上钩的场景,玩家调整鱼竿角度让大鱼停在船上方,操控左手让鱼掉到船上,游戏通关。汽车场景汽车的实现汽车场景的汽车是由两部分组成,一是汽车模型本体,承载整个汽车系统的是RealisticCarControllerV3的汽车插件,它的优点是操作简单,碰撞真实。二是汽车的方向盘和自动挡杆,我把这些单独分离了出来,因为这个汽车插件会自动识别汽车内的collider如果有多余的它会进行清除,会影响我们操控。汽车内部如下图4-5-1。、图4-5-1游戏效果方向盘:方向盘上有三个可供玩家触碰的collider,玩家可以左右手去交互这三个collier,当玩家触碰到方向盘并进行握住,就会触发方向盘的转动,方向盘的转动角度限制为90度和-90度,等于该角度的时候便会卡住不能超过该度数。部分代码如下:void

SteeringWheelRotate()

{

if

(isTouch

&&

!isShift)

{

if

(SteeringWeelCount

==

1

||

SteeringWeelCount

==

2

||

SteeringWeelCount

==

3)

{

float

moveSpeed

=

2f;

float

RotateSpeed

=

60f;

float

mouseX

=

Input.GetAxis("Mouse

X")

*

moveSpeed;

Vector3

_movent

=

new

Vector3(0,

0,

-mouseX);

SWheel.transform.Rotate(_movent

*

Time.deltaTime

*

RotateSpeed);

}

}

}

角度限制代码如下:public

void

Update()

{

this.transform.position

=

steering.position;

angle

=

transform.localEulerAngles.z;

if

(CheckAngle(angle)

>

90)

transform.localEulerAngles

=

new

Vector3(transform.localEulerAngles.x,

transform.localEulerAngles.y,

90);

if

(CheckAngle(angle)

<

-90)

transform.localEulerAngles

=

new

Vector3(transform.localEulerAngles.x,

transform.localEulerAngles.y,

-90);

}

public

float

CheckAngle(float

value)

{

float

angle

=

value

-

180;

if

(angle

>

0)

return

angle

-

180;

return

angle

+

180;

}

方向盘主要控制的是前车轮,当玩家方向盘打到90度或者-90度,车轮就会向左或向右打满。自动手杆:自动手杆总共有三个档,前挡,倒退档和不动的档。玩家通过右手交互,上下推动切换挡位,前挡只能按W前进,倒退档只能按S倒退,不动的档就W和S都按不了。摄像机位置两个场景的摄像机几乎一致,都是绑定在人模型的头部眼睛的位置,通过头部的旋转来实现。当玩家是用左手的时候,头部骨骼IK会以左手为目标进行跟随移动,右手也是一样,部分代码如下:if

(SteeringWheel.Instance.SteeringWeelCount

==

0)

{

SteeringWheel.Instance.OutSteeringWeel

=

true;

SteeringWheel.Instance.Clutch

=

false;

animator.SetIKPositionWeight(AvatarIKGoal.RightHand,

1f);

animator.SetIKPosition(AvatarIKGoal.RightHand,

Righttarget.position);

}

else

if

(SteeringWheel.Instance.SteeringWeelCount

==

1

&&

SteeringWheel.Instance.isTouch)

{

animator.SetIKPositionWeight(AvatarIKGoal.RightHand,

1f);

animator.SetIKRotationWeight(AvatarIKGoal.RightHand,

1f);

animator.SetIKPosition(AvatarIKGoal.RightHand,

SteeringWheel_1.position);

animator.SetIKRotation(AvatarIKGoal.RightHand,

SteeringWheel_1.rotation);

SteeringWheel.Instance.REyes

=

false;

SteeringWheel.Instance.OutSteeringWeel

=

false;

}

else

if

(SteeringWheel.Instance.SteeringWeelCount

==

2

&&

SteeringWheel.Instance.isTouch)

{

animator.SetIKPositionWeight(AvatarIKGoal.RightHand,

1f);

animator.SetIKRotationWeight(AvatarIKGoal.RightHand,

1f);

animator.SetIKPosition(AvatarIKGoal.RightHand,

SteeringWheel_2.position);

animator.SetIKRotation(AvatarIKGoal.RightHand,

SteeringWheel_2.rotation);

SteeringWheel.Instance.REyes

=

false;

SteeringWheel.Instance.OutSteeringWeel

=

false;

}

游戏测试游找到打包好的游戏exe文件双击打开,在窗口中选好游戏的分辨率,再点击开始游戏按钮,游戏就开始运行了。

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论