2016-04-28 20 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"; 
    } 
} 

と動き1(私は後半が必要ですが、念のために(動きが奇妙であるが、それはexacly私が欲しい1)だとは思わない):

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を(Assets/Scripts/at)にあるASquadMovement.Update()を使用して、スクワッド/自己行動/スクワッド移動/ ASquadMovement.cs:26)

答えて

1

"KeyCode.Alpha3"と他の存在しない値を組み合わせています。 enumまたはstringでこれを行うことができますが、enumは、KeyCodeが存在することを確認するため、これには適切だと思います。あなたのKeyInputクラスの

Iは、以下のコードでif文

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

public string forward; 
public string backwards; 
public string 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

非常に、それは働いた! – Canias