You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Unity移动端摇杆飞行游戏飞机90度左右转向异常问题修复请求

修复移动端摇杆飞机转向异常的问题

看起来你的飞机转向问题主要出在旋转逻辑的实现方式上,还有几个关键细节没处理对,我帮你梳理一下问题根源并给出完整的修改方案:

问题根源分析

  1. Quaternion使用错误:你直接修改Quaternion的x/y/z/w分量是完全错误的——Quaternion的内部数值不是直观的角度,不能这么直接赋值,这会导致旋转计算完全偏离预期。
  2. 旋转角度限制过小:你的maxHorizontalRotation设为0.1弧度,换算成角度只有约5.7度,这就是飞机只能轻微偏移的核心原因,完全达不到90度的转向需求。
  3. Rigidbody初始化错误Start方法里的rb.GetComponent<Rigidbody>()没有赋值给rb变量,导致后续物理移动逻辑完全失效(相当于空引用操作)。
  4. 移动方向不符合逻辑:原代码让飞机一直沿世界Z轴飞行,没有结合自身旋转方向,转向后自然不会跟着转向方向移动。

修改后的完整代码

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

public class PlaneController : MonoBehaviour {
    public Joystick joystick;
    public float forwardSpeed = 15f;
    public float horizontalTurnSpeed = 90f; // 改为角度/秒,更直观控制转向速度
    public float verticalTurnSpeed = 60f;
    public float rotationSmoothness = 5f;
    public Rigidbody rb;
    private float horizontalInput;
    private float verticalInput;

    void Start() {
        // 正确获取并初始化Rigidbody
        rb = GetComponent<Rigidbody>();
        // 锁定物理旋转,避免引擎干扰手动控制的转向逻辑
        rb.freezeRotation = true;
    }

    void Update() {
        // 统一处理移动端和PC端输入
        if (Input.touchCount > 0 || Input.GetMouseButton(0)) {
            horizontalInput = joystick.Horizontal;
            verticalInput = joystick.Vertical;
        } else {
            horizontalInput = Input.GetAxisRaw("Horizontal");
            verticalInput = Input.GetAxisRaw("Vertical");
        }

        HandlePlaneRotation();
    }

    private void FixedUpdate(){
        HandlePlaneMovement();
    }

    private void HandlePlaneMovement(){
        // 让飞机朝着自身前方向飞行,而非固定世界Z轴
        Vector3 moveDirection = transform.forward * forwardSpeed;
        // 使用MovePosition保证物理移动的稳定性
        rb.MovePosition(rb.position + moveDirection * Time.fixedDeltaTime);
    }

    private void HandlePlaneRotation(){
        // 基于欧拉角计算目标旋转,直观易控
        Vector3 targetEuler = transform.eulerAngles;
        // 水平输入控制Y轴左右转向(每秒转horizontalTurnSpeed度)
        targetEuler.y += horizontalInput * horizontalTurnSpeed * Time.deltaTime;
        // 垂直输入控制X轴俯仰
        targetEuler.x += verticalInput * verticalTurnSpeed * Time.deltaTime;

        // 平滑插值到目标旋转
        Quaternion targetRotation = Quaternion.Euler(targetEuler);
        transform.rotation = Quaternion.Lerp(transform.rotation, targetRotation, Time.deltaTime * rotationSmoothness);
    }
}

关键修改说明

  • 修复Rigidbody初始化:正确赋值rb变量,并锁定物理旋转,避免引擎干扰手动转向。
  • 重构旋转逻辑:改用欧拉角计算目标旋转,直接用角度/秒的方式设置转向速度(比如horizontalTurnSpeed = 90f就是每秒转90度,刚好符合你要的90度转向需求)。
  • 修正移动方向:让飞机朝着自身前方向飞行,转向后自然会跟随转向方向移动,符合真实飞行逻辑。
  • 简化冗余代码:移除了不必要的speedMultiplier等变量,让输入和逻辑更清晰。

额外优化建议

  • 可以添加俯仰角度限制,避免飞机过度抬头/低头:targetEuler.x = Mathf.Clamp(targetEuler.x, -30f, 30f)
  • 增加倾斜(Roll)效果,左右转向时让飞机绕Z轴倾斜,提升手感
  • 添加加速度/减速逻辑,让速度变化更平滑自然

内容的提问来源于stack exchange,提问作者Sosso

火山引擎 最新活动