位置: 编程技术 - 正文

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

编辑:rootadmin

推荐整理分享Unity3D游戏开发之自由视角状态下的角色控制(Unity3D游戏开发引擎),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:Unity3D游戏开发基础,Unity3D游戏开发pdf,Unity3D游戏开发引擎,Unity3D游戏开发毕业论文,Unity3D游戏开发毕业论文,unity3D游戏开发,Unity3D游戏开发毕业论文,Unity3D游戏开发标准教程,内容如对您有帮助,希望把文章链接给更多的朋友!

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

在开始今天的内容前,首先让我们来学习下Unity3D中较为重要的一部分知识,理解这些知识是我们开始学习今天内容的基础。

1、Input.GetAxis():该方法用于在Unity3D中根据坐标轴名称返回虚拟坐标系中的&#;,通常情况下,使用控制器和键盘输入时此&#;范围在-1到1之间。这段话怎么理解呢?我们来看下面这段脚本:

[csharp] view plaincopyprint?using UnityEngine; using System.Collections; public class example : MonoBehaviour { //水平速度 public float HorizontalSpeed = 2.0F; //垂直速度 public float VerticalSpeed = 2.0F; void Update() { //水平方向 float h = HorizontalSpeed * Input.GetAxis("Mouse X"); //垂直方向 float v = VerticalSpeed * Input.GetAxis("Mouse Y"); //旋转 transform.Rotate(v, h, 0); } } 这段脚本呢是根据鼠标的位置来旋转物体从而实现对物体的观察,从这段脚本中我们可以看出,通过获取输入轴的办法,我们可以获得鼠标移动的方向进而实现对于物体的旋转控制。在Unity3D中我们可以通过Edit->Project Setting->Input来查看项目中的坐标轴名称:

在后面,我们还将使用这种方式,大家可以对这个方法有进一步的了解。

2、欧拉角eulerAngles:该&#;是Vector3类型的&#;,x、y、z分别代表绕x轴旋转x度,绕y轴旋转y度,绕z轴旋转z度。因此,该&#;最为直观的形式是可以允许我们直接以一个三维向量的形式来修改一个物体的角度,例如下面的脚本:

[html] view plaincopyprint?float mY = 5.0; void Update () { mY &#;= Input.GetAxis("Horizontal"); transform.eulerAngles =new Vector3(0,mY, 0); } 如果你已经理解了上面的话,那么不出意外的,这段脚本会如你所愿的,按照鼠标在水平方向上移动的方向绕Y轴旋转。通常情况下,我们不会单独设置欧拉角其中一个轴,例如eulerAngles.x = ,因为这将导致偏移和不希望的旋转。当设置它们一个新的&#;时,要同时设置全部。好在我们可以通过Quaternion.Euler()方法将一个Vector3类型的&#;转化为一个四元数,进而通过修改Transform.Rotation来实现相同的目的。Unity3D游戏开发之自由视角状态下的角色控制(Unity3D游戏开发引擎)

3、插&#;:所谓插&#;是指在离散数据的基础上补插连续函数,使得这条连续曲线通过全部给定的离散数据点。插&#;是离散函数&#;近的重要方法,利用它可通过函数在有限个点处的取&#;状况,估算出函数在其他点处的近&#;&#;。在某些情况下,如果我们希望过程中处理得较为平滑,此时我们就可以使用插&#;的方法来实现对中间过程的模拟。在Unity3D中我们可以使用两种插&#;方法,即线性插&#;Lerp,球形插&#;SLerp。我们来看下面的脚本:

[csharp] view plaincopyprint?void Rotating (float horizontal, float vertical) { // Create a new vector of the horizontal and vertical inputs. Vector3 targetDirection = new Vector3(horizontal, 0f, vertical); // Create a rotation based on this new vector assuming that up is the global y axis. Quaternion targetRotation = Quaternion.LookRotation(targetDirection, Vector3.up); // Create a rotation that is an increment closer to the target rotation from the player's rotation. Quaternion newRotation = Quaternion.Lerp(rigidbody.rotation, targetRotation, turnSmoothing * Time.deltaTime); // Change the players rotation to this new rotation. rigidbody.MoveRotation(newRotation); } 插&#;的方法很简单,只要我们给出初始和结束的状态、时间就可以了,大家可以自己看API。

好了,有了这三部分的基础,我们就可以开始今天的内容了,今天的脚本分为两个部分,第一部分是角色控制的部分,主要负责的角色在场景中的移动、转身和动画处理。第二部分是相机控制的部分,主要涉及相机旋转、相机缩放的相关内容。下面,我们分别来讲这两个部分,场景依然是博主自己在做的小游戏:

本次的主角呢,是博主非常喜欢的角色谢沧行,好了,我们回到今天的内容里吧!在第一部分,主要的是完成角色向各个方向的转身,这里博主定义四个方向(其实八个方向是一样的!),脚本如下:

[csharp] view plaincopyprint?using UnityEngine; using System.Collections; public class NoLockiVew_Player : MonoBehaviour { /*自由视角下的角色控制*/ /*作者:秦元培*/ //玩家的行走速度 public float WalkSpeed=1.5F; //重力 public float Gravity=; //角色控制器 private CharacterController mController; //动画组件 private Animation mAnim; //玩家方向,默认向前 private DirectionType mType=DirectionType.Direction_Forward; [HideInInspector] //玩家状态,默认为Idle public PlayerState State=PlayerState.Idle; //定义玩家的状态枚举 public enum PlayerState { Idle, Walk } //定义四个方向的枚举&#;,按照逆时针方向计算 protected enum DirectionType { Direction_Forward=, Direction_Backward=, Direction_Left=, Direction_Right=0 } void Start () { //获取角色控制器 mController=GetComponent<CharacterController>(); //获取动画组件 mAnim=GetComponentInChildren<Animation>(); } void Update () { MoveManager(); //MouseEvent(); } //玩家移动控制 void MoveManager() { //移动方向 Vector3 mDir=Vector3.zero; if(mController.isGrounded) { //将角色旋转到对应的方向 if(Input.GetAxis("Vertical")==1) { SetDirection(DirectionType.Direction_Forward); mDir=Vector3.forward * Time.deltaTime * WalkSpeed; mAnim.CrossFade("Walk",0.F); State=PlayerState.Walk; } if(Input.GetAxis("Vertical")==-1) { SetDirection(DirectionType.Direction_Backward); mDir=Vector3.forward * Time.deltaTime * WalkSpeed; mAnim.CrossFade("Walk",0.F); State=PlayerState.Walk; } if(Input.GetAxis("Horizontal")==-1) { SetDirection(DirectionType.Direction_Left); mDir=Vector3.forward * Time.deltaTime * WalkSpeed; mAnim.CrossFade("Walk",0.F); State=PlayerState.Walk; } if(Input.GetAxis("Horizontal")==1) { SetDirection(DirectionType.Direction_Right); mDir=Vector3.forward * Time.deltaTime * WalkSpeed; mAnim.CrossFade("Walk",0.F); State=PlayerState.Walk; } //角色的Idle动画 if(Input.GetAxis("Vertical")==0 && Input.GetAxis("Horizontal")==0) { mAnim.CrossFade("Idle",0.F); State=PlayerState.Idle; } } //考虑重力因素 mDir=transform.TransformDirection(mDir); float y=mDir.y-Gravity *Time.deltaTime; mDir=new Vector3(mDir.x,y,mDir.z); mController.Move(mDir); } //设置角色的方向,有问题 void SetDirection(DirectionType mDir) { if(mType!=mDir) { transform.Rotate(Vector3.up*(mType-mDir)); mType=mDir; } } } 这里定义四个方向,是按照逆时针方向转的,相邻的两个方向间相差度,所以我们只需要将当前的角度和目标角度相减就可以转到目标角度的方向(其实这是以前写的代码,现在回头再看,直接用欧拉角&#;乎更为简单啊,呵呵)。这里主要的内容就是这样了。下面我们来看相机控制部分的代码吧,这里的代码参考了MouseOrbit脚本,主要完成了鼠标右键旋转控制,博主在此基础上增加了相机缩放的代码。提到相机缩放,其实就是根据鼠标滚轮滚动的方向和大小重新计算角色与相机的距离,与之类&#;地还有小地图的放缩,其实同样是通过修改距离来实现的。博主今天的一个体会是官方的代码能自己写一遍的最好自己写一遍,这样好多东西就能在这个过程中给理解了。我们一起来看脚本[csharp] view plaincopyprint?using UnityEngine; using System.Collections; public class NoLockView_Camera : MonoBehaviour { //观察目标 public Transform Target; //观察距离 public float Distance = 5F; //旋转速度 private float SpeedX=; private float SpeedY=; //角度限制 private float MinLimitY = 5; private float MaxLimitY = ; //旋转角度 private float mX = 0.0F; private float mY = 0.0F; //鼠标缩放距离最&#; private float MaxDistance=; private float MinDistance=1.5F; //鼠标缩放速率 private float ZoomSpeed=2F; //是否启用差&#; public bool isNeedDamping=true; //速度 public float Damping=2.5F; void Start () { //初始化旋转角度 mX=transform.eulerAngles.x; mY=transform.eulerAngles.y; } void LateUpdate () { //鼠标右键旋转 if(Target!=null && Input.GetMouseButton(1)) { //获取鼠标输入 mX &#;= Input.GetAxis("Mouse X") * SpeedX * 0.F; mY -= Input.GetAxis("Mouse Y") * SpeedY * 0.F; //范围限制 mY = ClampAngle(mY,MinLimitY,MaxLimitY); } //鼠标滚轮缩放 Distance-=Input.GetAxis("Mouse ScrollWheel") * ZoomSpeed; Distance=Mathf.Clamp(Distance,MinDistance,MaxDistance); //重新计算位置和角度 Quaternion mRotation = Quaternion.Euler(mY, mX, 0); Vector3 mPosition = mRotation * new Vector3(0.0F, 0.0F, -Distance) &#; Target.position; //设置相机的角度和位置 if(isNeedDamping){ //球形插&#; transform.rotation = Quaternion.Lerp(transform.rotation,mRotation, Time.deltaTime*Damping); //线性插&#; transform.position = Vector3.Lerp(transform.position,mPosition, Time.deltaTime*Damping); }else{ transform.rotation = mRotation; transform.position = mPosition; } //将玩家转到和相机对应的位置上 if(Target.GetComponent<NoLockiVew_Player>().State==NoLockiVew_Player.PlayerState.Walk) { Target.eulerAngles=new Vector3(0,mX,0); } } private float ClampAngle (float angle,float min,float max) { if (angle < -) angle &#;= ; if (angle > ) angle -= ; return Mathf.Clamp (angle, min, max); } } 这里很多朋友可能对我设置一个状态很不理解吧,这其实是为了让玩家有一个自由查看角色的机会,否则当玩家按下鼠标右键的话,角色就会转向相机正对着的位置,这样玩家就看不到角色的正面了。当然,这里用到了插&#;,这样能使角色在转身的时候平滑一点,效果会更好。

效果演示(2M的限制让很多展示都无可奈何)

Unity3D游戏开发之自由视角状态下的角色控制(二) 喜欢我的博客请记住我的名字:秦元培,我的博客地址是

Unity3D游戏开发之开发游戏带来的问题 昨日曾就某投资人把移动团队失败原因之一归于选择Unity引擎进行了一番评论,工具本身无罪,但如何理解工具、正确使用Unity引擎确实需要讨论,在选

游戏开发之UDK引擎介绍和模型导入 --::3UnrealDevelopmentKit(虚幻引擎开发工具包),简称UDK,是一套强大并免费的游戏引擎开发套件,可以用来制作高端的3D游戏或者场景展示。不

标签: Unity3D游戏开发引擎

本文链接地址:https://www.jiuchutong.com/biancheng/372908.html 转载请保留说明!

上一篇:Unity3D游戏开发之仿仙剑奇侠传仙灵岛机关的实现(Unity3D游戏开发引擎)

下一篇:Unity3D游戏开发之自由视角状态下的角色控制(二)(Unity3D游戏开发标准教程)

  • 查付款记录需要什么?
  • 增值税发票税控开票软件
  • 费用计入管理费用与销售费用的区别
  • 现金日记账本月合计的红线画法
  • 已勾选未认证什么意思
  • 个体开票
  • 无息贴息贷款合同印花税
  • 工会经费征税吗
  • 土地租金及青苗赔偿款怎么做账?
  • 储备基金是用来干嘛的
  • 直接减免的增值税计入哪个科目
  • 缴纳印花税需要计提吗?
  • 分公司开票总公司收款行吗
  • 机打发票2017年7月份以后可以用吗?
  • 委托研发受托方怎么做账
  • 跨年度多计提的租金怎么冲
  • 来的货比合同金额多怎么申报印花税?
  • 融资租赁到期后资产归属
  • 新公司值得入职吗
  • 收入低于10万免征附加税
  • 学校食堂承包餐饮公司
  • 社会保险生育险能报多少
  • 怎样结转销售成本会计分录
  • linux 运行php脚本
  • 进程调度算法例题分析
  • php str函数
  • Get请求报错404出现原因及解决办法
  • el-input value
  • 一公顷等于多少千米
  • 哥本哈根的地形
  • Laravel 5.5 的自定义验证对象/类示例代码详解
  • echarts bi
  • php similar_text()函数的定义和用法
  • php常用命令
  • 宇宙最强舅舅系统
  • 包装物逾期是什么意思
  • 图像风格迁移网站
  • 实缴注册资本印花税如何缴纳
  • 在发生以下的情况下,可判定货物
  • 社保断交一个月但是后面正常缴费
  • 判断文件是否存在,存在则删除
  • 织梦怎么新建页面
  • 附有销售退回条件的商品销售
  • 专项附加扣除中住房租金扣除所指的工作城市范围包括
  • 研发企业税率是多少
  • 税控盘有什么用途和作用
  • 购买方销项负数发票怎么抵扣
  • 根据《中华人民共和国食品安全法》
  • 报销凭证粘贴单怎么用
  • 企业所得税怎么算
  • 无偿调入的固定资产怎么记账
  • 以摊余成本计量的债权投资与以公允价值计量且其变动
  • 小规模纳税人补开发票如何申报
  • 上年多交的增值税怎么调整
  • 建筑劳务公司工作内容
  • 民间非营利组织会计科目
  • 厂部管理人员的工资属于制造费用吗
  • 公司股东投资是什么意思
  • 红冲发票操作步骤
  • 施工项目部主要职责
  • 广告收入计入哪个科目
  • 公司注销开户许可证是不是要上交
  • 涉外收入申报单盖章
  • 资产减值的含义与应用范围
  • 新成立的公司发朋友圈文案
  • 低值易耗品与固废的区别
  • SQL Server 2005/2008 用户数据库文件默认路径和默认备份路径修改方法
  • 清除windows10登录密码
  • centos7文件路径
  • 查看端口信息命令
  • WIN10系统中WPS字体颜色浅
  • 我为什么要
  • python调用bash
  • Python 数据清洗
  • js中写html代码
  • 深入理解javascript特性
  • jquery的优点和缺点
  • python切片菜鸟教程
  • jquery实现全选
  • 银行与企业之间的信用
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设