如果本职工作是windows上原生开发,那么对windows上如果要处理用户输入就比较熟悉,其实就是处理windows消息,MSDN的官方文档在这里:
如果把里面关键点拿出来就是
while (PeekMessage(&msg, hwnd, 0, 0, PM_REMOVE))
{
switch(msg.message)
{
case WM_LBUTTONDOWN:
// 处理鼠标左键按下
break;
case WM_RBUTTONDOWN:
// 处理鼠标右键按下
break;
case WM_KEYDOWN:
// 处理键盘按键按下
break;
}
}
可以看到就是一个循环,然后每次从消息队列里面取一个消息来获取当前用户输入状态。
其他的框架或者系统也有可能将其封装成一个事件回调函数,但是处理起来也还是差不多的。
Unity用户输入
Unity因为要跨平台,上一章里面也讲了你只要安装好了对应平台的支持包,那基本上Unity希望你不太需要改你的普通逻辑代码就能直接编译跑在对应平台上。
所以肯定也不可能让你自己用原生代码写了再搞进去,太麻烦,那么Unity封装了这样一个用户输入库,叫Input。官方文档在这里:
官方文档也给了个简单的例子:
using UnityEngine;
using System.Collections;
public class ExampleClass : MonoBehaviour
{
public void Update()
{
if (Input.GetButtonDown("Fire1"))
{
Debug.Log(Input.mousePosition);
}
}
}
看起来是不是很类似,也是循环(Update函数是每帧都调用一次,可以理解为某种形式上的循环)中不停的处理消息(Input类给你获取当前消息里面有没有输入内容)。
好像挺简单的,但是等着,这个GetButtonDown的参数为啥是Fire1?难道不应该是鼠标左键之类的名字吗?
有的有的,且看这个函数:
using UnityEngine;
using System.Collections;
// Detects clicks from the mouse and prints a message
// depending on the click detected.
public class ExampleClass : MonoBehaviour
{
void Update()
{
if (Input.GetMouseButtonDown(0))
Debug.Log("Pressed primary button.");
if (Input.GetMouseButtonDown(1))
Debug.Log("Pressed secondary button.");