unity EasyTouch虛擬搖桿的使用(邊界情況處理)

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. 更多功能待探索......






發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章