I worked on and completed this [Tutorial] (How To Build a Custom Input Manager in Unity C# - YouTube )
the day before, today I wanted to implement it in my real game and suddenly it didn’t work anymore, somehow the scripts no longer want to communicate with each other even though I only added a few variables.
There is a: public static GameManager GM;
here are the Scripts: Number 1 = GameManager.cs
public class GameManager : MonoBehaviour
{
public static GameManager GM;
public KeyCode drift { get; set; }
public KeyCode forward { get; set; }
public KeyCode backward { get; set; }
public KeyCode left { get; set; }
public KeyCode right { get; set; }
public KeyCode restart { get; set; }
public KeyCode menu { get; set; }
public KeyCode item { get; set; }
void Awake()
{
if (GM == null)
{
DontDestroyOnLoad(gameObject);
GM = this;
}
else if (GM != this)
{
Destroy(gameObject);
}
drift = (KeyCode)System.Enum.Parse(typeof(KeyCode), PlayerPrefs.GetString("driftKey", "Space"));
forward = (KeyCode)System.Enum.Parse(typeof(KeyCode), PlayerPrefs.GetString("forwardKey", "W"));
backward = (KeyCode)System.Enum.Parse(typeof(KeyCode), PlayerPrefs.GetString("backwardKey", "S"));
left = (KeyCode)System.Enum.Parse(typeof(KeyCode), PlayerPrefs.GetString("leftKey", "A"));
right = (KeyCode)System.Enum.Parse(typeof(KeyCode), PlayerPrefs.GetString("rightKey", "D"));
restart = (KeyCode)System.Enum.Parse(typeof(KeyCode), PlayerPrefs.GetString("restartKey", "R"));
menu = (KeyCode)System.Enum.Parse(typeof(KeyCode), PlayerPrefs.GetString("menuKey", "M"));
item = (KeyCode)System.Enum.Parse(typeof(KeyCode), PlayerPrefs.GetString("itemKey", "LeftControl"));
}
}
and number 2 is the UI Menu Script also in C#
public class Controlsscript : MonoBehaviour
{
Transform menuPanel;
Event keyEvent;
Text buttonText;
KeyCode newKey;
bool waitingForKey;
// Start is called before the first frame update
void Start()
{
menuPanel = transform.Find("Panel");
menuPanel.gameObject.SetActive(false);
waitingForKey = false;
for (int i = 0; i < 8; i++)
{
if (menuPanel.GetChild(i).name == "ForwardKey")
menuPanel.GetChild(i).GetComponentInChildren<Text>().text = GameManager.GM.forward.ToString();
if (menuPanel.GetChild(i).name == "BackwardKey")
menuPanel.GetChild(i).GetComponentInChildren<Text>().text = GameManager.GM.backward.ToString();
if (menuPanel.GetChild(i).name == "LeftKey")
menuPanel.GetChild(i).GetComponentInChildren<Text>().text = GameManager.GM.left.ToString();
if (menuPanel.GetChild(i).name == "RightKey")
menuPanel.GetChild(i).GetComponentInChildren<Text>().text = GameManager.GM.right.ToString();
if (menuPanel.GetChild(i).name == "DriftKey")
menuPanel.GetChild(i).GetComponentInChildren<Text>().text = GameManager.GM.drift.ToString();
if (menuPanel.GetChild(i).name == "RestartKey")
menuPanel.GetChild(i).GetComponentInChildren<Text>().text = GameManager.GM.restart.ToString();
if (menuPanel.GetChild(i).name == "MenuKey")
menuPanel.GetChild(i).GetComponentInChildren<Text>().text = GameManager.GM.restart.ToString();
if (menuPanel.GetChild(i).name == "ItemKey")
menuPanel.GetChild(i).GetComponentInChildren<Text>().text = GameManager.GM.restart.ToString();
}
}
// Update is called once per frame
void Update()
{
if (Input.GetKeyDown(KeyCode.Escape) && !menuPanel.gameObject.activeSelf)
menuPanel.gameObject.SetActive(true);
else if (Input.GetKeyDown(KeyCode.Escape) && menuPanel.gameObject.activeSelf)
menuPanel.gameObject.SetActive(false);
}
void OnGUI()
{
keyEvent = Event.current;
if (keyEvent.isKey && waitingForKey)
{
newKey = keyEvent.keyCode;
waitingForKey = false;
}
}
public void StartAssignment(string keyName)
{
if (!waitingForKey)
{
StartCoroutine(AssignKey(keyName));
}
}
public void SendText(Text text)
{
buttonText = text;
}
IEnumerator WaitForKey()
{
while (!keyEvent.isKey)
{
yield return null;
}
}
public IEnumerator AssignKey(string keyName)
{
waitingForKey = true;
yield return WaitForKey();
switch (keyName)
{
case "forward":
GameManager.GM.forward = newKey;
Debug.Log("Neuer Key");
buttonText.text = GameManager.GM.forward.ToString();
PlayerPrefs.SetString("forwardKey", GameManager.GM.forward.ToString());
break;
case "backward":
GameManager.GM.backward = newKey;
buttonText.text = GameManager.GM.backward.ToString();
PlayerPrefs.SetString("backwardKey", GameManager.GM.backward.ToString());
break;
case "left":
GameManager.GM.left = newKey;
buttonText.text = GameManager.GM.left.ToString();
PlayerPrefs.SetString("leftKey", GameManager.GM.left.ToString());
break;
case "right":
GameManager.GM.right = newKey;
buttonText.text = GameManager.GM.right.ToString();
PlayerPrefs.SetString("rightKey", GameManager.GM.right.ToString());
break;
case "drift":
GameManager.GM.drift = newKey;
buttonText.text = GameManager.GM.drift.ToString();
PlayerPrefs.SetString("driftKey", GameManager.GM.drift.ToString());
break;
case "restart":
GameManager.GM.restart = newKey;
buttonText.text = GameManager.GM.restart.ToString();
PlayerPrefs.SetString("restartKey", GameManager.GM.restart.ToString());
break;
case "menu":
GameManager.GM.menu = newKey;
buttonText.text = GameManager.GM.menu.ToString();
PlayerPrefs.SetString("menuKey", GameManager.GM.menu.ToString());
break;
case "item":
GameManager.GM.item = newKey;
buttonText.text = GameManager.GM.item.ToString();
PlayerPrefs.SetString("itemKey", GameManager.GM.item.ToString());
break;
}
yield return null;
}
public void resetAllKeybinds()
{
PlayerPrefs.DeleteKey("forwardKey");
PlayerPrefs.DeleteKey("backwardKey");
PlayerPrefs.DeleteKey("leftKey");
PlayerPrefs.DeleteKey("rightKey");
PlayerPrefs.DeleteKey("driftKey");
PlayerPrefs.DeleteKey("restartKey");
PlayerPrefs.DeleteKey("menuKey");
PlayerPrefs.DeleteKey("itemKey");
}
}
and somehow they communicated yesterday and today they don’t want to
(I just changed on or two Variable names and added a bit not changed anything important)