Unity3d 使用W+防止移动堆叠的统一字符控制器;A/D键

Unity3d 使用W+防止移动堆叠的统一字符控制器;A/D键,unity3d,controller,character,Unity3d,Controller,Character,我一直在尝试制作一个非常基本的fps角色控制器脚本,但当我侧向移动时,我无法解决移动堆叠问题。我确信这是一个基本的解决方案,但作为一个初学者,我很难解决它 float forwardSpeed=Input.GetAxis(“垂直”)*movementspeed; float sideSpeed=Input.GetAxis(“水平”)*movementspeed; 矢量3矢量前进速度=新矢量3(侧速度、垂直速度、前进速度); VecForwardSpeed=transform.rotation*V

我一直在尝试制作一个非常基本的fps角色控制器脚本,但当我侧向移动时,我无法解决移动堆叠问题。我确信这是一个基本的解决方案,但作为一个初学者,我很难解决它

float forwardSpeed=Input.GetAxis(“垂直”)*movementspeed;
float sideSpeed=Input.GetAxis(“水平”)*movementspeed;
矢量3矢量前进速度=新矢量3(侧速度、垂直速度、前进速度);
VecForwardSpeed=transform.rotation*VecForwardSpeed;
characterController.Move(VecForwardSpeed*Time.deltaTime);

如果我理解正确,您的意思是,如果同时向前和侧向移动,这些输入/速度“叠加”或总和允许用户移动得比实际允许的更快

您可以通过规范化它们来解决这个问题,这意味着您可以确保它们的组合值不会超过
1
的幅值,例如

//获取组合输入的向量
var combinedInput=新向量2(Input.GetAxis(“水平”)、Input.GetAxis(“垂直”);
//检查震级是否超过1
//sqrMagnitude在这里比1更有效
//行为与大小相同
如果(combinedInput.sqrMagnitude>1)
{
//如果是,则对输入向量进行规格化以再次强制输入
//最大长度/大小为1
combinedInput.Normalize();
}
//在此之前,请在此处应用移动速度
组合输入*=移动速度;
//现在使用这个组合和evtl归一化输入向量的分量
var vectorForwardSpeed=transform.rotation*新向量3(combinedInput.x,verticalVelocity,combinedInput.y)*Time.deltaTime;
characterController.Move(矢量前进速度);

从你的问题来看,不确定垂直性是如何发挥作用的。

没错!也非常感谢您的解释!