当前位置:   article > 正文

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

ibegindraghandler,ienddraghandler 摇杆

学习目标:

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


学习内容以及内容展示:

第一阶段初始版

用现有的资源做一个圆形的图片,然后往摇杆位置添加脚本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即可实现对对象位置的跟踪

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/567320
推荐阅读
相关标签
  

闽ICP备14008679号