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

在游戏中,玩家控制主角移动,按键攻击,选择行走。都需要在程序中监听玩家的输入。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


  • 35
    点赞
  • 123
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Unity3D格斗游戏源码是一种让开发者能够开发自己的格斗游戏的一种资源,而“仿最终幻想”是模仿最终幻想系列游戏来设计和开发的游戏。这种源码提供了许多基本的游戏元素和功能,开发者可以根据自己的需求来创建自己想要的游戏。 在Unity3D格斗游戏源码中,主要包含了以下几个方面的内容: 1. 角色控制:开发者可以通过源码来实现角色的移动、攻击、防御等基本动作。游戏中的角色可以使用键盘、鼠标或者手柄进行操控,使得玩家能够与游戏世界进行交互。 2. 动画系统:为了增强游戏的流畅性和真实感,该源码还提供了动画系统。开发者可以根据需要创建角色的各种动画,例如攻击动画、受伤动画和死亡动画等,使得游戏体验更加逼真。 3. AI系统:为了让游戏增加一定的挑战性,该源码还提供了AI系统。开发者可以通过代码设置敌方角色的行为和策略,使得游戏中的敌人具有一定的智能和反应能力。 4. 特效和音效:为了提升游戏的视听效果,该源码还包括了一些特效和音效资源。开发者可以根据自己的需要添加各种特效和音效,增强游戏的氛围和乐趣。 5. 可定制性:该源码还提供了一些可配置的参数和选项,开发者可以根据自己的需求来调整游戏的各种设置,包括角色属性、技能系统和游戏难度等,以便创造出不同的游戏体验。 总之,Unity3D格斗游戏源码可以帮助开发者快速搭建一个仿照最终幻想系列的格斗游戏。通过使用该源码,开发者可以省下许多开发时间和精力,同时也能够在这个基础上进行二次开发,实现自己的创意和想法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值