unity3d输入与控制——键盘事件

Unity3D 开发中的触摸事件和键盘事件详解 Unity3D是一款强大的游戏开发引擎,可以用于开发各种类型的游戏,包括PC、移动设备和虚拟现实等平台。在Unity3D开发中,触摸事件和键盘事件是非常重要的交互方式。本文将详细介绍Unity3D开发中的触摸事件和键盘事件,包括技术详解和代码实现。对惹,这里有一个游戏开发交流小组,希望大家可以点击进来一起交流一下开发经验呀!一、触摸事件触摸事件简介在移动设备上,触摸事件是用户与游戏进行交互的主要方式。Unity3D提供了丰富的触摸事件接口,可以方便地处理触摸屏幕、滑动、缩放等操作。触摸事件的类型。 阅读详情
AI摘要

本文详细介绍了Unity中如何使用Input库监听键盘事件,包括按下事件、抬起事件和长按事件等,并提供了一个组合按键实例,展示了如何实现经典格斗游戏中的大招功能。

在游戏中,玩家控制主角移动,按键攻击,选择行走。都需要在程序中监听玩家的输入。unity为开发者提供了input库,来支持键盘事件,鼠标事件以及触摸事件。本文主要回顾键盘事件,以后会逐文复习鼠标以及触摸事件。


键盘事件

一般的PC键盘有104个不同的按键,在程序中通过监听这些按键事件,从而进一步执行逻辑操作。如:射击游戏中,W表示前进,S表示后退,A表示左移,D表示右移。


按下事件

在脚本中,用input。GetKeyDown( )方法将按键值作为参数,监听此按键是否被按下。按下返回true,否者返回false。

    using UnityEngine;  
    using System.Collections;  
      
    public class Script_07_01 : MonoBehaviour  
    {  
      
        void Update ()   
        {  
            if (Input.GetKeyDown (KeyCode.W))  
            {  
                Debug.Log("您按下了W键");  
            }  
              
            if (Input.GetKeyDown (KeyCode.S))  
            {  
                Debug.Log("您按下了S键");  
            }  
              
            if (Input.GetKeyDown (KeyCode.A))  
            {  
                Debug.Log("您按下了A键");  
            }  
              
            if (Input.GetKeyDown (KeyCode.D))  
            {  
                Debug.Log("您按下了D键");  
            }  
              
            if (Input.GetKeyDown (KeyCode.Space))  
            {  
                Debug.Log("您按下了空格键");  
            }  
        }  
    }  


运行:




抬起事件

抬起事件完全依赖与按下事件,因为只有按下才有抬起。我们用Input.GetKeyUp( )方法监听抬起事件,按键抬起后,返回true,否则返回false。

    using UnityEngine;  
    using System.Collections;  
      
    public class Script_07_02 : MonoBehaviour  
    {  
      
        void Update ()   
        {  
            //按下事件  
            if (Input.GetKeyDown (KeyCode.W))  
            {  
                Debug.Log("您按下了W键");  
            }  
              
            if (Input.GetKeyDown (KeyCode.S))  
            {  
                Debug.Log("您按下了S键");  
            }  
              
            if (Input.GetKeyDown (KeyCode.A))  
            {  
                Debug.Log("您按下了A键");  
            }  
              
            if (Input.GetKeyDown (KeyCode.D))  
            {  
                Debug.Log("您按下了D键");  
            }  
              
            if (Input.GetKeyDown (KeyCode.Space))  
            {  
                Debug.Log("您按下了空格键");  
            }  
              
            //抬起按键  
            if (Input.GetKeyUp (KeyCode.W))  
            {  
                Debug.Log("您抬起了W键");  
            }  
              
            if (Input.GetKeyUp (KeyCode.S))  
            {  
                Debug.Log("您抬起了S键");  
            }  
              
            if (Input.GetKeyUp (KeyCode.A))  
            {  
                Debug.Log("您抬起了A键");  
            }  
              
            if (Input.GetKeyUp (KeyCode.D))  
            {  
                Debug.Log("您抬起了D键");  
            }  
              
            if (Input.GetKeyUp (KeyCode.Space))  
            {  
                Debug.Log("您抬起了空格键");  
            }  
          
        }  
    }  


