赞
踩
制作手游经常见到的摇杆,实现手游摇杆的还原以及功能
第一阶段初始版
用现有的资源做一个圆形的图片,然后往摇杆位置添加脚本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即可实现对对象位置的跟踪
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。