You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity3D移动端数字摇杆实现飞机模拟器操控技术咨询

移动端数字摇杆操控飞机的实现思路(C#/Unity场景)

核心逻辑设计

  • 触摸输入捕获:在移动端识别触摸点的位置变化,区分摇杆的有效触摸区域(可选择固定位置的底座式摇杆,或跟随触摸触发点的浮动摇杆)
  • 输入轴归一化:将触摸点相对摇杆中心的偏移量,转换为范围-1到1的X/Y轴输入值,以此映射飞机的俯仰、滚转等操控动作

代码实现步骤

1. 构建摇杆UI

在Unity中创建两个Image组件:一个作为摇杆底座(固定/浮动区域),一个作为可拖动的摇杆手柄,调整好层级和锚点适配移动端屏幕。

2. 编写摇杆输入处理脚本

using UnityEngine;
using UnityEngine.EventSystems;

public class DigitalJoystick : MonoBehaviour, IDragHandler, IPointerDownHandler, IPointerUpHandler
{
    [SerializeField] private RectTransform joystickBackground;
    [SerializeField] private RectTransform joystickHandle;
    private Vector2 inputAxis;
    private float joystickRadius;

    private void Start()
    {
        // 计算摇杆有效活动半径
        joystickRadius = joystickBackground.rect.width / 2f;
    }

    public void OnPointerDown(PointerEventData eventData)
    {
        // 浮动摇杆可在此处将底座移动到触摸位置
        OnDrag(eventData);
    }

    public void OnDrag(PointerEventData eventData)
    {
        // 将屏幕触摸坐标转换为摇杆底座的本地坐标
        Vector2 localTouchPoint;
        RectTransformUtility.ScreenPointToLocalPointInRectangle(joystickBackground, eventData.position, eventData.pressEventCamera, out localTouchPoint);

        // 限制触摸偏移在摇杆半径范围内
        localTouchPoint = Vector2.ClampMagnitude(localTouchPoint, joystickRadius);
        // 更新摇杆手柄位置
        joystickHandle.anchoredPosition = localTouchPoint;

        // 计算归一化的输入轴值(范围-1~1)
        inputAxis = localTouchPoint / joystickRadius;
    }

    public void OnPointerUp(PointerEventData eventData)
    {
        // 触摸结束后重置摇杆状态
        joystickHandle.anchoredPosition = Vector2.zero;
        inputAxis = Vector2.zero;
    }

    // 提供外部获取输入轴的接口
    public Vector2 GetInputAxis()
    {
        return inputAxis;
    }
}

3. 关联摇杆输入与飞机操控

将摇杆输入与PC端鼠标输入做统一适配,复用飞机操控逻辑:

public class PlaneController : MonoBehaviour
{
    [SerializeField] private DigitalJoystick joystick;
    [SerializeField] private float rollSpeed = 15f;
    [SerializeField] private float pitchSpeed = 15f;
    [SerializeField] private float inputSmoothTime = 0.1f;
    
    private Vector2 currentInput;
    private Vector2 inputVelocity;

    private void Update()
    {
        Vector2 targetInput;
        // 区分移动端与PC端输入
        if (Application.isMobilePlatform)
        {
            targetInput = joystick.GetInputAxis();
        }
        else
        {
            // PC端鼠标输入转换为轴值
            targetInput = new Vector2(Input.GetAxis("Mouse X"), Input.GetAxis("Mouse Y"));
        }

        // 输入平滑处理,避免操控抖动
        currentInput = Vector2.SmoothDamp(currentInput, targetInput, ref inputVelocity, inputSmoothTime);

        // 将输入映射到飞机姿态控制
        transform.Rotate(Vector3.right, -currentInput.y * pitchSpeed * Time.deltaTime);
        transform.Rotate(Vector3.up, currentInput.x * rollSpeed * Time.deltaTime);
    }
}

关键优化点

  • 屏幕适配:调整摇杆UI的锚点和大小,确保在不同分辨率设备上的触摸区域合理
  • 死区设置:可在摇杆输入逻辑中加入阈值判断,当输入轴值小于0.1左右时视为无输入,避免误触
  • 浮动摇杆可选:若采用浮动摇杆,可在OnPointerDown中将摇杆底座移动到触摸触发位置,提升移动端操控体验

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 17:10:26