运行:




长按事件
长按事件是监听某一按键是否处于一直按下的状态,通过Input.GetKey( )来判断键盘中某一按键是否被一直按着。

    using UnityEngine;  
    using System.Collections;  
      
    public class Script_07_03 : MonoBehaviour   
    {  
        //记录某按键按下的帧数  
        int keyFrame = 0;  
          
      
        void Update ()  
        {  
          
            if (Input.GetKeyDown (KeyCode.A))  
            {  
                Debug.Log("A按下一次");  
            }     
            if (Input.GetKey (KeyCode.A))  
            {  
                //记录按下的帧数  
                keyFrame++;  
                Debug.Log("A连按:" + keyFrame+"帧");  
            }  
            if (Input.GetKeyUp (KeyCode.A))  
            {  
                //抬起后清空帧数  
                keyFrame=0;  
                Debug.Log("A按键抬起");  
            }     
        }  
    }  

运行:





任意键事件
在程序中还可以监听按键中的任意按键是否被按下,常见于加载完游戏后,按任意键进入。
    using UnityEngine;  
    using System.Collections;  
      
    public class Script_07_04 : MonoBehaviour   
    {  
      
        //记录某按键按下的帧数  
        int keyFrame = 0;  
          
        // Update is called once per frame  
        void Update ()  
        {  
            if(Input.anyKeyDown)  
            {  
                //清空按下帧数  
                keyFrame=0;  
                Debug.Log("任意键被按下");  
            }  
              
              
            if(Input.anyKey)  
            {  
                keyFrame++;  
                Debug.Log("任意键被长按"+keyFrame+"帧");  
            }  
          
        }  
    }  


运行:



实例——组合按键

