EasyTouch
概述:
在任何手游动作类项目中,总少不了摇杆(joystick),今天来写一篇关于摇杆的文章,从插件到运用来说说(EasyTounch)是如何为手游项目服务的,工程及插件下载地址我会放在文章最后面。
学习目标:
1.了解EasyTouch原理和使用
2.了解EasyButton原理及使用
3.重点掌握EasyJoystick的原理及用法
实现过程:
一 EasyButton部分
新建一个工程,导入EasyTouch插件,创建三个EasyButton按钮,会默认创建EasyTouch,我们用三个按钮来模拟游戏项目中的技能:
首先,先来看看EasyButton的属性面板有哪些重要属性,下图中黄色勾选的是重点属性,它是EasyButton按下之后事件处理的根本。
其他属性:
①.ButtonProperties:主要参数有,按钮名字(ButtonName),是否禁用按钮(EnableButton),是否激活(Active),是否禁用按钮debug区域(Show Debug Area)以及是否使用GUI的分布布局(Use GUI Layer)。
②.ButtonPosition&Size见名知意,这个就是用来修改Button位置和尺寸的,以及一个修改猛烈进入猛烈退出的动画效果的。
③.这个就是重中之重了,eventhandle就是靠这个处理的,有两种方式,Event注册方式(因为EasyTouch脚本提供好了处理不同按键响应机制的委托方法),还有一种就是使用通知指定游戏物体身上的方法来处理不同按键响应。(=Use specific method.)
④.最后一个属性就是修改按钮Texture,这个自己去使用相应的技能素材就好。
好了,EasyButton属性参数已经介绍完了,接下里我们重点来学习如何做事件响应处理!
using UnityEngine;
using System.Collections;
public class ButtonHandler : MonoBehaviour {
#region 技能1事件监听
void SkillButton1DownMethod()
{
Debug.Log("按下技能1时");
}
void SkillButton1PressMethod()
{
Debug.Log("按住技能1");
}
void SkillButton1UpMethod()
{
Debug.Log("抬起技能1");
}
#endregion
#region 技能2事件监听
void SkillButton2DownMethod()
{
Debug.Log("按下技能2时");
}
void SkillButton2PressMethod()
{
Debug.Log("按住技能2");
}
void SkillButton2UpMethod()
{
Debug.Log("抬起技能2");
}
#endregion
#region 技能3事件监听
void SkillButton3DownMethod()
{
Debug.Log("按下技能3时");
}
void SkillButton3PressMethod()
{
Debug.Log("按住技能3");
}
void SkillButton3UpMethod()
{
Debug.Log("抬起技能3");
}
#endregion
}
同时要给每个Button事件处理那里进行接收者赋值,方法赋值,如下图:
运行游戏经过测试,效果如图:
好了,这是第一种响应EasyButton触摸事件的方式,接下来我们说第二种就是使用Event注册的形式(注:有注册就要有解注册)
先看看EasyButton中的源码:
#region Delegate
public delegate void ButtonUpHandler(string buttonName);
public delegate void ButtonPressHandler(string buttonName);
public delegate void ButtonDownHandler(string buttonName);
#endregion
#region Event
/// <summary>
/// Occurs when the button is down for the first time.
/// </summary>
public static event ButtonDownHandler On_ButtonDown;
/// <summary>
/// Occurs when the button is pressed.
/// </summary>
public static event ButtonPressHandler On_ButtonPress;
/// <summary>
/// Occurs when the button is up
/// </summary>
public static event ButtonUpHandler On_ButtonUp;
#endregion
源码中声明了三个不同阶段的委托变量,所以我们要做的就是通过脚本给这几个变量进行函数赋值。
void Start()
{
RegistButtonEvent();
}
void Destory()
{
UnRegistButtonEvent();
}
void RegistButtonEvent() { EasyButton.On_ButtonDown += SkillButton1DownMethod; }
void UnRegistButtonEvent() { EasyButton.On_ButtonDown -= SkillButton1DownMethod; }
#region 技能1事件监听
void SkillButton1DownMethod(string btn1Name)
{
Debug.Log("按下技能1时");
}
效果:
EasyButton这一块就这些东西,剩下的就是多用多熟悉的事情了,接下来说一下EasyJoystick,也叫摇杆。
二 EasyJoyStick 部分
首先还是创建一个摇杆,然后看右边检视面板属性有哪些?
属性面板:
这个属性就不用说了和前面的EasyButton相同地方挺多,不同的地方自己可以试试。
这里主要重点就是第一个参数,勾选之后,摇杆区域不是固定的了,比较方便,挺多项目都用过,其他的属性都可以自己试试。
这个属性块比较重要
这个设置显示的参数,没什么重点,设置好自己喜欢的图就好了。
那我们已经了解了虚拟杆的属性,那么我们怎么用它来做控制呢?(通过什么来进行事件处理)
我们知道的是,Joystick是虚拟杆,那么它肯定是有X轴和Y轴值的,那如何获取这个轴值?
//指定虚拟杆
public EasyJoystick mJoyStick;
void Update()
{
//输出轴值
print(mJoyStick.JoystickAxis);
}
移动虚拟杆,输出效果:
通过测试我们可知:左为-1,上为1。我们使用EasyJoyStick,主要就是为了控制人物移动,接下来看看如何实现控制人物前后左右旋转移动。
我们应该还记得有一种控制移动的方式是通过获取轴值,来改变移动的:
float h = Input.GetAxis("Horizontal");
float v = Input.GetAxis("Vertical");
那么我们就可以思考一下,人物的移动控制是不是也可以使用这种方式,通过获取joystick轴值来改变人物的transform位置信息呢?答案是可以的!
在层次面板当中创建一个主角,命名为Player,然后修改joyStick参数:
基本EasyJoyStick,控制移动或者控制摄像机转动的方法就是这样的,其中插件里面的例子可以去研究一下,挺好的,最后一个部分就是EasyTouch部分了
三 EasyTouch部分
手势事件检测这一块也有几种检测方式。
关键字:通过原名字来触发事件
新建游戏物体,命名为GestureListener,层次面板结构如图,我们将通过第一种方式,就是制定手势检测接收方的方式来实现功能需求!
脚本:
public class GestureListener : MonoBehaviour {
/// <summary>
/// 名字一定要和EasyTouch源码中的手势检测函数签名一致
/// </summary>
void On_TouchStart(Gesture myGesture)
{
//将输出手指在屏幕上面的位置//原点在左下角
Debug.Log("TouchStart"+ myGesture.position);
}
}
测试效果:
这种方式只要指定的函数和源码中的函数签名一致就可以触发。接下来我们使用事件注册的方式,我说明一下,这里可能会有人有疑惑,说我事件注册进去了,他怎么知道我到底是哪个事件源呢?就像上面的EasyButton例子一样,图中有三个技能button,那我使用事件注册的方式,当我游戏运行的时候,它是怎么知道我是哪个button点击的?其实这个一定都不必担心,就拿上面的EasyButton例子来说,我们可以注册很多OnDown的函数,你把所有的button得Down函数注册进去之后,他就帮你存在了一个事件管理器中,当你按下某个button时候,它会自动去执行那个注册进来的方式,所以EasyTouch的事件注册机制是一模一样的。
public class GestureListener : MonoBehaviour {
void Start()
{
RegistButtonEvent();
}
void Destory()
{
UnRegistButtonEvent();
}
void RegistButtonEvent()
{
EasyTouch.On_TouchStart += On_MyTouchStart;
}
void UnRegistButtonEvent()
{
EasyTouch.On_TouchStart -= On_MyTouchStart;
}
void On_MyTouchStart(Gesture myGesture)
{
//将输出手指在屏幕上面的位置//原点在左下角
Debug.Log("TouchStart"+ myGesture.position);
}
}
经过测试,效果一样。
最后一种方式就是应对,比如说我们只想手指触摸到某个游戏物体身上了,才会执行下一步的eventHandler,这个情况该怎么处理呢?
创建一个游戏物体,让其做手势事件的唯一接收者:
实现过程:
修改游戏物体的层为GUICamera,然后设置EasyTouch的检测层,设置好了之后,记得启用BroadcastMessage,因为EasyTouch底层是通过消息广播机制来实现事件播报的。
这样通过运行游戏测试我们可以发现,无论我们点击哪里,只要没点到cube身上,都不会有消息,当我们点击到Cube之后才会出现消息:
好了,EasyTouch插件的学习就到这里结束了,还是那句话,插件自带的Demo挺不错的,可以去看一下,然后还有就是每个事件脚本源码中上面例子没有讲到的也可以自己底下去实践实践。
示例下载地址以及插件:
链接:http://pan.baidu.com/s/1o8MzR30 密码:t9c0