您当前的位置: 首页 >  dangoxiba unity

【Unity】制作一个简单的摇杆

dangoxiba 发布时间:2021-12-05 23:47:48 ,浏览量:5

学习目标:

制作手游经常见到的摇杆,实现手游摇杆的还原以及功能

学习内容以及内容展示:

第一阶段初始版

用现有的资源做一个圆形的图片,然后往摇杆位置添加脚本script

 

学习三个回调函数,先调用它们的接口IBeginDragHandler, IDragHandler, IEndDragHandler

利用Input.mousePositon,使中间摇杆的位置等于鼠标的位置

并且要保证摇杆到边缘的时候不能超出边缘,以及松鼠标后,摇杆要回到中心位置以下是代码展示

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;

public class rockermsg : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler
{
    [Header("摇杆移动半径的长度")]
    public float radius = 100f;

    private Vector3 originPos;

    private float distance;
    private void Start()
    {
        originPos = transform.position;
    }
    public void OnBeginDrag(PointerEventData eventData)
    {
        
    }

    public void OnDrag(PointerEventData eventData)
    {
        //计算位置
        distance = Vector3.Distance(originPos, transform.position);
        if (distance < radius)
        {
            transform.position = Input.mousePosition;
        }
    }

    public void OnEndDrag(PointerEventData eventData)
    {
        transform.position = originPos;
    }
}

然而功能实现后还是有些缺陷,比如如果我要一直移到边缘(就是不松鼠标)后绕个角度换方向,会发现摇杆卡在边缘了,怎么也移不动,这时候就要改变了

如果距离大于radius,那么就计算鼠标位置以及原始位置的方向向量,再用它的单位向量*radius+原始位置的向量,等于的就是transform.position

图片来自:【千锋合集】史上最全Unity3D全套教程|匠心之作_哔哩哔哩_bilibili的P273集

有了之后就可自由转向了

 

 完整版代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;

public class rockermsg : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler
{
    [Header("摇杆移动半径的长度")]
    public float radius = 100f;

    private Vector3 originPos;

    private float distance;

    private Vector3 dir;
    private void Start()
    {
        originPos = transform.position;
    }
    public void OnBeginDrag(PointerEventData eventData)
    {
        
    }

    public void OnDrag(PointerEventData eventData)
    {
        //计算位置
        distance = Vector3.Distance(Input.mousePosition, originPos);
        if (distance < radius)
        {
            transform.position = Input.mousePosition;
        }
        else
        {
            //求方向向量
            dir = Input.mousePosition - originPos;
            //计算圆心指向摇杆位置的方向向量
            transform.position = dir.normalized * radius + originPos;
        }
    }

    public void OnEndDrag(PointerEventData eventData)
    {
        transform.position = originPos;
    }
}
 

 

 

学习时间:

啪的一下,就学完了,很快啊 

学习产出:

记得三个接口对应的三个回调IBeginDragHandler, IDragHandler, IEndDragHandler

用Input.mousePosition即可实现对对象位置的跟踪

 

关注
打赏
查看更多评论

dangoxiba

暂无认证

  • 5浏览

    0关注

    55博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文
立即登录/注册

微信扫码登录