2016-04-28 65 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