在经典的格斗游戏中,会有组合键发出牛逼的大招,而这个功能的事件思路其实不难:在玩家按下某一键后,便开始时间记数,在某一时间内按出所需要的键便发出大招。
    using UnityEngine;  
    using System.Collections.Generic;  
    using System;  
      
    public class Script_07_05 : MonoBehaviour   
    {  
      
        //方向键上的贴图  
        public Texture imageUp;  
        //方向键下的贴图  
        public Texture imageDown;  
        //方向键左的贴图  
        public Texture imageLeft;  
        //方向键右的贴图  
        public Texture imageRight;  
        //按键成功的贴图  
        public Texture imageSuccess;  
          
        //自定义方向键的储存值  
        public const int KEY_UP = 0;  
        public const int KEY_DOWN = 1;  
        public const int KEY_LEFT = 2;  
        public const int KEY_RIGHT = 3;  
        public const int KEY_FIRT = 4;  
          
        //连续按键的事件限制  
        public const int FRAME_COUNT = 100;  
        //仓库中储存技能的数量  
        public const int SAMPLE_SIZE = 3;  
        //每组技能的按键数量  
        public const int SAMPLE_COUNT = 5;  
        //技能仓库  
        int[,] Sample =   
        {  
            //下 + 前 + 下 + 前 + 拳  
            {KEY_DOWN,KEY_RIGHT,KEY_DOWN,KEY_RIGHT,KEY_FIRT},  
            //下 + 前 + 下 + 后 + 拳  
            {KEY_DOWN,KEY_RIGHT,KEY_DOWN,KEY_LEFT,KEY_FIRT},  
            //下 + 后 + 下 + 后 + 拳  
            {KEY_DOWN,KEY_LEFT,KEY_DOWN,KEY_LEFT,KEY_FIRT},  
        };  
          
        //记录当前按下按键的键值  
        int  currentkeyCode =0;  
        //标志是否开启监听按键  
        bool startFrame = false;  
        //记录当前开启监听到现在的时间  
        int  currentFrame = 0;  
        //保存一段时间内玩家输入的按键组合  
        List<int> playerSample;  
        //标志完成操作  
        bool isSuccess= false;  
          
        void Start()  
        {  
            //初始话按键组合链表  
            playerSample  = new List<int>();  
        }  
          
        void OnGUI()  
        {  
            //获得按键组合链表中储存按键的数量  
            int size = playerSample.Count;  
            //遍历该按键组合链表  
            for(int i = 0; i< size; i++)  
            {  
                //将按下按键对应的图片显示在屏幕中  
                int key = playerSample[i];  
                Texture temp = null;  
                switch(key)  
                {  
                case KEY_UP:  
                    temp = imageUp;  
                    break;  
                case KEY_DOWN:  
                    temp = imageDown;  
                    break;  
                case KEY_LEFT:  
                    temp = imageLeft;  
                    break;  
                case KEY_RIGHT:  
                    temp = imageRight;  
                    break;  
                }  
                if(temp != null)  
                {  
                    GUILayout.Label(temp);  
                }  
            }  
              
            if(isSuccess)  
            {  
                //显示成功贴图  
                GUILayout.Label(imageSuccess);  
            }  
            //默认提示信息  
            GUILayout.Label("连续组合按键1:下、前、下、前、拳");  
            GUILayout.Label("连续组合按键2:下、前、下、后、拳");  
            GUILayout.Label("连续组合按键2:下、后、下、后、拳");  
        }  
          
        void Update ()   
        {  
            //更新按键  
            UpdateKey();  
              
            if(Input.anyKeyDown)  
            {  
                  
                if(isSuccess)  
                {  
                    //按键成功后重置  
                    isSuccess = false;  
                    Reset();  
                }  
                  
                if(!startFrame)  
                {  
                    //启动时间计数器  
                    startFrame = true;  
                }  
                  
                //将按键值添加如链表中  
                playerSample.Add(currentkeyCode);  
                //遍历链表  
                int size = playerSample.Count;  
                if(size == SAMPLE_COUNT)  
                {  
                    for(int i = 0; i< SAMPLE_SIZE; i++)  
                    {  
                        int SuccessCount = 0;  
                        for(int j = 0; j< SAMPLE_COUNT; j++)  
                        {  
                            int temp = playerSample[j];  
                            if(temp== Sample[i,j]){  
                                SuccessCount++;  
                            }  
                        }  
                        //玩家按下的组合按键与仓库中的按键组合相同表示释放技能成功  
                        if(SuccessCount ==SAMPLE_COUNT)  
                        {  
                            isSuccess = true;  
                            break;  
                        }  
                    }  
                      
                }  
            }  
              
            if(startFrame)  
            {  
                //计数器++  
                currentFrame++;  
            }  
              
            if(currentFrame >= FRAME_COUNT)  
            {  
                //计数器超时  
                if(!isSuccess)  
                {  
                    Reset();  
                }  
            }  
        }  
          
         void Reset ()  
         {  
            //重置按键相关信息  
            currentFrame = 0;  
            startFrame = false;  
            playerSample.Clear();  
         }  
          
        void UpdateKey()  
        {  
            //获取当前键盘的按键信息  
            if (Input.GetKeyDown (KeyCode.W))  
            {  
                currentkeyCode = KEY_UP;  
            }  
            if (Input.GetKeyDown (KeyCode.S))  
            {  
                currentkeyCode = KEY_DOWN;  
            }  
            if (Input.GetKeyDown (KeyCode.A))  
            {  
                currentkeyCode = KEY_LEFT;  
            }  
            if (Input.GetKeyDown (KeyCode.D))  
            {  
                currentkeyCode = KEY_RIGHT;  
            }  
            if (Input.GetKeyDown (KeyCode.Space))  
            {  
                currentkeyCode = KEY_FIRT;  
            }  
        }  
          
    }  

