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);

完成:
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章