弄了一晚上,终于弄出了让我很满意的,使角色能以第一人称的方式移动和转向的代码!
主要是有几个地方出了问题,各种调试都不行,最后才发现是Unity系统本身的问题,从2015年到现在都没有修复。
不过最后官方提供的MouseOrbit.js脚本派上了大用场!不然可能我就要换一种我不喜欢的方式去解决了!!!
总之, 我把写好的代码放出来,大家到时候可以直接使用就好。
在这里,我把代码整理到一个类中,大家使用的时候,直接挂到角色身上就OK!
using UnityEngine;namespace Com.XiMiGua{/// <summary>/// 这个类用于控制第一人称的角色进行移动/// </summary>[RequireComponent(typeof(Rigidbody))][RequireComponent(typeof(CapsuleCollider))]public class FirstPersonPlayerMove : MonoBehaviour{#region 变量[Tooltip(“玩家身上的相机“)]public Camera playerCamera;[Tooltip(“移动速度“)]public float moveSpeed;[Tooltip(“旋转速度“)]public float mouseSpeed;private float x = 0.0f;//相机的欧拉角的x轴的值private bool jump = false;//是否正在跳跃private float jumpCD=0.5f;//跳跃的间隔时间private float jumpTimer = 0.0f;//跳跃的计时器#endregion#region Unity回调函数void Start()//初始化{var angles = playerCamera.transform.localEulerAngles;//相机的欧拉角x = angles.x;//取到相机欧拉角的x轴的值}void Update(){Move();//监测用户输入,并设置角色移动的方向Rotation();//旋转相机//跳跃计时器if(jumpTimer<=jumpCD && jump){jumpTimer+=Time.deltaTime;//计时器开始计时}else if(jumpTimer>=jumpCD){jump = false;//没有在跳跃}}#endregion#region 私有方法/// <summary>/// 用于让角色移动/// </summary>private void Move(){//向前走,向后走transform.Translate(Vector3.forward * Time.deltaTime * Input.GetAxis(“Vertical“) * moveSpeed);//Left 和 Righttransform.Translate(Vector3.right * Time.deltaTime * Input.GetAxis(“Horizontal“) * moveSpeed);//跳跃if (Input.GetKey(KeyCode.Space) && !jump){jump = true;//正在跳跃jumpTimer =0;//计时器归0transform.Translate(Vector3.up*1.2f);//向上跳}}/// <summary>/// 处理旋转/// </summary>private void Rotation(){//水平旋转transform.Rotate(Vector3.up*Time.deltaTime* Input.GetAxis(“Mouse X“) * mouseSpeed);//垂直旋转– 旋转相机//需要限定角度(-30,40)x += Time.deltaTime * Input.GetAxis(“Mouse Y“) * mouseSpeed * 0.8f;x = ClampAngle(x, -30.0f, 40.0f);var rotation = Quaternion.Euler(x, 0, 0);playerCamera.transform.localRotation = rotation;}/// <summary>/// 限定角度/// </summary>private float ClampAngle(float angle , float min , float max ){if (angle < -360)angle += 360;if (angle > 360)angle -= 360;return Mathf.Clamp(angle, min, max);}#endregion}}
使用的时候直接像这样,挂到角色身上就好。(不用管我之前的日志中讲了什么乱七八糟的代码,现在全部整合在这篇代码中了!那些代码都不需要啦!!!!)
然后在PlayerCamera字段中,指定一下角色身上的Camera组件。
Rigidbody和胶囊体碰撞器会自动添加。
这里的Rigidbody组件只是用来:
1、为角色添加重力
2、进行碰撞检测(防止角色穿过障碍物)
大概的效果是这样哒~(GIF有些裂屏,实际上是没有裂屏的)
然后是Demo的下载地址,大家可以和之前的那篇的Demo进行比较~
(如果链接失效请联系我~)
链接:http://pan.baidu.com/s/1dFk0H7j 密码:wqa8