版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、Unity3D技术学习之自由视角下的角色控制今天呢,我们继续来探讨Unity3D角色控制的内容,今天博主将解决在上一篇文章中没有解决的问题,即自由视角下的角色控制。如图是博主非常喜欢的古剑奇谭游戏截图,在这款游戏中就使用了博主今天要讲解的自由视角,所谓自由视角是指玩家可以按照自身坐标系向着四个不同的方向移动,当玩家按下鼠标右键时,可以绕Y轴按照一定的角度旋转摄像机,在旋转的过程中,角色将旋转相应的角度。在移动的过程中,摄像机会保持与玩家间的一定距离,然后跟随角色进行移动。好了,下面我们正式开始今天的内容吧!在开始今天的内容前,首先让我们来学习下Unity3D中较为重要的一部分知识,理解这些知识
2、是我们开始学习今天内容的基础。1、Input.GetAxis():该方法用于在Unity3D中根据坐标轴名称返回虚拟坐标系中的值,通常情况下,使用控制器和键盘输入时此值范围在T到1之间。这段话怎么理解呢?我们来看下面这段脚本:usingUnityEngine;usingSystem.Collections;publicclassexample:MonoBehaviour/水平速度publicfloatHorizontalSpeed=2.0F;/垂直速度publicfloatVerticalSpeed=2.0F;voidUpdate()/水平方向floath=HorizontalSpeed*In
3、put.GetAxis(MouseX);/垂直方向floatv=VerticalSpeed*Input.GetAxis(MouseY);/旋转transform.Rotate(v,h,0);这段脚本呢是根据鼠标的位置来旋转物体从而实现对物体的观察,从这段脚本中我们可以看出,通过获取输入轴的办法,我们可以获得鼠标移动的方向进而实现对于物体的旋转控制。在Unity3D中我们可以通过Edit-ProjectSetting-lnput来查看项目中的坐标轴名称:shift11Gic|_li匚EnfipSettings.-Hie-hsvpqM=inI毀卓SUEDalo:仕1盏谱h-.jgV-电.-.|rM
4、rfi-yrfM=ini?FPSM=inSSEE.G=meCtrl4-DIf!-对f!Sihif+lfJFiarneseleiitdEclcdtAllRzridc皙&ctingsehMnrkHmGraphceEmuationagsandLayersiudij!Ph严g2ENztwDrl:EdiL*ScrptEk二cut匚nOrderi-l-Fmn2hCLockViewtoScactedCtfl-F严*上|件门匚上比-Mod9“-SU5HChkhilL+P3tdIAl-IP在后面,我们还将使用这种方式,大家可以对这个方法有进一步的了解。文章出处【狗刨学习网】2、欧拉角eulerAngles:该值
5、是Vector3类型的值,x、y、z分别代表绕x轴旋转x度,绕y轴旋转y度,绕z轴旋转z度。因此,该值最为直观的形式是可以允许我们直接以一个三维向量的形式来修改一个物体的角度,例如下面的脚本:floatmY=5.0;voidUpdate()mY+=Input.GetAxis(Horizontal);transform.eulerAngles=newVector3(0,mY,0);如果你已经理解了上面的话,那么不出意外的,这段脚本会如你所愿的,按照鼠标在水平方向上移动的方向绕Y轴旋转。通常情况下,我们不会单独设置欧拉角其中一个轴,例如eulerAngles.x=10,因为这将导致偏移和不希望的旋
6、转。当设置它们一个新的值时,要同时设置全部。好在我们可以通过Quaternion.Euler()方法将一个Vector3类型的值转化为一个四元数,进而通过修改Transform.Rotation来实现相同的目的。3、插值:所谓插值是指在离散数据的基础上补插连续函数,使得这条连续曲线通过全部给定的离散数据点。插值是离散函数逼近的重要方法,利用它可通过函数在有限个点处的取值状况,估算出函数在其他点处的近似值。在某些情况下,如果我们希望过程中处理得较为平滑,此时我们就可以使用插值的方法来实现对中间过程的模拟。在Unity3D中我们可以使用两种插值方法,即线性插值Lerp,球形插值SLerp。我们来看
7、下面的脚本:voidRotating(floathorizontal,floatvertical)/Createanewvectorofthehorizontalandverticalinputs.Vector3targetDirection=newVector3(horizontal,0f,vertical);/Createarotationbasedonthisnewvectorassumingthatupistheglobalyaxis.QuaterniontargetRotation=Quaternion.LookRotation(targetDirection,Vector3.up)
8、;/Createarotationthatisanincrementclosertothetargetrotationfromtheplayersrotation.QuaternionnewRotation=Quaternion.Lerp(rigidbody.rotation,targetRotation,turnSmoothing*Time.deltaTime);/Changetheplayersrotationtothisnewrotation.rigidbody.MoveRotation(newRotation);插值的方法很简单,只要我们给出初始和结束的状态、时间就可以了,大家可以自己
9、看API。好了,有了这三部分的基础,我们就可以开始今天的内容了,今天的脚本分为两个部分,第一部分是角色控制的部分,主要负责的角色在场景中的移动、转身和动画处理。第二部分是相机控制的部分,主要涉及相机旋转、相机缩放的相关内容。下面,我们分别来讲这两个部分,场景依然是博主自己在做的小游戏:f丄j本次的主角呢,是博主非常喜欢的角色谢沧行,好了,我们回到今天的内容里吧!在第一部分,主要的是完成角色向各个方向的转身,这里博主定义四个方向(其实八个方向是一样的!),脚本如下:usingUnityEngine;usingSystem.Collections;publicclassNoLockiVew_Pla
10、yer:MonoBehaviour/*自由视角下的角色控制*/*作者:秦兀培*/玩家的行走速度publicfloatWalkSpeed=1.5F;/重力publicfloatGravity=20;/角色控制器privateCharacterControllermController;/动画组件privateAnimationmAnim;/玩家方向,默认向前privateDirectionTypemType=DirectionType.Direction_Forward;HideInInspector/玩家状态,默认为IdlepublicPlayerStateState=PlayerState.
11、Idle;/定义玩家的状态枚举publicenumPlayerStateIdle,Walk定义四个方向的枚举值,按照逆时针方向计算protectedenumDirectionTypeDirection_Forward=90,Direction_Backward=270,Direction_Left=180,Direction_Right=0voidStart()获取角色控制器mController=GetComponent();/获取动画组件mAnim=GetComponentInChildren();voidUpdate()MoveManager();/MouseEvent();/玩家移动控
12、制voidMoveManager()/移动方向Vector3mDir=Vector3.zero;if(mController.isGrounded)/将角色旋转到对应的方向if(Input.GetAxis(Vertical)=1)rd);lkSpeed;ard);lkSpeed;SetDirection(DirectionType.Direction_ForwamDir=Vector3.forward*Time.deltaTime*WamAnim.CrossFade(Walk,0.25F);State=PlayerState.Walk;if(Input.GetAxis(Vertical)=-1
13、)SetDirection(DirectionType.Direction_BackwmDir=Vector3.forward*Time.deltaTime*WamAnim.CrossFade(Walk,0.25F);State=PlayerState.Walk;if(Input.GetAxis(Horizontal)=-1)SetDirection(DirectionType.Direction_Left);-mDir=Vector3.forward*Time.deltaTime*WalkSpeed;mAnim.CrossFade(Walk,0.25F);State=PlayerState.
14、Walk;if(Input.GetAxis(Horizontal)=1)SetDirection(DirectionType.Direction_Right);-mDir=Vector3.forward*Time.deltaTime*WalkSpeed;mAnim.CrossFade(Walk,0.25F);State=PlayerState.Walk;/角色的Idle动画if(Input.GetAxis(Vertical)=0&Input.GetAxis(Horizontal)=0)mAnim.CrossFade(Idle,0.25F);State=PlayerState.Idle;/考虑重
15、力因素mDir=transform.TransformDirection(mDir);floaty=mDir.y-Gravity*Time.deltaTime;mDir=newVector3(mDir.x,y,mDir.z);mController.Move(mDir);设置角色的方向,有问题voidSetDirection(DirectionTypemDir)if(mType!=mDir)这里定义四个方向,是按照逆时针方向转的,相邻的两个方向间相差90度,所以我们只需要将当前的角度和目标角度相减就可以转到目标角度的方向(其实这是以前写的代码,现在回头再看,直接用欧拉角似乎更为简单啊,呵呵)。
16、这里主要的内容就是这样了。下面我们来看相机控制部分的代码吧,这里的代码参考了MouseOrbit脚本,主要完成了鼠标右键旋转控制,博主在此基础上增加了相机缩放的代码。提到相机缩放,其实就是根据鼠标滚轮滚动的方向和大小重新计算角色与相机的距离,与之类似地还有小地图的放缩,其实同样是通过修改距离来实现的。博主今天的一个体会是官方的代码能自己写一遍的最好自己写一遍,这样好多东西就能在这个过程中给理解了。我们一起来看脚本usingUnityEngine;usingSystem.Collections;publicclassNoLockView_Camera:MonoBehaviour/观察目标publ
17、icTransformTarget;/观察距离publicfloatDistance=5F;/旋转速度privatefloatSpeedX=240;privatefloatSpeedY=120;/角度限制privatefloatMinLimitY=5;privatefloatMaxLimitY=180;/旋转角度privatefloatmX=0.0F;privatefloatmY=0.0F;/鼠标缩放距离最值privatefloatMaxDistance=10;privatefloatMinDistance=1.5F;/鼠标缩放速率privatefloatZoomSpeed=2F;/是否启用差
18、值publicboolisNeedDamping=true;/速度publicfloatDamping=2.5F;voidStart()/初始化旋转角度mX=transform.eulerAngles.x;mY=transform.eulerAngles.y;voidLateUpdate()/鼠标右键旋转if(Target!=null&Input.GetMouseButton(1)/获取鼠标输入mX+=Input.GetAxis(MouseX)*SpeedX*0.02F;mY-=Input.GetAxis(MouseY)*SpeedY*0.02F;/范围限制mY=ClampAngle(mY,M
19、inLimitY,MaxLimitY);/鼠标滚轮缩放Distance-=Input.GetAxis(MouseScrollWheel)*ZoomSpeed;Distance=Mathf.Clamp(Distance,MinDistance,MaxDistance);/重新计算位置和角度QuaternionmRotation=Quaternion.Euler(mY,mX,0);istance)Vector3mPosition=mRotation*newVector3(0.0F,0.0F,-D+Target.position;/设置相机的角度和位置if(isNeedDamping)/球形插值tr
20、ansform.rotation=Quaternion.Lerp(transform.rotation,mRotation,Time.deltaTime*Damping);/线性插值transform.position=Vector3.Lerp(transform.position,mPosition,Time.deltaTime*Damping);elsetransform.rotation=mRotation;transform.position=mPosition;/将玩家转到和相机对应的位置上if(Target.GetComponent().State=NoLockiVew_Player.PlayerState.Walk)Target.eulerAngles=newVector3(0,mX,0);privatefloatClampAngle(floatangle,floatmin,floatmax)if(angle360)angle-=
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 幕墙防火隔音施工方案(3篇)
- 微分全真基础综合测评卷
- 掏土下沉施工方案(3篇)
- 旧地板拆除施工方案(3篇)
- 柒点营销方案(3篇)
- 毕设施工方案选择(3篇)
- 滑行飞机应急预案(3篇)
- 生日餐厅营销方案(3篇)
- 砼基层清理施工方案(3篇)
- 纳米增氧机施工方案(3篇)
- 2026年“建安杯”信息通信建设行业安全竞赛核心考点题库
- 九师联盟2026届高三下学期4月学业评估英语+答案
- 2026年及未来5年市场数据中国重庆旅游市场竞争格局及投资战略规划报告
- 2026年爆破工程技术人员试题及参考答案详解【综合卷】
- 肾内科院感防控工作制度
- 员工上下班交通安全培训
- 2026江门公用水务环境股份有限公司招聘3人笔试历年参考题库附带答案详解
- 2026年郑州财税金融职业学院单招综合素质考试题库与答案详解
- 2026年中考数学冲刺押题试卷及答案(一)
- 2025年河南交通职业技术学院单招职业技能测试题库附答案解析
- 2026年高考地理二轮复习备考策略讲座
评论
0/150
提交评论