飞机 - 防止旋转超出限制,但允许转弯

Aeroplane - prevent rotation outside limits, but allow turning

我有一个使用 Input.GetAxis 输入旋转的飞机对象。它在 z 轴和 y 轴上都限制在 100 度的运动范围内:

if (transform.eulerAngles.z < 50 || transform.eulerAngles.z > 310) {
  transform.Rotate(0f, Input.GetAxis("Horizontal"), -Input.GetAxis("Horizontal"));
}
if (transform.eulerAngles.y < 50 || transform.eulerAngles.y > 310) {
  transform.Rotate(Input.GetAxis("Vertical"), 0f, 0f);
}

按下按钮飞机向前推进,forward是飞机的朝向:

transform.position += transform.forward * Time.deltaTime * speed;

这不符合我的意愿。当平面达到旋转极限时(例如 transform.eulerAngles.z == 50),平面不再沿 'arc' 移动,因为 forward 不是直线。当它到达极限时,飞机只是直线移动。我希望它继续弧形,只是不要超出旋转限制。我希望这是有道理的?有人对我如何实现这一目标有任何提示吗?

你的问题是你在比较旋转角度和欧拉角。所以,当你达到 50 度时,就不能再旋转了。

你必须将旋转与前向矢量进行比较,并将此旋转限制为 50 度

我不敢相信解决方案如此明显...当然,我不希望 y 轴停止旋转。这是我的解决方案:

float getHorizontal;
float getVertical;

if (transform.eulerAngles.z < 50 || transform.eulerAngles.z > 310) {
  getHorizontal = Input.GetAxis("Horizontal");
} else {
  getHorizontal = 0f;
}

if (transform.eulerAngles.x < 50 || transform.eulerAngles.x > 310) {
  getVertical = Input.GetAxis("Vertical");
} else {
  getVertical = 0f;
}

transform.Rotate(getVertical, Input.GetAxis("Horizontal"), -getHorizontal);