人的栈溢出。我想为我的学校个人项目制作一款无人机游戏。一切都很顺利,但我现在面临一个问题。我的脚本为我的无人机不会使无人机停留在一个恒定的高度,当我按下所选的按钮。换句话说,当我按E或Q时,无人机会持续上升或下降。只要我按下选定键,它就会上升。我该怎么做呢?
代码→
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Levitating : MonoBehaviour
{
Rigidbody ourDrone;
private void Awake()
{
ourDrone = GetComponent<Rigidbody>();
}
// Make the drone default velocity the same value of the gravity acceleration, with opposite direction
private Vector3 DRONE_DEFAULT_VELOCITY = new Vector3(0, 9.81f, 0);
public float upForce;
private void Update()
{
MovementUpDown();
}
private void FixedUpdate()
{
ourDrone.AddRelativeForce(DRONE_DEFAULT_VELOCITY * upForce);
}
void MovementUpDown()
{
if (Input.GetKey(KeyCode.E))
{
upForce = 15;
}
else if (Input.GetKey(KeyCode.Q))
{
upForce = -3;
}
else
{
// Resetting the force muultiplier
upForce = 1;
}
}
}
问题是你的物理是错误的。在默认模式下(upForce = 1),你抵消了重力,所以没有加速度将应用于你的rb。然而,当你按下其中一个控制按钮时,你增加了一个力,因此,根据牛顿定律,你增加了一个加速度,这将导致一个速度即使你停止按下按钮也会保持不变。现在,我不知道你为什么要这样建模,但你的问题最简单的解决方案是在你的刚体上禁用重力,直接修改rb的速度。或者在你的AddForce中使用不同的forceMode。https://docs.unity3d.com/ScriptReference/ForceMode.html use Velocity change.
如果你想模拟一架实际的无人机,就像在现实生活中一样,你应该研究控制系统,比如PID,但这可能是多余的。
祝你好运