本期的游戏开发日志中,我们将一起学习以上视频中用到的鼠标事件,并一起制作一个鼠标扭蛋机!
在此之前,让我们有请李忠义同学来讲解一下鼠标事件的原理吧!
提到unity中有关鼠标事件的函数,大家最先想到的是那个?
大概是Input.GetMouseButtonDown()和OnMouseDown()吧。
但这两个事件有何不同呢?
首先这两个方法的引用位置不同,Input.GetMouseButtonDown() 一般在Update 中使用,而OnMouseDown()只能单独作为一个函数。
其次,这两个方法的检测范围不同,Input.GetMouseButtonDown(0)会在你的鼠标左键点击任何地方时执行,返回值为bool的true值。
而OnMouseDown() 作为一个单独执行的方法我们可以在图中看出,他没有返回值,并且仅在你点击脚本附加的gameobject时执行。
我们可以看到当我点击附加了上图脚本的物体时,两个方法都被执行,而当我点击物体外时,Input.GetMouseButtonDown(0)正常执行。
综上所述,当需要检测某一物体的点击时,我们可以很方便地使用OnMouseDown()方法来实现目标。
但是Input.GetMouseButtonDown() 就没有用了吗?并不是的,办法总比困难多,在2D游戏或者深度(Z轴)相对较浅的方法中,我们可以创建一个带有勾选Trigger的Collider组件的空物体,然后将他的collider拉得足够细长并添加一个跟随鼠标的脚本,在Input.GetMouseButtonDown()中添加一个Bool来检测这个collider是否碰到了你要求的Gameobject。
到这里你可能就会有疑问了,
这有什么用处吗?
有.
--周树人
我们可以用这个方法来检测鼠标左键之外的案件;因为OnMouseDown()只检测鼠标左键,而Input方法中涵盖了你能想到的绝大部分按键。
不过上文提到的方法不过是一个极为笨拙且没有普适性的解决方案:collider会挡到OnMouseDown() 等方法对gameobject的检测,为此你只能将这个collder弄成一个避开鼠标点击点的形状或者将跟随鼠标的位置稍微偏移。
这里就引出了Input.GetMouseButtonDown()和OnMouseDown()共通的问题:如果我想点击的物体前面有东西挡着怎么办?
下面我来向大家介绍一种极为常用的检测方法---射线检测.
首先向大家介绍射线的原理:
发射射线是一个过程,从初始点开始,沿着某方向检测有Collider的物体,检测到后立刻停止射线的发射。
射线的返回值.
Physics.Raycast返回值为bool
Physics.RaycastAll返回值为RaycastHit结构体类型的数组
Physics2D.Raycast的返回值是 RaycastHit2D结构体类型(RaycastHit和RaycastHit2D储存了射线击中collider后产生的碰撞信息)
所以我们在使用相应的射线时就需要创建不同的变量类型来接受不同类型射线的返回值.
当然使用哪种射线在很多情况下也是根据需求而特定且容易选择的。
我们创建了变量之后就是输入具体的参数了:
以上这几个参数就是我们经常用到的参数,我们可以将我们需要的参数放入到射线的声明中。
可是当我们成功创建了一条心仪的射线之后,却发现我们看不到他,这时候我们就需要用到以下两个方法:
Debug.DrawLine()和Debug.DrawRay()。
我们可以用传入射线的第一个参数Origin来当做绘制的起始点,而第二个参数这两个方法出现了区别:一个为绘制线条的方向,一个为绘制线条的结束点。
在Debug.DrawLine()通常可以使用前文提到RaycastHit结构体中的RaycastHit.point来绘制其信息。
而Debug.DrawRay()可以保持与射线一样的传入参数。
拥有了声明的射线并且能在编辑器中看到他之后,我们就能开始快乐地使用它了:
Ray ray = Camera .main.ScreenPointToRay(Input.mousePosition);
通过ScreenPointToRay()方法,传入并返回一条在世界坐标下从相机Camera的近裁面,出发穿过屏幕上的像素坐标点的射线(将鼠标的坐标信息从屏幕坐标系转换到Ray射线类型).
游小技:我悟了!
那么就来做一个小栗子来运用吧!
看好啦!这就做一个鼠标扭蛋机!
第一部分:鼠标点击事件!
在该例中,当玩家点击硬币时,才会触发事件 ,于是我们选用OnMouseDown().
点击代码如下,本期只需重点关注OnMouseDown(),OnMouseUp(),OnMouseDrag()等的用法即可.
为什么我的点击事件不响应啊?
呐!检查一下是不是有东西遮挡了你的碰撞器!
ε=( o`ω′)ノ刚体也会遮挡碰撞器哦~
等等,你不会压根就没装碰撞器吧!
不会吧,不会吧?你还把isTrigger 勾上了?快取消!
第二部分:鼠标拖动事件!
啊哈!不错吧!
让我猜猜,该出扭蛋了吧!
o(* ̄▽ ̄*)ブ
怎么我跟你做出来的不一样啊?
除了鼠标事件代码,我当然还加上了其他代码呀!
还不赶快下载工程来看看!
大眼睛工程:
链接:https://pan.baidu.com/s/1oOvlhpVH0IFIsA1DF3dO3Q
提取码:79dv
扭蛋机工程:
链接:https://pan.baidu.com/s/10M-uZ9ikryrJ7EyBHgoiZQ
提取码:qw0d
文案:游小技,李忠义
排版:游小技
工程:游小技