笔者用飞行摇杆(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. 家里路由器如何共享同一个ip
  2. MVC路由学习:自定义路由参数(用户看不到参数名),重新定义路由规则
  3. 强化学习《基于策略价值 - Adventage Actor-Critic》
  4. Kotlin学习笔记 第二章 类与对象 第二节属性
  5. RESTful Request:GET/PUT/DELETE/POST/HEAD/OPTIONS
  6. 2021高值人才职业发展洞察:连接、信任与赋能
  7. 如何选择 Offer?
  8. web项目搜索框智能提示
  9. python典型安装_python安装某些第三方包报错解决办法
  10. word三线表标题两条线之间如何出现空白间隔(论文必备)
  11. 博士申请 | 英国格拉斯哥大学赵德宗教授课题组招收无人驾驶方向全奖博士生...
  12. 校园 计算机网络设置路由器,GSWiFi路由器校园网怎么设置
  13. web性能压力测试工具:WebBench详解
  14. C#,SOAP1.1与1.2的发布与禁用(SOAP 1.2 in .NET Framework 2.0)
  15. iis网站服务器+sql server数据库服务器安全
  16. 【数据压缩】TGA文件格式分析
  17. 论文笔记(综述):Deep Learning-based Multi-focus Image Fusion: A Survey and A Comparative Study
  18. 视频教程-微信小程序项目实战之我画你猜视频课程-微信开发
  19. 网络营销实战课-笔记5
  20. WPF自学手册-读书笔记(二)心法

热门文章

  1. 1离线安装Chrome Postman 和Postman Interceptor 插件
  2. AHP层次分析法在水利中的实践技术应用
  3. android wifi adb连接不上,WIFI无线adb调试android
  4. 微信小程序 星座查询
  5. python利用OpenCV调用海康威视摄像头--利用wifi路由器提供网
  6. 【转 李茂】一个游戏程序员的学习资料
  7. DDD之3实体和值对象
  8. 恒压板框过滤实验数据处理_雅安优质实验压滤机-清源环保
  9. 【日语】标日初级上册单词(13-16)1
  10. 你最该知道的事(活着)