一、前言
文章列表
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
组件,非常适合用来制作摇杆。
1、UI制作
如下,创建一个Image
,取名为JointedArm
,下面创建两个Image
,分别是bg
和center
。
其中,JointedArm
节点的Image
赋值为None
,调整大小,它仅作为碰撞区域的检测。
为什么要搞这么大的区域呢,因为一般摇杆的点击区域是远大于摇杆所显示的UI
本身的,玩家点中这个区域,摇杆就可以检测到,并跟着移动过去,松手的时候,摇杆复位。如下效果
2、摇杆代码
将下面的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);
}
}
这样我们的摇杆功能就实现了。
下一篇,我将讲讲摄像机跟随逻辑的实现。