文章列表 Unity游戏开发——新发教你做游戏(一):打开游戏开发新世界的大门 Unity游戏开发——新发教你做游戏(二):60个Unity免费资源获取网站 Unity游戏开发——新发教你做游戏(三):3种资源加载方式 Unity游戏开发——新发教你做游戏(四):角色移动控制 Unity游戏开发——新发教你做游戏(五):导航系统Navigation Unity游戏开发——新发教你做游戏(六):教你2个步骤实现摇杆功能 Unity游戏开发——新发教你做游戏(七):Animator控制角色动画播放 本工程Demo我已上传到GitHub,感兴趣的同学可以下载下来学习。 GitHub工程地址:https://github.com/linxinfa/Unity-RpgGameDemo 嗨,大家好,我是新发,上一篇文章我们讲了导航系统Navigation,也讲了点击地图自动寻路的实现。现在,来讲讲摇杆功能的实现。
游戏开发中,摇杆功能是很常见的,Unity的UGUI提供了ScrollRect组件,非常适合用来制作摇杆。
如下,创建一个Image,取名为JointedArm,下面创建两个Image,分别是bg和center。 其中,JointedArm节点的Image赋值为None,调整大小,它仅作为碰撞区域的检测。 为什么要搞这么大的区域呢,因为一般摇杆的点击区域是远大于摇杆所显示的UI本身的,玩家点中这个区域,摇杆就可以检测到,并跟着移动过去,松手的时候,摇杆复位。如下效果
将下面的JointedArm.cs脚本挂在UI节点JointedArm上,如下:
using UnityEngine; using UnityEngine.EventSystems; using UnityEngine.UI; public class JointedArm : ScrollRect, IPointerDownHandler { protected float mRadius = 0f; private Transform m_trans; private Transform m_bgTrans; private Vector3 m_originalPos; protected override void Awake() { base.Awake(); m_trans = transform; m_bgTrans = m_trans.Find("bg"); m_originalPos = m_trans.localPosition; } void Update() { if (Input.GetMouseButtonUp(0)) { //松手时,摇杆复位 m_trans.localPosition = m_originalPos; this.content.localPosition = Vector3.zero; } } protected override void Start() { base.Start(); //计算摇杆块的半径 mRadius = (m_bgTrans as RectTransform).sizeDelta.x * 0.5f; } public override void OnDrag(UnityEngine.EventSystems.PointerEventData eventData) { base.OnDrag(eventData); var contentPostion = this.content.anchoredPosition; if (contentPostion.magnitude > mRadius) { contentPostion = contentPostion.normalized * mRadius; SetContentAnchoredPosition(contentPostion); } Debug.Log("摇杆滑动,方向:" + contentPostion); } public override void OnEndDrag(PointerEventData eventData) { base.OnEndDrag(eventData); Debug.Log("摇杆拖动结束"); } public void OnPointerDown(PointerEventData eventData) { //点击到摇杆的区域,摇杆移动到点击的位置,注:GlobalObjs.mainCam2D是UI摄像机 m_trans.position = GlobalObjs.mainCam2D.ScreenToWorldPoint(eventData.position); m_trans.localPosition = new Vector3(m_trans.localPosition.x, m_trans.localPosition.y, 0); } }这样我们的摇杆功能就实现了。
下一篇,我将讲讲摄像机跟随逻辑的实现。