Unity2D教程:通过摇杆控制人物移动

关注专栏,持续更新哦

教程总目录


创建摇杆

  • 还是要提醒一下Canvas设置size随屏幕大小变化而变化。
    在这里插入图片描述
  • 创建UI内的Image,设置为摇杆背景。需要设置锚点为左下角。
    在这里插入图片描述
  • 在Rocker下再创一个Image,RockerCenter。锚点要在正中间。
    在这里插入图片描述
  • 创建脚本ScrollCircle,并给Rocker。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;

public class ScrollCircle : ScrollRect
{
    // 自己设置大小使得摇杆最大距离合适
    private float distanceRate = 0.25f;
    // 可以移动半径
    public float radius = 0f;
    // 自己设置有效感应半径是最大感应半径的多少
    private float validRate = 0.5f;
    // 有效感应半径
    public float radiusValid = 0f;

    protected override void Start()
    {
        base.Start();
        radius = content.sizeDelta.x * content.localScale.x * distanceRate;
        radiusValid = radius * validRate;
    }

    // 通过content.anchoredPosition来得到偏移的方向向量
    // 注意释放后还是有0.003左右的误差,且释放后会慢慢往中心拉,所以需要设置有效感应半径
    public override void OnDrag(PointerEventData eventData)
    {
        base.OnDrag(eventData);

        // 获取摇杆位置,根据锚点的位置。
        Vector2 pos = content.anchoredPosition;
        // 通过偏移向量的长度计算距离,如果超出就拉回来
        if (pos.magnitude > radius)
        {
            pos = pos.normalized * radius;
            SetContentAnchoredPosition(pos);
        }
    }
}
  • 我们通过content.anchoredPosition来得到偏移的方向向量。
  • 注意释放后还是有0.003左右的误差,且释放后会慢慢往中心拉,所以需要设置有效感应半径。

绑定角色移动

  • 之前是用Input.GetAxisRaw通过键盘移动,按照规则来应该是当摇杆往左移动时X=-1,否则X=1;Y同理。
  • 由于释放后的误差以及缓慢的恢复过程,我们写一个标准函数,让(-V,V)之间的数变为0,大于V的变为1,小于-V的变为-1。其中V是ScrollCircle中设定的有效半径。
// 通过L,R来让数变为-1,0,1
public static void SetNumberWithOneAndZero(ref float number,float l,float r)
{
    if (number > l && number < r) number = 0;
    else if (number > r) number = 1;
    else number = -1;
}

Player:

rocker = GameObject.FindGameObjectWithTag("Rocker").GetComponent<ScrollCircle>();
Vector2 moveDirection = rocker.content.anchoredPosition;
float radiusValid = rocker.radiusValid;
Helper.SetNumberWithOneAndZero(ref moveDirection.x, -radiusValid, radiusValid);
Helper.SetNumberWithOneAndZero(ref moveDirection.y, -radiusValid, radiusValid);

完成:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/jk_chen_acmer/article/details/106966966