Я недавно занимался C#. дело в том, что у меня есть несколько игровых объектов с таким же движением, которые получают разные входы, находятся в разных слоях и атакованы несколькими врагами на этих слоях, поэтому, чтобы спасти меня от утомительной работы, я попытался использовать один и тот же движок для всех из них. У меня есть сценарий, который оценивает разные тексты для переменных строк, которые позже используются для указания имени ключа в сценарии движения. Это явно не дает мне ошибок при вводе текста, но он тоже не работает, я не знаю, возможно ли то, что я хочу сделать, или если я написал это неправильно. Я стал диким, но он легитимным.Unity C# Переменный ввод
Здесь InputScript:
public string forward;
public string backwards;
public string hold;
GameObject squadA;
GameObject squadB;
GameObject squadC;
GameObject squadD;
void Start() {
squadA = GameObject.Find ("Squad A");
squadB = GameObject.Find ("Squad B");
squadC = GameObject.Find ("Squad C");
squadD = GameObject.Find ("Squad D");
//A Input
if (gameObject == squadA) {
forward = "KeyCode.Alpha3";
backwards = "KeyCode.Alpha1";
hold = "KeyCode.Alpha2";
}
//B Input
if (gameObject == squadB) {
forward = "KeyCode.E";
backwards = "KeyCode.D";
hold = "KeyCode.W";
}
//C Input
if (gameObject == squadC) {
forward = "D";
backwards = "A";
hold = "S";
}
//D Input
if (gameObject == squadD) {
forward = "C";
backwards = "Z";
hold = "X";
}
}
И движение один (я не думаю, что вторая половина является необходимым, но только в том случае (движение странно, но это exacly что я хочу)):
public float constantSpeed = 3;
float counterConstantSpeed = -3;
float speed;
float spawnpos;
public bool goingBackwardsOrStatic = true;
public bool holding =false;
KeyInput ScriptBeholderKI;
void Start() {
spawnpos = transform.position.x;
ScriptBeholderKI = gameObject.GetComponent <KeyInput>();
}
//Key inputs
void Update() {
transform.Translate (constantSpeed * Time.deltaTime, 0, 0);
if (Input.GetKeyDown (ScriptBeholderKI.forward)) {
StopAllCoroutines();
StartCoroutine (RightMovement(0f));
}
if (Input.GetKeyDown (ScriptBeholderKI.backwards)) {
StopAllCoroutines();
StartCoroutine (LeftMovement(0f));
}
if (Input.GetKeyDown (ScriptBeholderKI.hold)) {
StopAllCoroutines();
StartCoroutine (Hold(0f));
}
}
//Movement itself (Right, Left, hold)
IEnumerator RightMovement (float Rloop) {
while (transform.position.x < constantSpeed * Time.time + spawnpos + 16) {
goingBackwardsOrStatic = false;
speed = 10f;
transform.Translate (speed * Time.deltaTime, 0, 0);
yield return new WaitForSeconds (Rloop);
}
if (transform.position.x > constantSpeed * Time.time + spawnpos + 15.9) {
StopAllCoroutines();
StartCoroutine (LeftMovement (0f));
}
}
IEnumerator LeftMovement (float Lloop) {
goingBackwardsOrStatic = true;
while (transform.position.x > constantSpeed * Time.time + spawnpos) {
speed = -7f;
transform.Translate (speed * Time.deltaTime, 0, 0);
yield return new WaitForSeconds (Lloop);
}
}
IEnumerator Hold (float Lloop) {
holding = true;
while (transform.position.x > constantSpeed *Time.time + spawnpos) {
transform.Translate (counterConstantSpeed * Time.deltaTime, 0, 0);
yield return new WaitForSeconds (Lloop);
}
}
это дает мне следующую ошибку позже игрока:
ArgumentException: Ввод ключа с именем: KeyCode.Alpha3 неизвестно UnityE ngine.Input.GetKeyDown (имя System.String) (в C: /buildslave/unity/build/artifacts/generated/common/runtime/UnityEngineInputBindings.gen.cs: 533) ASquadMovement.Update() (в Assets/Scripts/Squad/Self behavoiurs/Движение отрядов/ASquadMovement.cs: 26)
Это позволит решить только текущую проблему с исключениями. Я не знаю, есть ли в вашем коде логическая ошибка. – Programmer
ty очень, это сработало! – Canias