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
- unity EasyTouch虚拟摇杆的使用(边界情况处理)
- Unity使用EasyTouch虚拟摇杆控制角色
- EasyTouch中虚拟摇杆的使用EasyJoystick
- Unity使用easytouch虚拟摇杆控制角色移动
- Unity Asset(3)虚拟摇杆插件 EasyTouch
- unity手游摇杆的实现(EasyTouch)
- <Unity UGUI><EasyTouch> 使用EasyTouch, 摇杆在Dynamic模式下,点击UI控件也会弹出的问题解决
- unity虚拟摇杆的实现
- [Unity插件]EasyTouch的使用
- Unity3D easytouch虚拟摇杆及其应用
- EasyTouch摇杆插件使用中遇到的坑
- Unity Joystick 虚拟摇杆的实现
- Unity中虚拟摇杆的简单实现
- Unity实现虚拟摇杆
- Unity虚拟摇杆
- [Unity3D]Unity3D游戏开发之使用EasyTouch虚拟摇杆控制人物移动
- Unity插件——EasyTouch的使用
- UGUI实现Unity虚拟摇杆
- <context:component-scan base-package=com.xxx.xxx/ >包扫描注解
- 管理理念:小米成功启示录--团队第一,产品第二
- VS2013 编译 MySql Connector C 6.1.6
- PHP的魔术方法
- 张小龙:如何把产品做简单
- unity EasyTouch虚拟摇杆的使用(边界情况处理)
- Hadoop作业调度算法
- Android应用的界面编程简述1
- C#winform 控件鼠标落下变色,鼠标挪开恢复原色
- IOS9之后适配需要注意的问题
- 接口和抽象类的考虑
- maven 常用命令
- POJ 1611 The Suspects(并查集)
- 好的博客网址 有例子