所以我正处于制作 FPS 游戏的早期阶段,我刚刚实现了冲刺和蹲伏功能(蹲伏目前只会减慢玩家的速度)。 功能很简单:
private void sprintInput()
{
if (Input.GetKeyDown(sprintKey))
{
movementSpeed *= 2f;
}
if (Input.GetKeyUp(sprintKey))
{
movementSpeed /= 2f;
}
}
private void crouchInput()
{
if (Input.GetKeyDown(crouchKey))
{
movementSpeed /= 2f;
}
if (Input.GetKeyUp(crouchKey))
{
movementSpeed *= 2f;
}
}
不管怎样写,它们显然可以同时激活。但我想让蹲伏覆盖冲刺。因此,如果我同时使用冲刺和蹲伏,则只会激活蹲伏。 我尝试了多种方法,但没有任何效果,我确信我错过了一些非常明显的东西,我只是不知道是什么。
是否蹲下时将布尔变量设置为 true/false。
bool isCrouching;
private void crouchInput()
{
if (Input.GetKeyDown(crouchKey))
{
isCrouching = true;
movementSpeed /= 2f;
}
if (Input.GetKeyUp(crouchKey))
{
isCrouching = false;
movementSpeed *= 2f;
}
}
然后您可以使用该变量来确保您在冲刺之前没有蹲下:
private void sprintInput()
{
if (!isCrouching && Input.GetKeyDown(sprintKey))
{
movementSpeed *= 2f;
}
if (!isCrouching && Input.GetKeyUp(sprintKey))
{
movementSpeed /= 2f;
}
}
只有在不使用蹲伏变量/按钮时,才能激活冲刺修改器。
接受的答案实际上在您的游戏中造成了漏洞。玩家将按下冲刺(速度x2),按下蹲伏(速度/2),释放冲刺(什么也没有发生),然后释放蹲伏(速度x2),这将永久使他的速度加倍。
我认为更正确的方法是存储两个标志:
bool isCrouching, isSprinting;
float baseSpeed, movementSpeed;
private void sprintInput {
if (Input.GetKeyDown(sprintKey)) {
isSprinting = true;
UpdateSpeed ();
}
if (Input.GetKeyUp(sprintKey)) {
isSprinting = false;
UpdateSpeed ();
}
}
private void crouchInput {
if (Input.GetKeyDown(crouchKey)) {
isCrouching = true;
UpdateSpeed ();
}
if (Input.GetKeyUp(crouchKey)) {
isCrouching = false;
UpdateSpeed ();
}
}
private void UpdateSpeed () {
movementSpeed = isCrouching ? baseSpeed / 2
: isSprinting ? baseSpeed * 2
: baseSpeed;
}
不确定这是否是最好的解决方案,我只是一个初学者,但这对我有用,并且修复了我认为的漏洞。
public float movementSpeed;
public float baseSpeed;
public float sprintingSpeed;
public float crouchingSpeed;
void Start()
{
baseSpeed = movementSpeed;
sprintingSpeed = movementSpeed * 2;
crouchingSpeed = movementSpeed / 2;
}
private voiud MyInput(){
if (crouching == false)
{
if (Input.GetKeyDown(sprintKey))
{
movementSpeed = sprintingSpeed;
sprinting = true;
}
if (Input.GetKeyUp(sprintKey))
{
movementSpeed = baseSpeed;
sprinting = false;
}
}
if (sprinting == false)
{
if (Input.GetKeyDown(crouchKey))
{
movementSpeed = crouchingSpeed;
crouching = true;
}
if (Input.GetKeyUp(crouchKey))
{
movementSpeed = baseSpeed;
crouching = false;
}
}
}