EasyTouch3.1.6 下載 : http://download.csdn.net/detail/fucun1984686003/9169591
1 .首先把EasyTouch資源包導入項目中;然後菜單欄中會出現Tools選項,如下圖操作創建一個joystick(搖桿):
創建成功之後層次面板中會出現幾個物體(搖桿所需):
2.設置搖桿的位置:有兩種模式;
(一):Dynamic joystick 不打勾時爲定點搖桿;
(二):Dynamic joystick 打勾時爲動態搖桿,有操作區域;
3.操作搖桿使人物移動需要設置速度和事件:
設置靈敏度:
設置事件:
4. 人物移動:
我們創建一個物體cube,爲其添加以下腳本:
using UnityEngine;
using System.Collections;
public class Player : MonoBehaviour {
void OnEnable(){
EasyJoystick.On_JoystickMove += On_JoystickMove;
EasyJoystick.On_JoystickMoveEnd += On_JoystickMoveEnd;
}
void OnDisable(){
EasyJoystick.On_JoystickMove -= On_JoystickMove;
EasyJoystick.On_JoystickMoveEnd -= On_JoystickMoveEnd;
}
void OnDestroy(){
EasyJoystick.On_JoystickMove -= On_JoystickMove;
EasyJoystick.On_JoystickMoveEnd -= On_JoystickMoveEnd;
}
void On_JoystickMove( MovingJoystick move){
float angle = move.Axis2Angle(true);
transform.rotation = Quaternion.Euler( new Vector3(0,angle,0));
transform.Translate( Vector3.forward * move.joystickValue.magnitude * Time.deltaTime);
Debug.Log("moving");
}
void On_JoystickMoveEnd (MovingJoystick move)
{
Debug.Log("move end");
}
}
這時我們操作搖桿cube就會隨着操作的方向和角度移動;
5. 在這裏新增一個小功能;
我們在使用EasyTouch 過程中會遇到這樣這樣一個問題:當搖桿中心按鈕移動到邊界時需要整體隨觸摸點移動(功夫熊貓的虛擬搖桿),這個需要怎麼實現呢?
在EasyTouch3.1.6版本中顯然沒有現成的方法,爲實現所需的功能我們需要修改一下 EasyJoystick 類中的On_TouchDown方法;
原方法:
// Joystick move
void On_TouchDown(Gesture gesture){
if (!visible)
return;
if ((!gesture.isHoverReservedArea && dynamicJoystick) || !dynamicJoystick){
if (isActivated){
Vector2 center = new Vector2( (anchorPosition.x+joystickCenter.x) * VirtualScreen.xRatio , (VirtualScreen.height-(anchorPosition.y +joystickCenter.y)) * VirtualScreen.yRatio);
if (gesture.fingerIndex == joystickIndex){
if (((gesture.position - center).sqrMagnitude < (zoneRadius *VirtualScreen.xRatio )*(zoneRadius *VirtualScreen.xRatio) && resetFingerExit) || !resetFingerExit) {
joystickTouch = new Vector2( gesture.position.x , gesture.position.y) - center;
joystickTouch = new Vector2( joystickTouch.x / VirtualScreen.xRatio, joystickTouch.y / VirtualScreen.yRatio);
if (!enableXaxis){
joystickTouch.x =0;
}
if (!enableYaxis){
joystickTouch.y=0;
}
if ((joystickTouch/(zoneRadius-touchSizeCoef)).sqrMagnitude > 1){
joystickTouch.Normalize();
joystickTouch *= zoneRadius-touchSizeCoef;
}
}
else{
On_TouchUp( gesture);
}
}
}
}
}
修改過後的方法:
public static bool isAreaMove = true;
void On_TouchDown(Gesture gesture){
if (!visible)
return;
if ((!gesture.isHoverReservedArea && dynamicJoystick) || !dynamicJoystick){
if (isActivated){
Vector2 center = new Vector2( (anchorPosition.x+joystickCenter.x) * VirtualScreen.xRatio , (VirtualScreen.height-(anchorPosition.y +joystickCenter.y)) * VirtualScreen.yRatio);
if (gesture.fingerIndex == joystickIndex){
if (((gesture.position - center).sqrMagnitude < (zoneRadius *VirtualScreen.xRatio )*(zoneRadius *VirtualScreen.xRatio) && resetFingerExit) || !resetFingerExit) {
joystickTouch = new Vector2( gesture.position.x , gesture.position.y) - center;
joystickTouch = new Vector2( joystickTouch.x / VirtualScreen.xRatio, joystickTouch.y / VirtualScreen.yRatio);
if (!enableXaxis){
joystickTouch.x =0;
}
if (!enableYaxis){
joystickTouch.y=0;
}
if ((joystickTouch/(zoneRadius-touchSizeCoef)).sqrMagnitude > 1){
joystickTouch.Normalize();
joystickTouch *= zoneRadius-touchSizeCoef;
// changed
if(isAreaMove)
{
Vector2 gesPos =new Vector2(gesture.position.x/VirtualScreen.xRatio, VirtualScreen.height - gesture.position.y/VirtualScreen.yRatio);
Vector2 offset = gesPos - joystickCenter;
joystickCenter += offset.normalized * (offset.magnitude - joystickTouch.magnitude);
areaRect = new Rect(anchorPosition.x + joystickCenter.x -zoneRadius , anchorPosition.y+joystickCenter.y-zoneRadius,zoneRadius*2,zoneRadius*2);
deadRect = new Rect(anchorPosition.x + joystickCenter.x -deadZone,anchorPosition.y + joystickCenter.y-deadZone,deadZone*2,deadZone*2);
}
}
}
else{
On_TouchUp( gesture);
}
}
}
}
}
添加了一個全局變量isAreaMove;爲false時與原方法同效果,true時當中心按鈕達到邊界繼續向外移動時整體會隨着觸摸點移動;
6. 邊界處理:
在搖桿移動的過程中我們並不想讓它超過屏幕邊界怎麼辦呢?
我們需要修改一下
private Vector2 joystickCenter
將這個變量封裝成屬性;
Vector2 _joystickCenter;
// Joystick properties
private Vector2 joystickCenter{
get{
return _joystickCenter;
}
set{
_joystickCenter = value;
_joystickCenter = new Vector2(Mathf.Clamp(joystickCenter.x , zoneRadius + touchSize , VirtualScreen.width-(zoneRadius + touchSize)) ,
Mathf.Clamp(joystickCenter.y , zoneRadius + touchSize , VirtualScreen.height-(zoneRadius + touchSize)));
}
}
經過這樣處理,就可以讓搖桿始終在屏幕內了;
7. 更多功能待探索......