按s,d,s,d,空格:

原文地址:http://blog.youkuaiyun.com/u013289188/article/details/38346047?utm_source=tuicool&utm_medium=referral


【Unity入门】15.鼠标输入和键盘输入 今天学习Unity的鼠标输入和键盘输入~ 阅读详情

相关推荐

Unity中打开键盘+平板打开键盘+windows打开默认小键盘

一、目的 1、想知道:Unity中打开默认键盘 二、参考 1、Unity之修改UGUI中InputFiled输入框调用的键盘类型 http://blog.sina.com.cn/s/blog_130250de50102w3ec.html 总结:待检测 三、操作:一:完成:电脑、平板打开默认键盘 1、 /// <summary>【屏幕键盘】 </summary> private TouchScreenKeyboard keyboa...

qq_40544338的博客 1547

【Unity 3D】学习笔记四十六:输入与控制——键盘事件

在游戏中,玩家控制主角移动,按键攻击,选择行走。都需要在程序中监听玩家的输入。unity为开发者提供了input库,来支持键盘事件,鼠标事件以及触摸事件。本文主要回顾键盘事件,以后会逐文复习鼠标以及触摸事件。 键盘事件 一般的PC键盘有104个不同的按键,在程序中通过监听这些按键事件,从而进一步执行逻辑操作。如:射击游戏中,W表示前进,S表示后退,A表示左移,D表示右移。

零逸Space 3万+

Unity3D产品交互控制脚本实现指南

