Unity3D游戏开发之自由视角状态下的角色控制(二)

在测试Unity3D游戏开发之自由视角状态下的角色控制这个项目的时候意外地发现了一个Bug。Bug出现在如下位置:

[csharp] view plaincopyprint?

  1. //设置玩家跟随角度
  2. if(Target.GetComponent<NoLockiVew_Player>().State==NoLockiVew_Player.PlayerState.Walk)
  3. {
  4. Target.rotation=Quaternion.Euler(new Vector3(0,mX,0));
  5. }

该方法主要的作用是当玩家同时按下方向控制键和鼠标右键,玩家可以随着鼠标旋转到对应的角度,这主要是为了满足玩家双手操作的需求,不过由于这行代码,导致玩家在向左、向右、向后三个方向上的转身失效,如果除去这行代码,则原来的方向控制没有任何问题,可是没有这行代码,玩家的操作感就会下降。后来想到我们对角色的旋转实际上应该是放在鼠标右键事件里的,所以将代码修改如下,这样就解决了这个Bug:

[csharp] view plaincopyprint?

  1. using UnityEngine;
  2. using System.Collections;
  3. public class NoLockView_Camera : MonoBehaviour
  4. {
  5. //观察目标
  6. public Transform Target;
  7. //观察距离
  8. public float Distance = 5F;
  9. //旋转速度
  10. private float SpeedX=240;
  11. private float SpeedY=120;
  12. //角度限制
  13. private float  MinLimitY = 5;
  14. private float  MaxLimitY = 180;
  15. //旋转角度
  16. private float mX = 0.0F;
  17. private float mY = 0.0F;
  18. //鼠标缩放距离最值
  19. private float MaxDistance=10;
  20. private float MinDistance=1.5F;
  21. //鼠标缩放速率
  22. private float ZoomSpeed=2F;
  23. //是否启用差值
  24. public bool isNeedDamping=true;
  25. //速度
  26. public float Damping=10F;
  27. private Quaternion mRotation;
  28. void Start ()
  29. {
  30. //初始化旋转角度
  31. mX=transform.eulerAngles.x;
  32. mY=transform.eulerAngles.y;
  33. }
  34. void LateUpdate ()
  35. {
  36. //鼠标右键旋转
  37. if(Target!=null && Input.GetMouseButton(1))
  38. {
  39. //获取鼠标输入
  40. mX += Input.GetAxis("Mouse X") * SpeedX * 0.02F;
  41. mY -= Input.GetAxis("Mouse Y") * SpeedY * 0.02F;
  42. //范围限制
  43. mY = ClampAngle(mY,MinLimitY,MaxLimitY);
  44. //计算旋转
  45. mRotation = Quaternion.Euler(mY, mX, 0);
  46. //根据是否插值采取不同的角度计算方式
  47. if(isNeedDamping){
  48. transform.rotation = Quaternion.Lerp(transform.rotation,mRotation, Time.deltaTime*Damping);
  49. }else{
  50. transform.rotation = mRotation;
  51. }
  52. //处理同时按下鼠标右键和方向控制键
  53. if(Target.GetComponent<NoLockiVew_Player>().State==NoLockiVew_Player.PlayerState.Walk){
  54. Target.rotation=Quaternion.Euler(new Vector3(0,mX,0));
  55. }
  56. }
  57. //鼠标滚轮缩放
  58. Distance-=Input.GetAxis("Mouse ScrollWheel") * ZoomSpeed;
  59. Distance=Mathf.Clamp(Distance,MinDistance,MaxDistance);
  60. //重新计算位置
  61. Vector3 mPosition = mRotation * new Vector3(0.0F, 0.0F, -Distance) + Target.position;
  62. //设置相机的角度和位置
  63. if(isNeedDamping){
  64. transform.position = Vector3.Lerp(transform.position,mPosition, Time.deltaTime*Damping);
  65. }else{
  66. transform.position = mPosition;
  67. }
  68. }
  69. //角度限制
  70. private float  ClampAngle (float angle,float min,float max)
  71. {
  72. if (angle < -360) angle += 360;
  73. if (angle >  360) angle -= 360;
  74. return Mathf.Clamp (angle, min, max);
  75. }
  76. }

不过经过测试,如果不采用插值的话,似乎效果更为真实啊(为什么会和第一次测试的感觉不一样啊,囧!)

更多精彩请点击http://www.gopedu.com/article

时间: 2024-08-03 10:11:13

Unity3D游戏开发之自由视角状态下的角色控制(二)的相关文章

Unity3D游戏开发之自由视角状态下的角色控制

在上一篇文章Unity3D游戏开发之基于Trigger的触发式动画设计一文中,博主与大家分享自己在这方面方面的一些感悟.今天呢,我们来探讨Unity3D角色控制的内容,如图是博主非常喜欢的<古剑奇谭>游戏截图,在这款游戏中就使用了博主今天要讲解的自由视角,所谓自由视角是指玩家可以按照自身坐标系向着四个不同的方向移动,当玩家按下鼠标右键时,可以绕Y轴按照一定的角度旋转摄像机,在旋转的过程中,角色将旋转相应的角度.在移动的过程中,摄像机会保持与玩家间的一定距离,然后跟随角色进行移动.好了,下面我们

