Unity 简单的虚拟摇杆

需求:点击创建一个虚拟摇杆底盘,鼠标拖拽时候上方摇杆会跟随鼠标方向移动,并且不会超出摇杆盘范围
*摇杆功能另外实现

在这里插入图片描述
在这里插入图片描述


UI显示

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class RockingIcon : MonoBehaviour
{
  public Transform touchPoint;
  public Transform bgPoint;
  public float radius;
  bool isPressing;
  Vector3 bgPos;

  private void Update()
  {
    bool pressing;
    Vector3 pos;
    if (Application.isEditor)
      GetPressingInfoInEditor(out pressing, out pos);
    else
      GetPressingInfoInPhone(out pressing, out pos);
    SetIcon(pressing, pos);

  }

  void GetPressingInfoInEditor(out bool pressing, out Vector3 pos)
  {
    if (Input.GetMouseButton(0))
    {
      pressing = true;
      pos = Input.mousePosition;
    }
    else
    {
      pressing = false;
      pos = Vector3.zero;
    }
  }

  void GetPressingInfoInPhone(out bool pressing, out Vector3 pos)
  {
    if(Input.touchCount > 0)
    {
      pressing = true;
      pos = Input.GetTouch(0).position;
    }
    else
    {
      pressing = false;
      pos = Vector3.zero;
    }
  }


  void SetIcon(bool pressing, Vector3 pos)
  {
    if (pressing)
    {
      if (!isPressing)
      {
        bgPoint.gameObject.SetActive(true);
        bgPoint.transform.position = pos;
        bgPos = pos;
        isPressing = true;
      }
      else
      {
        bgPoint.gameObject.SetActive(true);
        SetTouchPointPos(pos);
      }
    }
    else
    {
      touchPoint.gameObject.SetActive(false);
      bgPoint.gameObject.SetActive(false);
      isPressing = false;
    }
  }

  void SetTouchPointPos(Vector3 pos)
  {
    Vector3 center = bgPoint.position;
    Vector3 touch = pos;
    Vector3 to;
    float distance = Vector3.Distance(center, touch);
    if (distance < radius)
      to = touch;
    else
    {
      Vector3 dir = touch - center;
      dir.Normalize();
      to = dir * radius;
      to += center;
    }
    touchPoint.gameObject.SetActive(true);
    touchPoint.transform.position = to;
  }
}

预制:
在这里插入图片描述


操作控制

    #region 鼠标操作

    float min_move_x = Global.min_move_distance * (Screen.width / 1080f);
    float min_move_y = Global.min_move_distance * (Screen.height / 1900f);

    if(Application.platform == RuntimePlatform.WindowsEditor)
    {
      if (Input.GetMouseButtonDown(0))
      {
        touch_time = 0;
        first_touch_pos = Input.mousePosition;
      }
      else if (Input.GetMouseButton(0))
      {

        touch_time += Time.deltaTime;
        if (touch_time >= Global.touch_time_limit)
        {
         Vector2 touch_pos = Input.mousePosition;
          Vector2 distance = touch_pos - first_touch_pos;

          //Vector2 touch_pos_in_func = PosInTheFunc(touch_pos);
          //Vector2 first_pos_in_func = PosInTheFunc(first_touch_pos);
          //Vector2 distance = touch_pos_in_func - first_pos_in_func;

          if (Mathf.Abs(distance.x) > min_move_x && Mathf.Abs(distance.x) > Mathf.Abs(distance.y)) Move(distance.x > 0 ? Vector3.right : Vector3.left);
          if (Mathf.Abs(distance.y) > min_move_y && Mathf.Abs(distance.y) > Mathf.Abs(distance.x)) Move(distance.y > 0 ? Vector3.forward : Vector3.back);
        }
      }
      else if (Input.GetMouseButtonUp(0))
      {

        //if(touch_time < Global.touch_time_limit)
        //{
        //  PutBoomb();
        //}
        touch_time = 0;
        first_touch_pos = Vector3.zero;
      }
    }
    #endregion
    #region 手机操作

    if (Application.platform == RuntimePlatform.Android)
    {
      if (Input.touchCount > 0)
      {

        Touch touch = Input.GetTouch(0);
        if (touch.phase == TouchPhase.Began)
        {
          first_touch_pos = touch.position;
          

        }
        else if (touch.phase == TouchPhase.Ended)
        {
          first_touch_pos = Vector3.zero;
        }
        else if (touch.phase == TouchPhase.Moved || touch.phase == TouchPhase.Stationary)
        {
          Vector2 touch_pos = touch.position;
          Vector2 distance = touch_pos - first_touch_pos;
          if (Mathf.Abs(distance.x) > min_move_x && Mathf.Abs(distance.x) > Mathf.Abs(distance.y)) Move(distance.x > 0 ? Vector3.right : Vector3.left);
          if (Mathf.Abs(distance.y) > min_move_y && Mathf.Abs(distance.y) > Mathf.Abs(distance.x)) Move(distance.y > 0 ? Vector3.forward : Vector3.back);

        }
      }
    }

猜你喜欢

转载自blog.csdn.net/qq_33205561/article/details/89028711
今日推荐