为什么我的代码无法在Unity中运行? Unity C#

时间:2018-10-02 22:59:06

标签: c# unity3d scripting

由于某种原因,我的代码无法正常工作...我不知道为什么。有人可以帮忙吗?我正在使用switch语句来控制我的代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerMovement : MonoBehaviour {

    // Use this for initialization
    void Start () {

    }

    // Update is called once per frame
    void Update () {
        Vector3 pos = transform.position;
        string state = "idle";
        float vx = 0f;
        float vy = 0f;
        float playerSpeed = 2f * Time.deltaTime;

        switch (state) {
            case "idle": 
                vx = 0;
                vy = 0;

                if (Input.GetKey (KeyCode.A)) state = "left";
                if (Input.GetKey (KeyCode.D)) state = "right";
                if (!Input.GetKey (KeyCode.D) && !Input.GetKey (KeyCode.A)) state = "idle";             
                break;

            case "left":
                vx = -1 * playerSpeed;
                vy = 0;

                if (Input.GetKey (KeyCode.A)) state = "left";
                if (Input.GetKey (KeyCode.D)) state = "right";
                if (!Input.GetKey (KeyCode.D) && !Input.GetKey (KeyCode.A)) state = "idle";             
                break;

            case "right":
                vx = playerSpeed;
                vy = 0;

                if (Input.GetKey (KeyCode.A)) state = "left";
                if (Input.GetKey (KeyCode.D)) state = "right";
                if (!Input.GetKey (KeyCode.D) && !Input.GetKey (KeyCode.A)) state = "idle";             
                break;
        }
        vx += pos.x;
        vy += pos.y;
        pos += transform.position;

    }
}

控制台没有错误,我的代码看不到任何错误...

请帮助!

任何答案都非常感谢。

谢谢。

2 个答案:

答案 0 :(得分:2)

您正在评估每种开关情况下的输入,而不是在评估开关之前。您还要检查输入内容,然后检查输入内容,因此只需使用else来清理这些检查。除了vy = 0之外,您什么也没做,因此请不要设置以下内容:

if (Input.GetKey (KeyCode.A))
    state = "left";
else if (Input.GetKey (KeyCode.D)) // if you hold both A and D, A will get priority
    state = "right";
else
    state = "idle";
switch(state)
{
    case("idle")
        vx = 0;
        break;
    case("left")
        vx = playerSpeed;
        break;
    case("right")
        vx = -1 * playerSpeed;
        break;
}

您也没有将值正确地添加到变换的位置,只是将它们添加到临时变量pos(根本不需要的变量)中:

vx += pos.x;
vy += pos.y;
pos += transform.position;

应该是:

transform.position.Translate(vx, vy, 0);

我还想指出,开关本身是完全没有意义的,但是我回答了这个问题,因此很清楚做错了什么。您应该只在vx / if / else if语句中设置else值。

答案 1 :(得分:1)

您知道,我感觉每次都将“状态”重置为“空闲”。您可以尝试移动string state = "idle"; Start()函数吗 然后将此state = "idle";添加到其他位置,例如

的底部
   vx += pos.x;
   vy += pos.y;
   pos += transform.position;

您看到您有一个开关盒。哪一次将通过代码,您看到这些中断了吗?这就是为什么他们不输入或接收vx和vy上的值更改的原因。我建议您只使用If Else而不是使用开关来检测输入。