2016-04-28 73 views
1

我最近一直在看C#。事情是:我有幾個同類運動的gameobjects接受不同的輸入,處於不同的層次,並被這些層上的多個敵人攻擊,所以,爲了節省我一些乏味的工作,我嘗試使用相同的運動腳本其中。我有一個腳本女巫估計字符串變量的不同文本,後來用於給出移動腳本的關鍵名稱。它在輸入時顯然不會給我錯誤,但它也不起作用,我不知道我想要做什麼是可能的,或者如果我寫錯了。我瘋了,但它合法。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 name)(在C:/buildslave/unity/build/artifacts/generated/common/runtime/UnityEngineInputBindings.gen.cs:533) ASquadMovement.Update()(在Assets/Scripts/Squad/Self behavoiurs/Squads movement/ASquadMovement.cs:26)

回答

1

您正在共同製作「KeyCode.Alpha3」和其他不存在的值。你可以用enumstring做到這一點,但我認爲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

非常,它的工作! – Canias