htmltable {th, td {th {pre {简介:Unity3D中实现产品展示的拖拽、旋转和缩放功能是游戏与应用开发中常见的需求。本文将介绍如何编写控制脚本以处理用户输入事件,实现物体的平移、旋转及碰撞检测。通过展示拖拽脚本的核心代码和实现方法,本文将帮助开发者掌握相关技术点,包括鼠标事件处理、变换控制、碰撞检测以及高级特性如平滑跟随和触摸屏支持,从而创建出更加生动和交互性强的产品展示场景。

weixin_42452483的博客 1121

unity学习笔记(二)——键盘、鼠标事件

unity学习笔记

ximi2231的博客 1156

我的老款Intel MacBook Pro,如何用OpenVINO把本地大模型推理速度提升10倍?

本文详细介绍了如何在老款Intel MacBook Pro上使用OpenVINO工具包将本地大模型推理速度提升10倍。通过对比Ollama CPU原生、Transformers原生和OpenVINO优化三种方案,展示了OpenVINO在性能优化上的显著优势,并提供了从环境配置到模型转换、性能调优的完整实战指南。

weixin_28694295的博客 302

Linux 命令之 localectl -- 控制系统的本地化与键盘布局

文章目录命令介绍常用选项参考示例(一)显示当前的本地化设置与键盘映射(二)设置系统的本地化字符集环境变量(三)列出本地所有字符集(四)列出所有可用的控制台键盘映射(五)设置控制台的键盘映射 命令介绍 localectl 命令可用于查询与修改系统的本地化(locale)与键盘布局的设置。 它通过与 systemd-localed.service 通信来修改例如 /etc/locale.conf 与 /etc/vconsole.conf 之类的配置文件。本地化设置控制着 用户界面的语言、字符类型与字符编码、 日

liaowenxiong的博客 5396

Unity3D 游戏引擎之感应IOS设备旋转与iPhone键盘事件(十六)

Unity3D 游戏引擎之感应IOS设备旋转与iPhone键盘事件雨松MOMO原创文章如转载,请注明:转载至我的独立域名博客雨松MOMO程序研究院,原文地址:http://www.xuanyusong.com/archives/556 iPhone iPad iTouch 旋转设备都支持屏幕4个方向的任意旋转,那么强大的Unity3D 游戏引擎当然也支持啦,虽然很多游戏都为了避免麻烦强制的不让屏幕

雨松MOMO的程序世界专栏 1万+

基于Android平台下的健康管理APP/基于android的健康管理系统

随着网络科技的发展,移动智能终端逐渐走进人们的视线,相关应用越来越广泛,并在人们的日常生活中扮演着越来越重要的角色。因此,关键应用程序的开发成为影响移动智能终端普及的重要因素,设计并开发实用、方便的应用程序具有重要的意义和良好的市场前景。Android技术作为当前最流行的操作平台,自然也存在着大量的应用服务需求。 本课题研究的是基于Android技术平台的健康管理APP,开发这款健康管理APP主要是为了帮助用户可以不用约束时间与地点进行所需信息。本文详细讲述了健康管理APP的界面设计及使用,主要包括界面的

m0_73706453的博客 1437

Unity入门06——Unity重要组件和API(3)

Input和Screen,Camera

weixin_45274937的博客 1064

IMU卡尔曼滤波方法详细介绍

本文介绍了基于IMU和卡尔曼滤波的状态估计方法。系统采用9维状态向量(位置、速度、加速度计零偏),通过牛顿运动学建立状态方程,并利用外部位置观测进行校正。详细推导了状态转移矩阵和控制输入矩阵的形式,阐述了预测和更新的计算步骤。同时说明了过程噪声Q和观测噪声R的设置原则,其中Q反映模型不确定性,R取决于传感器精度。该方法可有效融合IMU测量与外部观测数据,实现位置、速度和偏置的联合估计。

haing2019的博客 757

欧姆龙PLC与fanuc发那科机器人进行Ethrenet ip通信测试

近期在做发那科FANUC的通讯,会吧CC-LINK、Profibus-DP、Profinet I/O、DeviceNet、EtherNet/IP这些常用通讯做成文档发上来,大家喜欢的话可以关注 注:做对应的通讯,在机器人控制柜都需要安装对应的板卡以及软件功能 截图中的程序设置和机器人EDS插件在下面链接 https://download.youkuaiyun.com/download/gojava/13770799 PLC为主站 机器人为从站 一、硬件部分 欧姆龙PLC ...

七兔自习室 1万+

游戏设计模式---------命令模式(Command)

定义 将各种命令操作设计成类进行保存,使用时调用类的对象来实现操作。 优点: 操作设计成类后,相比于将操作封装成函数,在引起执行操作的条件不变时想要改变操作内容就不需要更改函数源代码,只需要获取新操作的对象。(例如游戏中K键代表攻击,当人物武器不同时,执行攻击时的动作不同。当需要获得新武器时,不需要更改函数代码去改变攻击动作,只需要设计新的攻击动作类,返回给人物调用即可) 容易实现撤销(UNDO...

qq_41655524的博客 2452

线性自抗扰控制(LADRC)系统算法框图

NLADRC自抗扰控制从Simulink仿真到PLC控制实现_自抗扰控制器 simulink仿真-优快云博客本文介绍了如何将ADRC自抗扰控制算法从Simulink仿真应用到PLC控制中,包括Simulink框图、TD微分器模型、MATLAB函数的使用、SCL控制代码,以及非线性状态误差反馈控制率的实现。提供了详细的MATLAB仿真步骤和PLC源代码链接。ADRC自抗扰控制算法(含梯形图完整源代码和算法公式)_adrc算法-优快云博客。

RXXW_Dor的博客 1463

某某的上下、左右旋转

Vector3 cameraRotate;//摄像机旋转向量 (Vector3 cameraRotate相当于transform.position;) float speed = 5f;//摄像机移动速度 void Start () { } void Update () { float x = Input.GetAxis("Mouse X");//通过鼠标晃动获取X轴的值 float y = Input.GetAxis("Mouse Y");//通过鼠标晃动获取Y轴的值 c.

小白上路 1171

060、模型蒸馏:把扩散模型压进单步的魔法

《端侧文生图模型蒸馏实战:从32步到1步的优化之道》摘要:针对边缘设备部署难题,本文分享了扩散模型蒸馏的核心经验。通过重构损失函数(感知损失+对抗训练+KL散度)、优化采样轨迹截取策略和改造学生模型架构,成功将Stable Diffusion压缩至单步推理。关键发现包括:小批量训练更有效、标签平滑保障生成多样性、双模型策略平衡质量与速度。在Cortex-A53芯片上实现300ms内生成,内存占用控制在200MB以下。特别强调工业部署需权衡压缩率与稳定性,建议保留迭代模式开关以适配不同场景需求。

2601_95651806的博客 150

博途S7-1500T 使用工艺对象驱动液压轴(含SimaHydTO库)

利用工艺对象控制液压轴位置含PLC控制和仿真程序文档资料下载地址如下:液压比例伺服阀的相关应用知识请参看下面的博客文章:液压位置闭环控制(比例伺服阀应用)_RXXW_Dor的博客-优快云博客。

RXXW_Dor的博客 2899

Unity3D 游戏引擎之感应IOS设备旋转与iPhone键盘事件(十六)【转】

http://blog.youkuaiyun.com/xys289187120/article/details/6993977 Unity3D 游戏引擎之感应IOS设备旋转与iPhone键盘事件 雨松MOMO原创文章如转载,请注明:转载至我的独立域名博客雨松MOMO程序研究院,原文地址:http://www.xuanyusong.com/archives/556 ...

weixin_30394251的博客 88

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

unity3d中的GetKey与GetKeyDown函数

参考unity官方关于GetKeyDown的API(https://docs.unity3d.com/ScriptReference/Input.GetKeyDown.html),解释是:当开始按下指定名称按键的那一帧返回为真,也就是说该函数是判断鼠标按下的动作,因为在unity中每一帧都会重置,所以,持续按着键与按一次键的效果一样(因为判断的是鼠标按下的动作),如果想让GetKeyDown函数返...

Edward_Y_Y_Zhao的博客 7273

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Unity3D笔记十六 输入输出-键盘事件、鼠标事件

  输入与控制操作Unity为开发者提供了Input类库,其中包括键盘事件、鼠标事件和触摸事件等一切跨平台所需要的控制事件。 一、键盘事件    1、按下事件     Input.GetKeyDown():如果按键被按下,该方法将返回true,没有按下则返回false。 // Update is called once per frame void Update ()...

weixin_34417814的博客 830

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Unity3D 游戏引擎之感应IOS设备旋转与iPhone键盘事件

Unity3D 游戏引擎之感应IOS设备旋转与iPhone键盘事件 雨松MOMO原创文章如转载,请注明:转载至我的独立域名博客雨松MOMO程序研究院,原文地址:http://www.xuanyusong.com/archives/556 iPhone iPad iTouch 旋转设备都支持屏幕4个方向的任意旋转,那

AnYuanLzh 1644

Unity3D 键盘控制控件移动脚本

Unity移动详解 1.通过键盘事件控制输入 public float m_speed = 5f; //Translate移动控制函数 void MoveControlByTranslate() { if (Input.GetKey(KeyCode.W)|Input.GetKey(KeyCode.UpArrow)) //前 {

Whale 3267

【Unity3D入门教程】鼠标和键盘输入与控制

本文讲述了怎样进行鼠标和键盘的输入信息检测。外部设备输入检测需要每一帧运行,所以检测的函数需要写在Update函数中。本文讲的内容比较简单,直接上代码吧。 using UnityEngine; using System.Collections; public class InputMethod : MonoBehaviour { int mPres...

weixin_34248118的博客 200
上一篇: unity3d KeyCode各键值说明
下一篇: Unity中触摸和鼠标操作的几个问题
cbbbc
博客等级 码龄15年 609粉丝 37原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值