废话不多说,上代码!
摇杆代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
public class Rocker : MonoBehaviour, IDragHandler, IEndDragHandler//继承拖拽中接口、结束拖拽接口
{
int R = 150; // 定义一个半径变量R,用于限制摇杆移动范围 提示:如何得?摇杆地图的(宽或者高)/ 2
Vector3 startPos, dir; // 定义起始位置和移动方向变量
RectTransform thrm; // 声明一个RectTransform类型的变量thrm
void Start()
{
thrm = GetComponent<RectTransform>(); // 获取当前对象的RectTransform组件
//thrm = transform as RectTransform; 第二种写法,Transform和RectTransform之间存在关系。RectTransform是Transform的子类,因此可以将Transform对象转换为RectTransform对象。
startPos = transform.position; // 存储初始位置
}
public void OnDrag(PointerEventData eventData)//拖拽中接口
{
dir = Input.mousePosition - startPos; // 计算移动方向向量:鼠标位置减去起始位置
if (dir.magnitude < R) // 如果移动距离小于半径R
{
transform.position = Input.mousePosition; // 直接将摇杆位置设置为鼠标位置
}
else
{
transform.position = dir.normalized * R + startPos; // 将摇杆位置设置为标准化的移动方向向量乘以半径R再加上起始位置
}
}
public void OnEndDrag(PointerEventData eventData)//结束拖拽接口
{
transform.position = startPos; // 当结束拖拽时,将摇杆位置重置为起始位置
}
public float GetAxi(string str) // 获取指定轴的值
{
if (str == "Horizontal") // 如果指定的是水平轴
{
return thrm.anchoredPosition.x / R; // 返回摇杆相对于半径R的水平偏移值
}
else if (str == "Vertical") // 如果指定的是垂直轴
{
return thrm.anchoredPosition.y / R; // 返回摇杆相对于半径R的垂直偏移值
}
return 0; // 默认返回0
}
}
玩家移动代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerMove : MonoBehaviour
{
public Rocker rocker;//摇杆脚本
void Update()
{
float h = rocker.GetAxi("Horizontal"); // 获取水平轴的值
float v = rocker.GetAxi("Vertical"); // 获取垂直轴的值
Vector3 dir = new Vector3(h, 0, v); // 创建一个三维向量dir,用获取到的轴值构建,忽略y轴
if (dir != Vector3.zero) // 如果dir不等于零向量(位置有改变)
{
transform.LookAt(transform.position + dir); // 将当前对象朝向(看向)自身位置 + dir 的方向
transform.Translate(Vector3.forward * 5 * Time.deltaTime); // 沿着自身的前方移动一段距离
}
}
}
设置:
效果展示