制作手游经常见到的摇杆,实现手游摇杆的还原以及功能
学习内容以及内容展示:第一阶段初始版
用现有的资源做一个圆形的图片,然后往摇杆位置添加脚本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即可实现对对象位置的跟踪