[Unity3D]Unity3D游戏开发之自由视角下的角色控制

在开始今天的内容前,首先让我们来学习下Unity3D中较为重要的一部分知识,理解这些知识是我们开始学习今天内容的基础. 1.Input.GetAxis():该方法用于在Unity3D中根据坐标轴名称返回虚拟坐标系中的值,通常情况下,使用控制器和键盘输入时此值范围在-1到1之间.这段话怎么理解呢?我们来看下面这段脚本: [csharp] view plaincopyprint? using UnityEngine; using System.Collections; public class ex

Unity3D游戏开发之如何截屏的技能培训

下面我们开始今天的Unity3D技能培训. 我们学习Unity3D培训目标:让U3D初学者可以更快速的掌握U3D技术,自行制作修改素材,可以独立完成2D.3D小规模游戏及网页游戏开发. 今天我们来做点简单的东西,做个什么呢?答案就是截屏.作为一名热爱单机游戏的玩家,每次在玩游戏的同时截取游戏中比较喜欢的画面,特别是学习了Unity3D以后玩游戏的时候更多地是从一个游戏设计者的角度来看待游戏,换句话说,可能关注技术的成分更多一点吧.比如在写<Unity3D游戏开发之自由视角下的角色控制>和<

零基础unity3d游戏开发系列目录

零基础Unity3D游戏开发系列 第一章:游戏开发与游戏引擎(一) 零基础Unity3D游戏开发系列 第一章:游戏开发与游戏引擎(二) 零基础Unity3D游戏开发系列 第二章:Unity3D概览(一)界面... 零基础Unity3D游戏开发系列 第二章:Unity3D概览(一)创建与打开项目I 零基础unity3d游戏开发系列 第二章:unity3d概览(一)创建与打开项目II 零基础Unity3D游戏开发系列 第二章:Unity3D概览(一)创建与打开项目III 零基础Unity3D游戏开发

Unity3D游戏开发初探—2.初步了解3D模型基础

一.什么是3D模型? 1.1 3D模型概述 简而言之,3D模型就是三维的.立体的模型,D是英文Dimensions的缩写. 3D模型也可以说是用3Ds MAX建造的立体模型,包括各种建筑.人物.植被.机械等等,比如一个大楼的3D模型图.3D模型也包括玩具和电脑模型领域. 互联网的形态一直以来都是2D模式的,但是随着3D技术的不断进步,在未来的时间里,将会有越来越多的互联网应用以3D的方式呈现给用户,包括网络视讯.电子阅读.网络游戏.虚拟社区.电子商务.远程教育等等.甚至对于旅游业,3D互联网也能

[Unity3D]Unity3D游戏开发之异步记载场景并实现进度条读取效果

大家好,我是秦元培.欢迎大家关注我的博客,我的博客地址是:blog.csdn.net/qinyuanpei.终于在各种无语的论文作业中解脱了,所以立即抓紧时间来这里更新博客.博主本来计划在Unity3D游戏开发之从<魂斗罗>游戏说起(上)--目标追踪这篇文章后再写一篇<Unity3D游戏开发之从<魂斗罗>游戏说起(下)>,只是眼下博主的项目进度有些缓慢,所以想等项目稳定下来以后再和大家分享. 作为大家等待博主更新博客的回报,我们今天来说一说Unity3D中的游戏场景异步

Unity3D游戏开发从零单排(六) - 人物运动及攻击连击

提要 今天要实现的是一个简单人物控制器.包括用w,a,s,d来控制人物上下左右跑动,鼠标左击发出连招,都是基于老的lagacy的动画.虽然unity3d自带有charactorcontroller,但是并不是很好用,所以人物控制相关的全部自己来实现.先上效果图: 场景搭建 首先下载这个package,里面包含了人物的动作还有地面的模型.将人物和地面都拖进场景中.这里的模型默认的动画模式是lagacy,不用修改.模型有点偏小,改变模型的scale值为10.最好不要改源文件的scale的scale

Unity3D游戏开发从零单排(五) - 导入CS模型到Unity3D

游戏动画基础 Animation组件 Animation组件是对于老的动画系统来说的. 老的动画形同对应的动画就是clip,每个运动都是一段单独的动画,使用Play()或CrossFade(),直接播放动画 或淡入淡出播放动画. animation.Play("name"); animation.CrossFade("name"); 下面的是它的几个属性 Animation:默认的动画片段: Aniamtions:包含的动画片段: Play Automaticall

Unity3D游戏开发之详解 Animation类和Animator类

Unity3D游戏开发之详解 Animation类和Animator类 Animation类 animation组件用于播放动画.可以指定动画剪辑到动画组件并从脚本控制动画播放.在Unity的动画系统基于权重并且支持动画融合,叠加动画,动画混合,标签和完全控制动画播放的各个方面. 如果想播放一个简单的动画,可以使用Animation.Play:如果想在动画之间交叉淡入,可以使用Animation.CrossFade:如果想改变动画模式(循环,一次,乒乓),可以改变动画导入设置里面的动画帧的Wra