更新 X,Y,Z 浮点数和特定 While 循环方案 C#



我有2个问题想解决。

第一个问题。更改 X,Y,Z 移动并更新它。

我的游戏中有一个驾驶机制,如果用户按下,汽车就会移动。问题是我希望在按住 S(向后(直到释放时将速度从 15f 降低到 5f。

这是我的播放器脚本下面的代码。请参考 void playerwalk(( 和 backs motion((

public class Move : MonoBehaviour
{
public float speed;
private Rigidbody rb;
private int count;
public Text countText;

// Use this for initialization
void Start()
{
rb = GetComponent<Rigidbody>();
count = 0;
SetCountText();
}
void playerWalk()
{
var x = Input.GetAxis("Horizontal") * Time.deltaTime * 75f;
var z = Input.GetAxis("Vertical") * Time.deltaTime * 15f;
transform.Rotate(0, x, 0);
transform.Translate(0, 0, -z);
}
void backwardMotion()
{
if (Input.GetKeyDown(KeyCode.S))
{
var z = Input.GetAxis("Vertical") * Time.deltaTime * 5f;
}
}

void OnTriggerEnter(Collider other)
{
if (other.gameObject.CompareTag("Collectable"))
{
other.gameObject.SetActive(false);
count = count + 1;
SetCountText();
}
}
void SetCountText()
{
countText.text = "Count: " + count.ToString();
}
// Update is called once per frame
void Update () 
{
backwardMotion();
playerWalk();
}
}

这目前不会影响任何事情,虚空backwardsmotion()似乎没有任何影响。 我需要一段时间循环吗? 在 C# 中执行之前执行的语法是什么?

第二个问题:做直到循环?

对于那些没有看过我最近帖子的人,我的汽车模型上还有一个手电筒机制,如果你按 L,手电筒将打开(切换(,如果你按 S,背光将在你倒车时打开。

这是我的手电筒游戏机制代码:请参考 空隙关机灯((

public class headLights : MonoBehaviour
{
public Light frontlights;
public Light frontlights2;
public Light frontlights3;
public Light frontlights4;
public Light backlights;
public Light backlights2;
public Light backlights3;
public Light backlights4;
// Use this for initialization
void Start()
{
frontlights.enabled = !frontlights.enabled;
frontlights2.enabled = !frontlights2.enabled;
frontlights3.enabled = !frontlights3.enabled;
frontlights4.enabled = !frontlights4.enabled;
}
void switchoffLight()
{
}
// Update is called once per frame
void Update()
{
if (Input.GetKeyDown(KeyCode.L))
{
if (frontlights && frontlights2 && frontlights3 && frontlights4 != null)
{
frontlights.enabled = !frontlights.enabled;
frontlights2.enabled = !frontlights2.enabled;
frontlights3.enabled = !frontlights3.enabled;
frontlights4.enabled = !frontlights4.enabled;
}
}
if (Input.GetKeyDown(KeyCode.S))
{
if (backlights && backlights2 && backlights3 && backlights4 != null)
{
backlights.enabled = !backlights.enabled;
backlights2.enabled = !backlights2.enabled;
backlights3.enabled = !backlights3.enabled;
backlights4.enabled = !backlights4.enabled;
}
}
}

}

但是,松开 S 键时背光灯不会关闭。

我无法清楚地理解其他代码和答案是怎么回事,这就是我在这里问的原因。

提前谢谢你!我才刚刚开始上10年级的编程课,所以请像对年轻人一样解释。

按下时未对变换或旋转应用任何更改

if (Input.GetKeyDown(KeyCode.S))
{var z = Input.GetAxis("Vertical") * Time.deltaTime * 5f;         
}

这个 z 去哪儿????? 添加这个或任何你想要的"转换。翻译(0, 0, -z(;">

对于第二个问题,请在其他条件下使用 GetKeyUp(( 或在相同条件下使用 getkey

对于第一个问题,您声明了两次var z,但它们实际上是单个值。

var z = Input.GetAxis("Vertical") * Time.deltaTime * 15f; // playerWalk()

var z = Input.GetAxis("Vertical") * Time.deltaTime * 5f; // backwardMotion()

引用两个同名的不同变量z但每个变量只存在于声明它的方法中playerWalk()中的zbackwardMotion()中的z彼此无关。backwardMotion()中的z本质上没有任何用途,因为变量是声明的,但从未在方法中的任何位置使用。

实现您想要的正确方法是:

void playerWalk()
{
var x = Input.GetAxis("Horizontal") * Time.deltaTime * 75f;
var z = Input.GetAxis("Vertical") * Time.deltaTime * 15f;
if (Input.GetKeyDown(KeyCode.S))
{
// If "S" is pressed, the z speed would be reduced to 5f.
z = Input.GetAxis("Vertical") * Time.deltaTime * 5f; 
}
transform.Rotate(0, x, 0);
transform.Translate(0, 0, -z);
}

对于第二个问题,有三种获取输入的方法:Input.GetKeyDownInput.GetKeyInput.GetKeyUp

Input.GetKeyDown仅在您按下键的帧上调用一次。

Input.GetKey每按住一帧都会调用键。

Input.GetKeyUp仅在释放密钥的帧上调用一次。

在您的情况下,您的汽车背光灯会在检测到Input.GetKeyDown(KeyCode.S)时打开,但当检测到释放时,没有任何东西可以让它重新关闭。

解决方案是简单地检查释放并关闭大灯:

if (Input.GetKeyUp(KeyCode.S)) // Detects a release of "S" key
{
if (backlights && backlights2 && backlights3 && backlights4)
{
backlights.enabled = false;
backlights2.enabled = false;
backlights3.enabled = false;
backlights4.enabled = false;
}
}

最新更新