Input.GetKeyDown在一个按键中注册多次,按下C#UNITY



按下"a";Input.GetKeyDown似乎注册了多次,是因为我正在进行的枚举的开关情况吗?下面是第一个脚本,其中GameState是";玩家选择动作";如果";a";在游戏状态下被按下";玩家选择动作,它不会只是打印";游戏状态是玩家攻击单位";但是它也会激活第二个脚本中的所有代码,即使我使用Input.GetKeyDown;a";key once只会改变游戏状态,而不会激活第二个脚本中的所有代码?

第一个脚本

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using System.Threading;
public enum GameState
{
PlayerSelectTile,
PlayerSelectAction,
PlayerMoveUnit,
PlayerPreviewAttackUnit,
PlayerAttackUnit,
EnemyTurn,
GameOver,
Convoy
}
public class GameController : MonoBehaviour
{
public static GameState CurrentState;
void Start()
{
CurrentState = GameState.PlayerSelectTile;
}
void Update()
{
switch (CurrentState)
{
case GameState.PlayerSelectAction:
if (Input.GetKeyDown(KeyCode.A))
{
CurrentState = GameState.PlayerAttackUnit;
Debug.Log("Game State is Player Attack Unit");
}

break;
case GameState.PlayerAttackUnit:
if (Input.GetKeyDown(KeyCode.S))
{
CurrentState = GameState.PlayerSelectAction;
Debug.Log("Game State is Player Select Action");
}
break;
}
}
}

第二脚本

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Threading;
public enum UFA
{
None,
Alm,
Chrom
}
public enum EFA
{
None,
Alm,
Chrom
}
public class Attacking : MonoBehaviour
{
public static int USFAbaseATK;
public static int USFAbaseDEF;
public static string USFAclass;
public static int ESFAbaseATK;
public static int ESFAbaseDEF;
public static string ESFAclass;
public static int USFAnetDMG;
public static int ESFAnetDMG;
public static int USFAbaseHP;
public static int ESFAbaseHP;
public static int USFAprevHP;
public static int ESFAprevHP;
public static int USFAnetHP;
public static int ESFAnetHP;
public static int USFAbaseSPD;
public static int ESFAbaseSPD;
public static string USFAname;
public static string ESFAname;
public static int SPDkey;
public static UFA USFA;
public static EFA ESFA;
void Start()
{
USFA = UFA.None;
ESFA = EFA.None;
}
void Update()
{
switch (GameController.CurrentState)
{
case GameState.PlayerAttackUnit:
if (Input.GetKeyDown(KeyCode.A))
{
if (USFA == UFA.Alm)
{
Debug.Log("Unit selected for attack is Alm, class " + USFAclass + ", base attack " + USFAbaseATK + ", base def " + USFAbaseDEF);
SPDkey = USFAbaseSPD - ESFAbaseSPD;
if (SPDkey > 0)
{
USFAnetDMG = 2 * (USFAbaseATK - ESFAbaseDEF);
ESFAnetDMG = 1 * (ESFAbaseATK - USFAbaseDEF);
}
if (SPDkey == 0)
{
USFAnetDMG = 1 * (USFAbaseATK - ESFAbaseDEF);
ESFAnetDMG = 1 * (ESFAbaseATK - USFAbaseDEF);
}
if (SPDkey < 0)
{
USFAnetDMG = 1 * (USFAbaseATK - ESFAbaseDEF);
ESFAnetDMG = 2 * (ESFAbaseATK - USFAbaseDEF);
}
if (ESFA == EFA.None)
{
USFAnetDMG = 0;
ESFAnetDMG = 0;
}
USFAprevHP = USFAnetHP - ESFAnetDMG;
ESFAprevHP = ESFAnetHP - USFAnetDMG;
Debug.Log(USFAname + ": HP - " + USFAbaseHP + " --> " + USFAprevHP + " | " + ESFAname + ": HP - " + ESFAbaseHP + " --> " + ESFAprevHP + " A to confirm attack");

单击某个按钮时,单击某个上的该按钮,每个帧(例如每秒约60帧(都由Update()方法表示。这意味着,当您单击按钮A时,每个Update()方法都将具有该帧的GetKeyDown(KeyCode.A) == true,而下一帧在每个Update()方法中都将为false。

您需要构建代码,以便一次只能发生一件事,例如,设置一个要求,即某些操作的游戏状态必须至少在两帧内相同。为了实现这一点,你需要保留两个状态变量,一个带有currentState(就像你今天的一样(,但也设置previousState,然后检查。。。

if (previousState == x && currentState == x) 
{
// Do thing
}

您可以尝试在第一个脚本中使用LateUpdate,并确保PlayerAttackUnit不是默认的GameState。https://docs.unity3d.com/Manual/ExecutionOrder.html