Unity用UGUI做虚拟摇杆
一.首先点击UI创建两个Image,将Image的Source Image改成自己想要的Texture即可,然后在Canvas下创建一空物体,将两个Image放在空物体下作为他的子对象;
然后为可以拖动的Image编写脚本,脚本如下:(有注释,就不多说了)
usingUnityEngine;usingSystem.Collections;usingUnityEngine.UI;usingUnityEngine.EventSystems;publicclassJoyStick:MonoBehaviour,IPointerDownHandler,IPointerUpHandler,IDragHandler//需要注意继承的接口,接口内的方法需要实现{///<summary>///摇杆最大半径///以像素为单位///</summary>publicfloatJoyStickRadius=50;///<summary>///摇杆重置所诉///</summary>publicfloatJoyStickResetSpeed=5.0f;///<summary>///当前物体的Transform组件///</summary>privateRectTransformselfTransform;///<summary>///是否触摸了虚拟摇杆///</summary>privateboolisTouched=false;///<summary>///虚拟摇杆的默认位置///</summary>privateVector2originPosition;///<summary>///虚拟摇杆的移动方向///</summary>privateVector2touchedAxis;publicVector2TouchedAxis{get{if(touchedAxis.magnitude<JoyStickRadius)returntouchedAxis.normalized/JoyStickRadius;returntouchedAxis.normalized;}}///<summary>///定义触摸开始事件委托///</summary>publicdelegatevoidJoyStickTouchBegin(Vector2vec);///<summary>///定义触摸过程事件委托///</summary>///<paramname="vec">虚拟摇杆的移动方向</param>publicdelegatevoidJoyStickTouchMove(Vector2vec);///<summary>///定义触摸结束事件委托///</summary>publicdelegatevoidJoyStickTouchEnd();///<summary>///注册触摸开始事件///</summary>publiceventJoyStickTouchBeginOnJoyStickTouchBegin;///<summary>///注册触摸过程事件///</summary>publiceventJoyStickTouchMoveOnJoyStickTouchMove;///<summary>///注册触摸结束事件///</summary>publiceventJoyStickTouchEndOnJoyStickTouchEnd;voidStart(){//初始化虚拟摇杆的默认方向selfTransform=this.GetComponent<RectTransform>();originPosition=selfTransform.anchoredPosition;}publicvoidOnPointerDown(PointerEventDataeventData){isTouched=true;touchedAxis=GetJoyStickAxis(eventData);if(this.OnJoyStickTouchBegin!=null)this.OnJoyStickTouchBegin(TouchedAxis);}publicvoidOnPointerUp(PointerEventDataeventData){isTouched=false;selfTransform.anchoredPosition=originPosition;touchedAxis=Vector2.zero;if(this.OnJoyStickTouchEnd!=null)this.OnJoyStickTouchEnd();}publicvoidOnDrag(PointerEventDataeventData){touchedAxis=GetJoyStickAxis(eventData);if(this.OnJoyStickTouchMove!=null)this.OnJoyStickTouchMove(TouchedAxis);}voidUpdate(){//当虚拟摇杆移动到最大半径时摇杆无法拖动//为了确保被控制物体可以继续移动//在这里手动触发OnJoyStickTouchMove事件if(isTouched&&touchedAxis.magnitude>=JoyStickRadius){if(this.OnJoyStickTouchMove!=null)this.OnJoyStickTouchMove(TouchedAxis);}//松开虚拟摇杆后让虚拟摇杆回到默认位置if(selfTransform.anchoredPosition.magnitude>originPosition.magnitude)selfTransform.anchoredPosition-=TouchedAxis*Time.deltaTime*JoyStickResetSpeed;}///<summary>///返回虚拟摇杆的偏移量///</summary>///<returns>Thejoystickaxis.</returns>///<paramname="eventData">Eventdata.</param>privateVector2GetJoyStickAxis(PointerEventDataeventData){//获取手指位置的世界坐标Vector3worldPosition;if(RectTransformUtility.ScreenPointToWorldPointInRectangle(selfTransform,eventData.position,eventData.pressEventCamera,outworldPosition))selfTransform.position=worldPosition;//获取摇杆的偏移量Vector2touchAxis=selfTransform.anchoredPosition-originPosition;//摇杆偏移量限制if(touchAxis.magnitude>=JoyStickRadius){touchAxis=touchAxis.normalized*JoyStickRadius;selfTransform.anchoredPosition=touchAxis;}returntouchAxis;}}
二.接下来,就是拖拽p_w_picpath使物体能够移动了;
为该物体添加脚本:
usingUnityEngine;usingSystem.Collections;publicclassJoyStick3D:MonoBehaviour{privateJoyStickjs;voidStart(){js=GameObject.FindObjectOfType<JoyStick>();js.OnJoyStickTouchBegin+=OnJoyStickBegin;js.OnJoyStickTouchMove+=OnJoyStickMove;js.OnJoyStickTouchEnd+=OnJoyStickEnd;}voidOnJoyStickBegin(Vector2vec){Debug.Log("开始触摸虚拟摇杆");}voidOnJoyStickMove(Vector2vec){Debug.Log("正在移动虚拟摇杆");//设置角色朝向Quaternionq=Quaternion.LookRotation(newVector3(vec.x,0,vec.y));transform.rotation=q;//移动角色transform.Translate(Vector3.forward*75f*Time.deltaTime);}voidOnJoyStickEnd(){Debug.Log("触摸移动摇杆结束");}voidOnGUI(){GUI.Label(newRect(30,30,200,30),"3D模式下的虚拟摇杆测试");}}
三.接着可以试着运行,可以看到物体可以随着p_w_picpath的拖动而移动,但是有不好的地方,就是拖拽的p_w_picpath超过半径所设置的半径JoyStickRadius时,p_w_picpath的位置就会固定在一个位置不动,
而且当在半径范围内时,物体不会持续移动,这个就不好了,不知道有那位大神能够邦杰呢?
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。