笔者用飞行摇杆(Hotas X)与Unity3D进行了连接,主要是使用摇杆模拟飞行游戏,自己主要在这里分享一点遇到的问题,如有错误,还望各位大佬指正。

点击打开链接(密码 revq ),这个链接是Hotas X的使用说明书。Hotas X的图片如下:

笔者只将飞行摇杆用于PC端,至于PLAYSTATION端并没有测试。首先得了解飞行摇杆的各个轴,直接上图

要通过Unity3D获得轴信息,必须先打开Edit->Project settings->Input,增加轴的数量,自定义名称,如图:

这里有几个注意事项,如图1,必须将Type选成Joystick Axis,其中Joystick的X轴对应 X axis,Y轴对应 Y axis,Z轴对应3rd Axis,RZ轴对应4th axis,Slider 轴(rocking button)对应5th axis(此轴在LED显示红色的情况下与RZ轴的功能一致,但是当LED显示绿色的情况下,自己得手动编程实现该功能)。

特别注意,各个轴的变化都是-1~1,如果发现不连续变化,记得调节3即Sensitivity为小数字。

对于飞行摇杆上的按钮与Unity3D中的对应关系,自己可以通过一段代码查看,如下:

public KeyCode GetKeyDownCode()
    {
        foreach (KeyCode key in Enum.GetValues(typeof(KeyCode)))
        {
            if (Input.GetKeyDown(key))
            {
                Debug.Log(key.ToString());
                return key;
            }
               
        }
        return KeyCode.None;

}

控制飞机飞行的代码如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;
using System;

public class FlightControl : MonoBehaviour {
    private float startSpeed = 0.02f;//初始速度
    private float flySpeed = 0f;//飞行速度
    private float speedFlag = 0;//飞行控制标志位

private float pitchingSpeed = 0.2f;//飞机俯仰的速度
    private float rotateSpeedZ = 0.2f;//飞机绕Z轴旋转的速度
    private float rotateSpeedY = 0.2f;//飞机绕Y轴旋转的速度

private Vector3 offsetPosition; //摄像机和飞机的偏移量
    private Transform mainCamera;

public float distanceH = 15f;
    public float distanceV = 10f;

public float smoothSpeed = 10f; //平滑参数

public float before = 0f;

private void Start()
    {
        mainCamera = Camera.main.transform;
        offsetPosition = mainCamera.position - transform.position;
       
    }

private void FixedUpdate()
    {
        FlySpeedControl();
        FlyPitchingControl();
        FlyOverturnControl();
        FlyRotateControl();
        FlyRotateControl2();
    }

private void Update()
    {
        GetKeyDownCode();
    }

private void LateUpdate()
    {
        Vector3 nextpos = transform.forward * -1 * distanceH + transform.up * distanceV + transform.position;
        mainCamera.position = Vector3.Lerp(mainCamera.position, nextpos, smoothSpeed * Time.deltaTime); //平滑插值
        //mainCamera.position = nextpos;
        mainCamera.LookAt(transform);
    }
    #region
    //利用气流阀来控制飞行的速度
    private void FlySpeedControl()
    {
        
        float current = -Input.GetAxis("Accelerate");
        Debug.Log(current);
        //在Z轴的负方向,判断是加速(通过轴的返回信息判断)
        if (current >= 0&&current>=before)
        {      
            //判断飞行摇杆的气流阀是否发生了位置变化     
            if(current!=before)
                flySpeed = flySpeed + startSpeed * current;
            if (flySpeed >= 0.5f)
                flySpeed = 0.5f;
            if (current >= 0.95f)
                flySpeed = 0.5f;
            transform.Translate(new Vector3(0, 0, flySpeed));
        }
        //在Z轴的负方向,判断是减速(通过轴的返回信息判断)
        if (current >= 0 && current < before)
        {
            if (current != before)
                flySpeed = flySpeed - startSpeed * current ;
            transform.Translate(new Vector3(0, 0, flySpeed));
        }
        //在Z轴的正方向,判断是加速(通过轴的返回信息判断)
        if (current < 0 && current >= before)
        {
            if (current != before)
                flySpeed = flySpeed + startSpeed * Mathf.Abs(current) ;
            transform.Translate(new Vector3(0, 0, flySpeed));
        }
        //在Z轴的正方向,判断是减速(通过轴的返回信息判断)
        if (current < 0 && current < before)
        {
            if (current != before)
                flySpeed = flySpeed - startSpeed * Mathf.Abs(current) ;
            if (current <= -0.95f)
                flySpeed = 0f;
            transform.Translate(new Vector3(0, 0, flySpeed));
        }

before = -Input.GetAxis("Accelerate");  //上一帧率的轴返回值     
    }
    #endregion

#region
    //通过操作杆的Y轴进行俯仰的控制
    private void FlyPitchingControl()
    {
        float v = Input.GetAxis("Vertical");
        transform.Rotate(new Vector3(v * pitchingSpeed,0,0));
    }
    #endregion

#region
    // 通过操作杆的X轴进行飞机的翻转
    private void FlyOverturnControl()
    {
        float h = Input.GetAxis("Horizontal");
        transform.Rotate(new Vector3(0, 0,-h * rotateSpeedZ));
    }
    #endregion

#region
    //通过操作杆的RZ轴进行飞机的旋转
    private void FlyRotateControl()
    {
        float t = Input.GetAxis("Twist");
        transform.Rotate(new Vector3(0, t * rotateSpeedY, 0));
    }

#endregion

#region
//通过Slider Axis轴来控制飞机的旋转
    private void FlyRotateControl2()
    {
        float s = Input.GetAxis("Slider");
    }
    #endregion
    public KeyCode GetKeyDownCode()
    {

foreach (KeyCode key in Enum.GetValues(typeof(KeyCode)))
        {
            if (Input.GetKeyDown(key))
            {
                Debug.Log(key.ToString());
                return key;
            }
               
        }
        return KeyCode.None;
    }

private void OnGUI()
    {
        GUI.Label(new Rect(0,0,100,200), Math.Round(flySpeed,4).ToString());
    }

}

