unity3d组合键盘

2016-04-26 16:24:38 cbbbc 阅读数 28243
  • Unity 值得看的500+ 技术内容列表

    Unity3D是由Unity Technologies开发的一个让玩家轻松创建诸如三维视频游戏、建筑可视化、实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。

在游戏中,玩家控制主角移动,按键攻击,选择行走。都需要在程序中监听玩家的输入。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.csdn.net/u013289188/article/details/38346047?utm_source=tuicool&utm_medium=referral


2019-07-27 16:39:01 demonyom 阅读数 251
  • Unity 值得看的500+ 技术内容列表

    Unity3D是由Unity Technologies开发的一个让玩家轻松创建诸如三维视频游戏、建筑可视化、实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。

转自:https://www.cnblogs.com/jephone/p/4409395.html

 创建下面这个脚本:

using UnityEngine;
using System.Collections;

public class CombinationKey
{
    public CombinationKey (KeyCode p,KeyCode a)
    {
        PrimaryKey = p;
        AttachKey = a;
    }

    public CombinationKey() { }
    /// <summary>
    /// 主键
    /// </summary>
    public KeyCode PrimaryKey
    {
        set { primaryKey = value; }
    }
    private KeyCode primaryKey = KeyCode.LeftControl;
    bool bPrimary = false;
    /// <summary>
    /// 附键
    /// </summary>
    public KeyCode AttachKey
    {
        set { attachKey = value; }
    }
    private KeyCode attachKey = KeyCode.E;

    /// <summary>
    /// 按下组合键后,只返回一次真
    /// </summary>
    /// <returns></returns>
    public bool ClickKey()
    {
        if (Input.GetKeyDown(primaryKey))
        {
            bPrimary = true;
        }
        if (Input.GetKeyUp(primaryKey))
        {
            bPrimary = false;
        }
        if (bPrimary)
        {
            if (Input.GetKeyDown(attachKey))
            {
                return true;
            }
            else
            {
                return false;
            }
        }
        else
        {
            return false;
        }
    }
    /// <summary>
    /// 按下组合键后,一直返回真,直到松开
    /// </summary>
    /// <returns></returns>
    public bool PressKey()
    {
        if (Input.GetKeyDown(primaryKey))
        {
            bPrimary = true;
        }
        if (Input.GetKeyUp(primaryKey))
        {
            bPrimary = false;
        }
        if (bPrimary)
        {
            if (Input.GetKey(attachKey))
            {
                Debug.Log("d");
                return true;
            }
            else
            {
                return false;
            }
        }
        else
        {
            return false;
        }
    }
    //void Update()
    //{
    //    ClickKey();
    //    PressKey();
    //}
}

使用上面的脚本:

using UnityEngine;
using System.Collections;

public class test : MonoBehaviour
{
    CombinationKey mKey = new CombinationKey(KeyCode.LeftControl, KeyCode.E);
    void Update()
    {
        if(mKey.ClickKey()) {Debug.Log("Click");}          
    }
}

 

2017-08-31 12:56:35 JeterPong 阅读数 814
  • Unity 值得看的500+ 技术内容列表

    Unity3D是由Unity Technologies开发的一个让玩家轻松创建诸如三维视频游戏、建筑可视化、实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。

前言:
前面介绍过,鼠标控制 视觉移动文章,现在用键盘实现视觉移动,并可以让鼠标和键盘自由切换来控制当前角色的视觉移动。

