手写摇杆移动

废话不多说,上代码!

摇杆代码

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); // 沿着自身的前方移动一段距离
        }
    }
}

设置:

 

效果展示

 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值