由于之前期末了一直在装备考试,随手记已经很久没有写了。今天开始用Unity整一个第一人称射击游戏出来。项目实现参考教程:制作属于你自己的第一款第一人称射击(FPS)游戏
今天实现的内容:
-
基于CharacterController的第一人称移动功能,了解了一下CharacterController.Move和CharacterController.SimpleMove的区别CharacterController中Move和SimpleMove的区别
-
重力效果(不拟真)
-
跳跃效果跳跃受当前运动状态影响
-
冲刺效果,更快的移动速度
-
下蹲效果,通过改变CharacterController.Height来实现,拥有独立的下蹲行走速度和下蹲冲刺速度。
BUG以及缺陷:
我这个写法标准嘛?我也不知道,但是能用了。
值得注意的:
冲刺判断时考虑到了移动情况,避免在原地不动时按下冲刺键也能跳到冲刺高度。
要注意将得到的movementDirection的模长设置为1,可以使用normalize。这样做是为了避免在Horizontal和Vertical都有输入时导致的模长大于1位移变大,也就是斜着走时速度变快的情况。注意不能在模长小于0时设置。
我专门做了一个参数来判断是否正在下蹲/站起,正在下蹲/站起时不能再切换状态,这是为了防止协程冲突,暂时没有更好的办法了。
代码:
基于CharacterController
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class FPCharacterControllerMovement : MonoBehaviour
{
//-----------------------------------------------------运动-----------------------------------------------------------------//
// 走路的速度
public float walkSpeed = 10f;
// 奔跑的速度
public float sprintingSpeed = 20f;
// 重力
public float grivaty = 9.8f;
// 跳跃高度
public float jumpHeight = 2f;
// 下蹲之后的高度
public float crouchHeight = 1f;
// 站立时的高度
[HideInInspector]
public float originHeight;
// 下蹲时的冲刺的速度
public float crouchWalkSpeed = 5f;
public float crouchSprintSpeed = 5f;
// 当前在冲刺
[HideInInspector]
public bool m_isSprinting;
// 当前是否蹲下了
[HideInInspector]
public bool m_isCrouched;
// 当前是否正在蹲下/起立 用于协程控制
[HideInInspector]
public bool m_isDoCrouching;
// 对CharacterController的引用
private CharacterController m_characterController;
// 对Transform的引用
private Transform m_characterTransform;
// 移动的方向
private Vector3 m_movementDirection;
// 当前使用哪个速度(Walk or Sprint)
private float