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

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

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

学习目标:

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

学习内容以及内容展示:

第一阶段初始版

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

 

关注
打赏
1688896170
查看更多评论

dangoxiba

暂无认证

  • 4浏览

    0关注

    55博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

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

微信扫码登录

0.2719s