unity EasyTouch虚拟摇杆的使用(边界情况处理)

来源:互联网 发布:淘宝的经营模式分析 编辑:程序博客网 时间:2024/06/05 01:11

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






0 0
原创粉丝点击