Unity游戏开发——新发教你做游戏(六):教你2个步骤实现摇杆功能

一、前言

文章列表
Unity游戏开发——新发教你做游戏(一):打开游戏开发新世界的大门
Unity游戏开发——新发教你做游戏(二):60个Unity免费资源获取网站
Unity游戏开发——新发教你做游戏(三):3种资源加载方式
Unity游戏开发——新发教你做游戏(四):角色移动控制
Unity游戏开发——新发教你做游戏(五):导航系统Navigation
Unity游戏开发——新发教你做游戏(六):教你2个步骤实现摇杆功能
Unity游戏开发——新发教你做游戏(七):Animator控制角色动画播放
在这里插入图片描述
本工程Demo我已上传到GitHub,感兴趣的同学可以下载下来学习。
GitHub工程地址:https://github.com/linxinfa/Unity-RpgGameDemo
在这里插入图片描述
嗨,大家好,我是新发,上一篇文章我们讲了导航系统Navigation,也讲了点击地图自动寻路的实现。现在,来讲讲摇杆功能的实现。

二、摇杆功能的实现

游戏开发中,摇杆功能是很常见的,UnityUGUI提供了ScrollRect组件,非常适合用来制作摇杆。

1、UI制作

如下,创建一个Image,取名为JointedArm,下面创建两个Image,分别是bgcenter
在这里插入图片描述
其中,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);
    }
}

这样我们的摇杆功能就实现了。

下一篇,我将讲讲摄像机跟随逻辑的实现。

  • 8
    点赞
  • 62
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

林新发

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值