由于某种原因,我的代码无法正常工作...我不知道为什么。有人可以帮忙吗?我正在使用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;
}
}
控制台没有错误,我的代码看不到任何错误...
请帮助!
任何答案都非常感谢。
谢谢。
答案 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而不是使用开关来检测输入。