原文地址: http://www.xuanyusong.com/archives/2948
用了EasyTouch插件一段时间了,小问题还是有一些,总体来说用起来还行。这篇文章我就来说说EasyTouch和NGUI的结合。
总体来说触摸屏幕也就三种情况。
1.触摸事件只响应NGUI部分,不响应3D部分。
2.触摸事件只响应3D部分,不响应NGUI部分。
3.触摸事件同时响应。
举个例子,在战斗场景我们希望通过手指滑动来控制摄像机的旋转。但是这时屏幕上可能还有一些UI的按钮,但是我们不希望用户点击UI按钮也影响到了摄像机的旋转。所以此时我们只希望触摸事件在3D部分响应。
1. 如下图所示,这里我增加了一个UISprite,我希望我的手指触摸事件只在UI上响应,不在3D上响应
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
|
using
UnityEngine
;
using
System
.
Collections
;
public
class
UImomo
:
MonoBehaviour
{
//头像
GameObject
icon
;
void
Start
(
)
{
icon
=
transform
.
Find
(
"icon"
)
.
gameObject
;
//添加一个手指滑动的事件。
EasyTouch
.
On_SwipeEnd
+=
EasyTouch_On_SwipeEnd
;
}
void
OnDestroy
(
)
{
//施放一个手指滑动的事件。
EasyTouch
.
On_SwipeEnd
-=
EasyTouch_On_SwipeEnd
;
}
//当手指滑动结束时在这里
void
EasyTouch_On_SwipeEnd
(
Gesture
gesture
)
{
//判断手指是否触摸在NGUI的头像中
if
(
gesture
.
IsStartInRect
(
NGUIObjectToRect
(
icon
)
)
)
{
//输出手指滑动的方向
Debug
.
Log
(
gesture
.
swipe
)
;
}
}
//计算出NGUI某个UISprite或者UITexture或者 UILabel 在屏幕中占的矩形位置。
private
Rect
NGUIObjectToRect
(
GameObject
go
)
{
Camera
camera
=
NGUITools
.
FindCameraForLayer
(
go
.
layer
)
;
Bounds
bounds
=
NGUIMath
.
CalculateAbsoluteWidgetBounds
(
go
.
transform
)
;
Vector3
min
=
camera
.
WorldToScreenPoint
(
bounds
.
min
)
;
Vector3
max
=
camera
.
WorldToScreenPoint
(
bounds
.
max
)
;
return
new
Rect
(
min
.
x
,
min
.
y
,
max
.
x
-
min
.
x
,
max
.
y
-
min
.
y
)
;
}
}
|
2.我希望手指触摸只响应3D,不响应NGUI 。这里其实更多的运用于游戏的战斗界面,战斗界面的UI一般都集中在屏幕的四个角, 比如头像 小地图 技能 摇杆等等。EasyTouch提供了NGUI模式,可以很方便的解决这个问题,不过它原理也是用射线来判断,所以你要确保需要略过的UI空间有BoxCollider组件。
我们把所有NGUI做的界面放在UI层上面。代码简单的改改,这样EasyTouch就不会在UI层上响应了。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
void
Start
(
)
{
icon
=
transform
.
Find
(
"icon"
)
.
gameObject
;
//添加一个手指滑动的事件。
EasyTouch
.
On_SwipeEnd
+=
EasyTouch_On_SwipeEnd
;
//得到UI摄像机
Camera
uiCamera
=
GameObject
.
Find
(
"UI Root/Camera"
)
.
GetComponent
<
Camera
>
(
)
;
if
(
uiCamera
!=
null
)
{
//启动NGUI模式
EasyTouch
.
instance
.
enabledNGuiMode
=
true
;
//把NGUI摄像机加入过滤队列
if
(
!
EasyTouch
.
instance
.
nGUICameras
.
Contains
(
uiCamera
)
)
{
EasyTouch
.
instance
.
nGUICameras
.
Add
(
uiCamera
)
;
}
//设置需要过滤的UI层
EasyTouch
.
instance
.
nGUILayers
=
(
1
<<
LayerMask
.
NameToLayer
(
"UI"
)
)
;
}
}
void
OnDestroy
(
)
{
//施放一个手指滑动的事件。
EasyTouch
.
On_SwipeEnd
-=
EasyTouch_On_SwipeEnd
;
//施放
EasyTouch
.
instance
.
enabledNGuiMode
=
false
;
EasyTouch
.
instance
.
nGUILayers
=
0
;
EasyTouch
.
instance
.
nGUICameras
.
Clear
(
)
;
}
|
最后,我现在用的EasyTouch可能版本比较老,我用的版本是v3.1.1 因为目前项目也比较稳定,所以也不敢升级。EasyTouch这个版本里有一个BUG。就是超过10只手指在屏幕中滑动会出现空指针的错误,后来我看了一下代码,在UpdateTouches 里面做一下判断就好了。
EasyTouch有很强大的事件回调方法,大家可以去它的官网上查一下。不知道现在还有没有更好用的触屏插件,如果你觉得比EasyTouch还好用的话,希望你在下面给我留言,谢谢。