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

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

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

时间: 2024-10-10 01:18:13

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

JAVA学习笔记(四十六)- 内部类详解

成员内部类 /* * 内部类 * 定义在另一个类中的类,称为内部类Inner Class * 包含内部类的类,称为外部类Outer Class * * 应用场合:在窗体程序中进行事件处理 * * 分类: * 成员内部类 * 局部内部类 * 静态内部类 * 匿名内部类 * * 成员内部类 * 1.在外部类中访问内部类,可以访问内部类中的所有成员,包含private修饰的 * 2.在外部类外访问内部类,不能访问内部类中的private修饰的成员 * 3.在内部类中访问外部类,直接访问,如果内部类和外

【Unity 3D】学习笔记四十二:粒子特效

粒子特效 粒子特效的原理是将若干粒子无规则的组合在一起,来模拟火焰,爆炸,水滴,雾气等效果.要使用粒子特效首先要创建,在hierarchy视图中点击create--particle system即可 粒子发射器 粒子发射器是用于设定粒子的发射属性,比如说粒子的大小,数量和速度等.在创建完粒子对象后,在右侧inspector视图中便可以看到所有的粒子属性: emit:是否是使用粒子发射器. min size:粒子最小尺寸. max size:粒子最大尺寸. min energy:粒子的最小生命周期

【Unity 3D】学习笔记二十六:unity游戏脚本(六)

在3D游戏世界中,任何一个游戏对象在创建的时候都会附带Transform(变换)组件,并且该组件是无法删除的,也不应该删除.在unity中,Transform面板一共有3个属性: Position  (位置) Rotation(旋转) Scale(缩放) 这三个值都是用来调整游戏对象在游戏界面中的位置,状态等相关参数. Position  (位置) 任何一个游戏对象的三维坐标都保存在Vector3容器中,该容器记录对象在X轴,Y轴,Z轴的坐标.一旦Vector33容器中的坐标发生变化,那么Sce

【Unity 3D】学习笔记四十五:游戏实例——击垮围墙

用这个游戏实例来总结之前我们复习的所有关于物理引擎的知识.在游戏中,发送一个球形的炮弹来击垮前面的墙.给炮弹与墙都添加了刚体组件,给炮弹绑定了粒子系统,并且在炮弹的粒子动画中添加了5组不同的颜色,显示移动轨迹. using UnityEngine; using System.Collections; public class Script_06_14 : MonoBehaviour { //炮弹对象 private GameObject obj; //准心贴图 public Texture te

【Unity 3D】学习笔记四十四:路径渲染

路径渲染 路径渲染属于特效渲染组件,用于跟随运动中的游戏对象.首先在hierarchy视图中,创建一个球体.然后在菜单导航栏中选择component--effects--trial renderer即可将路径渲染组件添加至该球体对象中. cast shadows:显示阴影效果. receive shadows:接受阴影效果. materials:材质. size:渲染的材质数量,可添加或删除. element 0:渲染材质文件. use light probes:是否使用光线探头. light

《Javascript权威指南》学习笔记之十六:BOM之源---BOM基本应用

BOM的基本应用包括:管理浏览器历史.解析地址和获取浏览器信息,本文将介绍这些应用. 一.浏览历史管理 1.history对象的方法和属性 History 对象包含用户(在浏览器窗口中)访问过的 URL,是 window 对象的一部分,可通过 window.history 属性对其进行访问.没有应用于 History 对象的公开标准,不过所有浏览器都支持该对象. length属性:返回浏览器历史列表中的URl数量.是"前进"和"后退"两个按钮之下包含的地址数的总和.

Android学习笔记(十六)——碎片之间进行交互(附源码)

碎片之间进行交互 点击下载源码 很多时候,一个活动中包含一个或者多个碎片,它们彼此协作,向用户展示一个一致的UI.在这种情况下,碎片之间能进行通信并交换数据十分重要. 1.使用上一篇中创建的同一个项目,在fragment.xml中添加TextView的标识id: android:id="@+id/lblFragment1" 2.在fragment2.xml中添加一个Button,用于与fragment1进行交互: <Button android:id="@+id/btn

angular学习笔记(二十六)-$http(4)-设置请求超时

本篇主要讲解$http(config)的config中的timeout项: $http({ timeout: number }) 数值,从发出请求开始计算,等待的毫秒数,超过这个数还没有响应,则返回错误 demo: html: <!DOCTYPE html> <html ng-app = 'HttpGet'> <head> <title>18.4 $http(2)</title> <meta charset="utf-8"

马哥学习笔记二十六——MySQL主从复制

配置MySQL复制基本步骤: 一.master 1.启用二进制日志 log-bin = master-bin log-bin-index = master-bin.index 2.选择一个惟一server-id server-id = {0-2^32} 3.创建具有复制权限的用户 REPLICATION SLAVE REPLICATION CLIENT 二.slave 1.启用中继日志 relay-log = relay-log relay-log-index = 2.选择一个惟一的server