当玩家走对角线时,他会变得更快。我下载了一个玩家控制器脚本,不是自己写的,所以我不知道如何规范化它。它是Evolve Games(https://www.youtube.com/watch?v=PLQmJ18f8O4)的逼真FPS控制器。
代码如下:
//by EvolveGames
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace EvolveGames
{
[RequireComponent(typeof(CharacterController))]
public class PlayerController : MonoBehaviour
{
[Header("PlayerController")]
[SerializeField] public Transform Camera;
[SerializeField] public ItemChange Items;
[SerializeField, Range(1, 10)] public float walkingSpeed = 3.0f;
[Range(0.1f, 5)] public float CroughSpeed = 1.0f;
[SerializeField, Range(2, 20)] float RuningSpeed = 4.0f;
[SerializeField, Range(0, 20)] float jumpSpeed = 6.0f;
[SerializeField, Range(0.5f, 10)] float lookSpeed = 2.0f;
[SerializeField, Range(10, 120)] float lookXLimit = 80.0f;
[Space(20)]
[Header("Advance")]
[SerializeField] float RunningFOV = 65.0f;
[SerializeField] float SpeedToFOV = 4.0f;
[SerializeField] float CroughHeight = 1.0f;
[SerializeField] float gravity = 20.0f;
[SerializeField] float timeToRunning = 2.0f;
[HideInInspector] public bool canMove = true;
[HideInInspector] public bool CanRunning = true;
[Space(20)]
[Header("Climbing")]
[SerializeField] bool CanClimbing = true;
[SerializeField, Range(1, 25)] float Speed = 2f;
bool isClimbing = false;
[Space(20)]
[Header("HandsHide")]
[SerializeField] bool CanHideDistanceWall = true;
[SerializeField, Range(0.1f, 5)] float HideDistance = 1.5f;
[SerializeField] int LayerMaskInt = 1;
[Space(20)]
[Header("Input")]
[SerializeField] KeyCode CroughKey = KeyCode.LeftControl;
[HideInInspector] public CharacterController characterController;
[HideInInspector] public Vector3 moveDirection = Vector3.zero;
bool isCrough = false;
float InstallCroughHeight;
float rotationX = 0;
[HideInInspector] public bool isRunning = false;
Vector3 InstallCameraMovement;
float InstallFOV;
Camera cam;
[HideInInspector] public bool Moving;
[HideInInspector] public float vertical;
[HideInInspector] public float horizontal;
[HideInInspector] public float Lookvertical;
[HideInInspector] public float Lookhorizontal;
float RunningValue;
float installGravity;
bool WallDistance;
[HideInInspector] public float WalkingValue;
void Start()
{
characterController = GetComponent<CharacterController>();
if (Items == null && GetComponent<ItemChange>()) Items = GetComponent<ItemChange>();
cam = GetComponentInChildren<Camera>();
Cursor.lockState = CursorLockMode.Locked;
Cursor.visible = false;
InstallCroughHeight = characterController.height;
InstallCameraMovement = Camera.localPosition;
InstallFOV = cam.fieldOfView;
RunningValue = RuningSpeed;
installGravity = gravity;
WalkingValue = walkingSpeed;
}
void Update()
{
RaycastHit CroughCheck;
RaycastHit ObjectCheck;
if (!characterController.isGrounded && !isClimbing)
{
moveDirection.y -= gravity * Time.deltaTime;
}
Vector3 forward = transform.TransformDirection(Vector3.forward);
Vector3 right = transform.TransformDirection(Vector3.right);
isRunning = !isCrough ? CanRunning ? Input.GetKey(KeyCode.LeftShift) : false : false;
vertical = canMove ? (isRunning ? RunningValue : WalkingValue) * Input.GetAxis("Vertical") : 0;
horizontal = canMove ? (isRunning ? RunningValue : WalkingValue) * Input.GetAxis("Horizontal") : 0;
if (isRunning) RunningValue = Mathf.Lerp(RunningValue, RuningSpeed, timeToRunning * Time.deltaTime);
else RunningValue = WalkingValue;
float movementDirectionY = moveDirection.y;
moveDirection = (forward * vertical) + (right * horizontal);
//if (Input.GetButton("Jump") && canMove && characterController.isGrounded && !isClimbing)
//{
// moveDirection.y = jumpSpeed;
//}
//else
//{
moveDirection.y = movementDirectionY;
//}
characterController.Move(moveDirection * Time.deltaTime);
Moving = horizontal < 0 || vertical < 0 || horizontal > 0 || vertical > 0 ? true : false;
if (Cursor.lockState == CursorLockMode.Locked && canMove)
{
Lookvertical = -Input.GetAxis("Mouse Y");
Lookhorizontal = Input.GetAxis("Mouse X");
rotationX += Lookvertical * lookSpeed;
rotationX = Mathf.Clamp(rotationX, -lookXLimit, lookXLimit);
Camera.transform.localRotation = Quaternion.Euler(rotationX, 0, 0);
transform.rotation *= Quaternion.Euler(0, Lookhorizontal * lookSpeed, 0);
if (isRunning && Moving) cam.fieldOfView = Mathf.Lerp(cam.fieldOfView, RunningFOV, SpeedToFOV * Time.deltaTime);
else cam.fieldOfView = Mathf.Lerp(cam.fieldOfView, InstallFOV, SpeedToFOV * Time.deltaTime);
}
if (Input.GetKey(CroughKey))
{
isCrough = true;
float Height = Mathf.Lerp(characterController.height, CroughHeight, 5 * Time.deltaTime);
characterController.height = Height;
WalkingValue = Mathf.Lerp(WalkingValue, CroughSpeed, 6 * Time.deltaTime);
}
else if (!Physics.Raycast(GetComponentInChildren<Camera>().transform.position, transform.TransformDirection(Vector3.up), out CroughCheck, 0.8f, 1))
{
if (characterController.height != InstallCroughHeight)
{
isCrough = false;
float Height = Mathf.Lerp(characterController.height, InstallCroughHeight, 6 * Time.deltaTime);
characterController.height = Height;
WalkingValue = Mathf.Lerp(WalkingValue, walkingSpeed, 4 * Time.deltaTime);
}
}
if(WallDistance != Physics.Raycast(GetComponentInChildren<Camera>().transform.position, transform.TransformDirection(Vector3.forward), out ObjectCheck, HideDistance, LayerMaskInt) && CanHideDistanceWall)
{
WallDistance = Physics.Raycast(GetComponentInChildren<Camera>().transform.position, transform.TransformDirection(Vector3.forward), out ObjectCheck, HideDistance, LayerMaskInt);
Items.ani.SetBool("Hide", WallDistance);
Items.DefiniteHide = WallDistance;
}
}
private void OnTriggerEnter(Collider other)
{
if (other.tag == "Ladder" && CanClimbing)
{
CanRunning = false;
isClimbing = true;
WalkingValue /= 2;
Items.Hide(true);
}
}
private void OnTriggerStay(Collider other)
{
if (other.tag == "Ladder" && CanClimbing)
{
moveDirection = new Vector3(0, Input.GetAxis("Vertical") * Speed * (-Camera.localRotation.x / 1.7f), 0);
}
}
private void OnTriggerExit(Collider other)
{
if (other.tag == "Ladder" && CanClimbing)
{
CanRunning = true;
isClimbing = false;
WalkingValue *= 2;
Items.ani.SetBool("Hide", false);
Items.Hide(false);
}
}
}
}
我试着在moveDirection中使向前和向右正常化,但是现在玩家移动得太慢了。
1条答案
按热度按时间uxhixvfz1#
目标似乎在
moveDirection = (forward * vertical) + (right * horizontal);
附近首先,
vertical
和horizontal
变量乘以跑步和步行值。这就是为什么规格化moveDirection
会使角色变慢的原因。我相信这就是你如何更新代码来修复它的方法。从改变设置垂直和水平速度的这两行开始。
vertical = canMove ? Input.GetAxis("Vertical") : 0;
horizontal = canMove ? Input.GetAxis("Horizontal") : 0;
接下来,我们更改
moveDirection
的设置方式,以便在标准化后应用WalkSpeed和RunSpeed。moveDirection = (forward * vertical) + (right * horizontal);
moveDirection = moveDirection.normalized * (isRunning ? RunningValue : WalkingValue);
总的来说,整个代码段应该看起来像这样:
任何代码之前或之后这一块不需要改变。如果这不起作用,请回复发生了什么。