脚本如下(C#):

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

public class Camera_move : MonoBehaviour {

    public int speed = 5;
    public Transform bullet;

    // mouse view enum
    public enum RotationAxes
    {
        MouseXAndY = 0,
        MouseX = 1,
        MouseY =2
    }

    public RotationAxes m_axes = RotationAxes.MouseXAndY;
    // 鼠标敏感度
    public float m_sensitivityX = 10f;
    public float m_sensitivityY = 10f;
    // 水平方向 上的 视角旋转范围
    public float m_minimumX = -360f;
    public float m_maximumX = 360f;
    // 垂直方向上的 视角旋转范围
    public float m_minimumY = -45f;
    public float m_maximumY = 45f;

    float m_rotationY = 0f;
    // 默认 键盘控制视角 
    bool isKeyView = true; 

    // Use this for initialization
    void Start () {
        // 防止刚体 影响物体旋转
        if (GetComponent<Rigidbody>())
        {
            GetComponent<Rigidbody>().freezeRotation = true;
        }
    }


    // Update is called once per frame
    void Update () {

        //  根据按键 W,A,S,D  移动
        float x = Input.GetAxis("Horizontal") * Time.deltaTime * speed;
        float z = Input.GetAxis("Vertical") * Time.deltaTime * speed;
        transform.Translate(x, 0, z);
        print("x:" + x);


        // 发射子弹
        if (Input.GetButtonDown("Fire1"))
        {
            Transform n = Instantiate( bullet, transform.position, transform.rotation);
            // 旋转方向
            Vector3 front = transform.TransformDirection(Vector3.forward);

            // 给物体加力
            n.GetComponent<Rigidbody>().AddForce(front * 2800);

        }

        // 切换 视角 ( 组合键shift + x 切换)
        if (Input.GetKey(KeyCode.LeftShift) && Input.GetKey(KeyCode.X))
        {
            isKeyView = (isKeyView == true) ? false : true;
        }

        if (isKeyView)
        {
            keyControlView();
        }
        else
        {
            mouseControlView();
        }


    }

    void keyControlView()
    {
        // 摄像机镜头(视觉) 左右转向
        if (Input.GetKey(KeyCode.Q))
        {
            transform.Rotate(0, -25 * Time.deltaTime, 0, Space.Self);
        }
        if (Input.GetKey(KeyCode.E))
        {
            transform.Rotate(0, 25 * Time.deltaTime, 0, Space.Self);
        }

        // 摄像机镜头 上下转向
        if (Input.GetKey(KeyCode.Z))
        {
            transform.Rotate(-25 * Time.deltaTime, 0, 0, Space.Self);
        }

        if (Input.GetKey(KeyCode.C))
        {
            transform.Rotate(25 * Time.deltaTime, 0, 0, Space.Self);
        }

        // 摄像机升高 降低
        if (Input.GetKey(KeyCode.H))
        {
            transform.Translate(0, 5 * Time.deltaTime, 0);
        }
        if (Input.GetKey(KeyCode.N))
        {
            transform.Translate(0, -5 * Time.deltaTime, 0);
        }
    }

    void mouseControlView()
    {
        if (m_axes == RotationAxes.MouseXAndY)
        {
            float m_rotationX = transform.localEulerAngles.y + Input.GetAxis("Mouse X") * m_sensitivityX;
            m_rotationY += Input.GetAxis("Mouse Y") * m_sensitivityY;
            m_rotationY = Mathf.Clamp(m_rotationY, m_minimumY, m_maximumY);

            transform.localEulerAngles = new Vector3(-m_rotationY, m_rotationX, 0);
        }
        else if (m_axes == RotationAxes.MouseX)
        {
            transform.Rotate(0, Input.GetAxis("Mouse X") * m_sensitivityX, 0);
        }
        else
        {
            m_rotationY += Input.GetAxis("Mouse Y") * m_sensitivityY;
            m_rotationY = Mathf.Clamp(m_rotationY, m_minimumY, m_maximumY);

            transform.localEulerAngles = new Vector3(-m_rotationY, transform.localEulerAngles.y, 0);
        }
    }
}

把脚本挂载到 角色上就可以了。有兴趣 的可以试试~ (~ ̄▽ ̄)~

2017-06-08 08:08:53 u013720726 阅读数 5482
  • Unity 值得看的500+ 技术内容列表

    Unity3D是由Unity Technologies开发的一个让玩家轻松创建诸如三维视频游戏、建筑可视化、实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。

响应组合键即判断两个按键是否同时被按下

if(Input.GetKey("c")&&Input.GetKey("1")){
    //do sth
}

这段代码就是在同时按下c键和1键是响应

2017-05-18 17:45:01 u010707274 阅读数 3899
  • Unity 值得看的500+ 技术内容列表

    Unity3D是由Unity Technologies开发的一个让玩家轻松创建诸如三维视频游戏、建筑可视化、实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。

Unity3D游戏开发之“组合键判断”

在做编辑器功能的时候可能会用到组合键的功能,可能很多朋友不知道怎么判断或者判断的方法太复杂。
下面分享一个我自己用的一个组合键的判断函数。此函数可以判断键盘键的组合、键盘和鼠标键的组合。

代码如下:

本帖隐藏的内容

[C#] 纯文本查看 复制代码
 
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
    private bool isCombinationKey(EventModifiers prekey, KeyCode postkey, EventType postkeyevent) {
        if (prekey != EventModifiers.None) {
            bool eventDown = (Event.current.modifiers & prekey) != 0;
            if (eventDown && Event.current.rawType == postkeyevent && Event.current.keyCode == postkey) {
                Event.current.Use();
 
if (postkey != KeyCode.None)
 Debug.Log(string.Format("{0} + {1}", prekey.ToString(), postkey.ToString()));
else
 Debug.Log(string.Format("{0} + {1}", prekey.ToString(), postkeyevent.ToString()));
 
                return true;
            }
        } else {
            if (Event.current.rawType == postkeyevent && Event.current.keyCode == postkey) {
                Event.current.Use();
 
if (postkey != KeyCode.None)
 Debug.Log(string.Format("{0}", postkey.ToString()));
else
 Debug.Log(string.Format("{0}", postkeyevent.ToString()));
 
                return true;
            }
        }
        return false;
    }




用法:
[C#] 纯文本查看 复制代码
 
1
2
3
4
5
6
7
        if (isCombinationKey(EventModifiers.Alt, KeyCode.None,EventType.mouseDown)) {
}
if (isCombinationKey(EventModifiers.Alt, KeyCode.None, EventType.mouseDrag)) {
}
if (isCombinationKey(EventModifiers.Alt, KeyCode.None, EventType.mouseUp)) {
}
if (isCombinationKey(EventModifiers.Control, KeyCode.C, EventType.keyDown)) {
}