版本:unity 5.3.4 语言:C#
今天又研究了一个脚本。
刚体的第一人称,不过这个脚本没有像之前的FPS脚本一样,加那么多另外的脚本,唯一一个就是MouseLook,这个脚本我们之前分析过了,就不再赘述了。
所以整个看下来都是一个比较完整的FPS模型,个人喜欢用这个刚体实现,因为以后用其他什么力都比较方便。
下面上代码:
// 刚体FPS移动主脚本,用刚体和胶囊组件代替了Character Controller组件
// 提醒一下,这个脚本有两百多行,稍微有点混乱的,建议先看看都有些什么属性留个印象,然后按照Start、Update、FixedUpdate一步步按照逻辑执行顺寻看过去会轻松很多
[RequireComponent(typeof (Rigidbody))]
[RequireComponent(typeof (CapsuleCollider))]
public class RigidbodyFirstPersonController : MonoBehaviour
{
// 内部类,移动设置
[Serializable]
public class MovementSettings
{
public float ForwardSpeed = 8.0f; // 向前走的最大速度
public float BackwardSpeed = 4.0f; // 后退的最大速度
public float StrafeSpeed = 4.0f; // 倾斜走的最大速度
public float RunMultiplier = 2.0f; // 奔跑速度跟行走速度的比例
public KeyCode RunKey = KeyCode.LeftShift; //跑步的按键
public float JumpForce = 30f; //起跳的力
public AnimationCurve SlopeCurveModifier = new AnimationCurve(new Keyframe(-90.0f, 1.0f), new Keyframe(0.0f, 1.0f), new Keyframe(90.0f, 0.0f)); //斜面移动的调节曲线,默认是0到90,从1减到0
[HideInInspector] public float CurrentTargetSpeed = 8f; //当前的目标速度
#if !MOBILE_INPUT
private bool m_Running; //当前是否在跑步状态,只有在非手机平台上有效
#endif
// 更新目标的速度。
public void UpdateDesiredTargetSpeed(Vector2 input)
{
if (input == Vector2.zero) return; //没有输入不处理
if (input.x > 0 || input.x < 0) //x轴(即水平方向)有输入,速度为倾斜速度
{
CurrentTargetSpeed = StrafeSpeed;
}
if (input.y < 0) //y小于0,速度为后退速度
{
CurrentTargetSpeed = BackwardSpeed;
}
if (input.y > 0) //y大于0,前进速度,这个写在最后,使其优先级最高,即如果即倾斜又前进,则为前进速度
{
CurrentTargetSpeed = ForwardSpeed;
}
#if !MOBILE_INPUT
if (Input.GetKey(RunKey)) //奔跑状态下,速度默认乘以2
{
CurrentTargetSpeed *= RunMultiplier;
m_Running = true;
}
else
{
m_Running = false;