带seo服务的网站定制,wordpress播放swf插件,网站建站怎么分前端和后端,开发公司支付给业主的购房补贴手游里面很多类型的游戏都需要用到遥感功能#xff0c;例如王者荣耀#xff0c;和平精英等#xff0c;之前的摇杆功能都是用类似于Easy Touch的插件进行开发的#xff0c;今天不借助任何插件来实现虚拟摇杆的功能。 一般虚拟摇杆的组成都是由轮盘和遥感的点组成#xff0c… 手游里面很多类型的游戏都需要用到遥感功能例如王者荣耀和平精英等之前的摇杆功能都是用类似于Easy Touch的插件进行开发的今天不借助任何插件来实现虚拟摇杆的功能。 一般虚拟摇杆的组成都是由轮盘和遥感的点组成轮盘控制位移限制在某个区域内而点则是控制旋转限制在轮盘内因此需要用到的是Unity自带的UI事件因此创建一个名为UIEventListener的类去实现IPointerDownHandler,IPointerUpHandler,IDragHandler方法通过事件监听回调来处理。
using UnityEngine;
using UnityEngine.EventSystems;namespace CS
{[AddComponentMenu(UI/UIEventListener)]public class UIEventListener : MonoBehaviour,IPointerDownHandler,IPointerUpHandler,IDragHandler{public ActionPointerEventData OnDownEvent;public ActionPointerEventData OnUpEvent;public ActionPointerEventData OnDargEvent;public static UIEventListener Get(GameObject go){UIEventListener listener null;if (go ! null){listener go.GetComponentUIEventListener();if (listener null){listener go.AddComponentUIEventListener();}}return listener;}public void OnPointerDown(PointerEventData eventData){OnDownEvent?.Invoke(eventData);}public void OnPointerUp(PointerEventData eventData){OnUpEvent?.Invoke(eventData);}public void OnDrag(PointerEventData eventData){OnDargEvent?.Invoke(eventData);}}
下面贴出完整代码接下来对虚拟摇杆进行处理监听这三个事件其中mTouchMaxDir是虚拟摇杆的点距离轮盘中心的最大距离也就是你遥感点能拉到多远,而由于在不同分辨率下这个距离其实并非是固定的因此就和我上一篇Unity实现经验条动态自适应一样以实际画布的高比屏幕的高得到当前高的比值然后乘以固定的最远拉伸距离就能得到当前分辨率下的自适应拉伸距离。为了限制轮盘的位置因此需要设置一张矩形的底图将其aplha设置为0表示轮盘可移动的范围。 在我们按下的时候记录开始按下的位置已经显示遥感点将按下的位置赋值给轮盘而抬起的时候隐藏摇杆点重置轮盘的位置这个都很简单然后我们在OnDrag拖拽事件中首先我们得到遥感的方法通过遥感的最终位置-开始位置 方向由于我们遥感点是需要限定在轮盘内的因此需要用距离来判断因此通过方向的magnitude得到当前遥感点的距离来判断是否超过我们之前设定的最大遥感距离如果超出了就用 Vector2.ClampMagnitude(dir, mTouchMaxDir) API限制在这个mTouchMaxDir最大距离内然后我们遥感点的位置就是我们开始位置限制在最大距离的Dir 如果没有超出就直接等于我们Drag传出的位置即可这里的位置需要注意都是postion也就是世界坐标的位置因为我们UIEvent事件中传出的eventData中的Position是世界坐标位置 public class UI_MainCityPanel : ViewUI_MainCityPanel, MainCityScene{private Image mDirBgImg;private Image mDirPointImg;private Vector2 mStartPos Vector2.zero;private Vector2 mDefaultPos Vector2.zero;private float mTouchMaxDir;public override void IAwake(){base.IAwake();InitComponment();OnTouchEvent();}private void InitComponment(){mPowerImg transform.IndexImage(F_PowerImg);mDirBgImg transform.IndexImage(F_DirBg);}private void OnTouchEvent(){mTouchMaxDir Screen.height * 1.0f / Consts.ScreenHeight * Consts.TouchPointMaxLen;mDirPointImg.SetActiveState(false);mUIEvtListener UIEventListener.Get(gameObject);mUIEvtListener.OnDownEvent (eventData {mStartPos eventData.position;mDirPointImg.SetActiveState(true);mDirBgImg.transform.position eventData.position;});mUIEvtListener.OnUpEvent (eventData {mDirPointImg.transform.localPosition mDefaultPos;mDirPointImg.SetActiveState(false);mDirBgImg.transform.localPosition mDefaultPos;});mUIEvtListener.OnDargEvent (eventData {Vector2 dir eventData.position - mStartPos;float length dir.magnitude;if (length mTouchMaxDir){Vector2 clampDir Vector2.ClampMagnitude(dir, mTouchMaxDir);mDirPointImg.transform.position mStartPos clampDir;}else{mDirPointImg.transform.position eventData.position;}});}
}
下面看演示效果