2016-04-28 2 views
1

Я недавно занимался 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)

ответ

1

Вы являетесь компилятором «KeyCode.Alpha3» и другими значениями, которые не существуют. Вы можете сделать это с помощью enum или string, но я думаю, что enum подходит для этого, потому что он гарантирует, что KeyCode существует.

Я в вашем KeyInput классе, изменить

public string forward; 
public string backwards; 
public string hold; 

в

public KeyCode forward; 
public KeyCode backwards; 
public KeyCode hold; 

Затем замените весь, если заявление на код ниже:

//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 = KeyCode.D; 
    backwards = KeyCode.A; 
    hold = KeyCode.S; 
} 

//D Input 
if (gameObject == squadD) 
{ 

    forward = KeyCode.C; 
    backwards = KeyCode.Z; 
    hold = KeyCode.X; 
} 

Вы должны научиться C#, прежде используя Unity, или вы сделаете простые ошибки, подобные этому. Вот enum tutorial.

+0

Это позволит решить только текущую проблему с исключениями. Я не знаю, есть ли в вашем коде логическая ошибка. – Programmer

+1

ty очень, это сработало! – Canias

Смежные вопросы