飞行摇杆(T.Flight Hotas X)与Unity 3D的连接相关推荐

  1. Unity 3D学习视觉脚本无需编码即可创建高级游戏

    在本课程中,您将学习如何在Unity中使用可视化脚本(以前称为Bolt)以及如何在不编写一行代码的情况下创建自己的高级游戏所需的一切.本课程将教你如何掌握可视化脚本,即使你以前没有任何关于unity或 ...

  2. Unity三维游戏开发C#编程大师班 Masterclass In C# Programing Unity 3D Game Development FPS

    本课程采用现代游戏开发(Unity 2021)的最新内容和最新技术 学习任何东西的最好方法是以一种真正有趣的方式去做,这就是这门课程的来源.如果你想了解你看到的这些不可思议的游戏是如何制作的,没有比这 ...

  3. Unity 3D为策略游戏创建地图学习教程

    MP4 |视频:h264,1280×720 |音频:AAC,44.1 KHz,2 Ch 语言:英语+中英文字幕(根据原英文字幕机译更准确) |时长:30节课(7h 42m) |大小:5 GB 含项目文 ...

  4. Unity 3D游戏代码编程学习教程 Full Guide To Unity 3D C#: Learn To Code Making 3D Games

    Unity 3D游戏代码编程学习教程 Full Guide To Unity 3D & C#: Learn To Code Making 3D Games Full Guide To Unit ...

  5. 聊聊在博客园写博客的这两年《Unity 3D脚本编程:使用C#语言开发跨平台游戏》正式出版...

    版本状态: 2016.9 第一次印刷 (2016.11 输出到台湾) 2017.1 第二次印刷 2017.5 第三次印刷 2017.5 电子书上线:Unity 3D脚本编程--使用C#语言开发跨平台游 ...

  6. 《Unity 3.x游戏开发实例》一1.5 欢迎来到Unity 3D

    本节书摘来异步社区<Unity 3.x游戏开发实例>一书中的第1章,第1.5节,作者: [加]Ryan Henson Creighton 译者: 师蓉 责编: 陈冀康,更多章节内容可以访问 ...

  7. Unity 3D:在现有的Android游戏场景中显示AdMob的横幅

    2019独角兽企业重金招聘Python工程师标准>>> 关于如何在现有的Android项目现场显示AdMob的横幅,在一个Android项目中使用一个简单的Android JAR文件 ...

  8. Unity 3D 离线协议

    在联网状态下,获得离线协议,然后导入到Untiy的协议管理器里. 以后在断网的情况下,也能离线使用Unity. 步骤: 1.生成 Request 文件.(Unity_v5.3.1f1.alf) 1) ...

  9. 再议Unity 3D

    一年前,偶发冲动,翻译了<[译] Unity3D游戏和facebook绑定(1:简介)>系列文章. 现在看有2个明显的好处, 一:给这个不温不火的博客带了top 3的人气: 二:我个人由此 ...

最新文章

  1. 6_程序员最常用的快捷键的都在这里啦 (哈哈,我不是)(20181208)
  2. bzoj 1864: [Zjoi2006]三色二叉树
  3. 中国互联网发展的两个瓶颈
  4. JSP2.0中的表达式语言(EL表达式)
  5. Linux01-学习记录
  6. php朋友圈上传多个图片不显示不出来,求教!文章分享到微信朋友圈,链接的缩略图不显示怎么解决?...
  7. python创建二维数组的方法_Python创建二维数组的正确姿势
  8. pcap封包修改服务器数据,tcprewrite批量修改pcap数据报文
  9. 派生类从基类继承的过程
  10. [CMake] include_directories 和 target_include_directories
  11. 066 模块的搜索路径
  12. c# 中崎_C# 打开钱箱支持北洋、佳博、爱普生
  13. 强制删除文件处理程序
  14. python 列表、元组、字典、集合
  15. java正则表达式匹配单引号_java - 正则表达式,用于在未被单引号或双引号括起时使用空格分割字符串...
  16. 计算机毕业设计SSM电脑配件仓储后台管理系统【附源码数据库】
  17. GICv3软件overview手册之GICv3基本功能(3)
  18. 数据结构(使用头插法实现单链表)
  19. python并集_python去并集
  20. python32模拟鼠标和键盘操作

热门文章

  1. 统计学悖论问题——罗尼哈特小姐找朋友
  2. 【blender建模功能】01 挤出类工具
  3. 如何利用MODBUS通信实现伺服内部位置控制(X3E伺服和SMART PLC)
  4. 基于YOLOv5行人车辆跟踪检测识别计数系统源码+数据集,实现出/入分别计数
  5. web沙箱支付宝功能(详细)非maven版
  6. 数学建模视频资源分享
  7. Adroid学习笔记-入门资料以及V2.3系统开发环境搭建
  8. 碎步一:根据用户喜好选择不同背景图(背景选择器)
  9. css使div元素水平并垂直的方法(4种)
  10. 北京大学肖臻老师《区块链技术与应用》ETH笔记 - 10.0 智能合约