Unity实现简单的虚拟摇杆

作者:RiKoPon 时间:2023-01-26 11:38:14 

本文实例为大家分享了Unity实现简单虚拟摇杆的具体代码,供大家参考,具体内容如下

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

Unity实现简单的虚拟摇杆

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

预制:

Unity实现简单的虚拟摇杆

操作控制


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

}
  }
 }

来源:https://blog.csdn.net/qq_33205561/article/details/89028711

标签:Unity,虚拟摇杆
0
投稿

猜你喜欢

  • Android开发之绘制平面上的多边形功能分析

    2023-12-13 13:31:57
  • Android RecyclerView实现点击条目删除

    2022-09-09 11:20:38
  • 在idea中使用JaCoCo插件统计单元测试覆盖率的实现

    2022-12-27 12:31:28
  • android开发教程之startActivityForResult使用方法

    2022-04-03 13:46:16
  • Mybatis关联映射举例详解

    2023-08-05 18:18:40
  • 解决IDEA2020 创建maven项目没有src/main/java目录和webapp目录问题

    2022-05-29 07:57:18
  • mybatisPlus实现倒序拼接字符串

    2021-11-16 08:50:29
  • SpringBoot项目jar发布后如何获取jar包所在目录路径

    2023-02-23 08:36:04
  • java反射之Method的invoke方法实现教程详解

    2023-07-09 20:24:36
  • Java 随机生成任意组电话号码过程解析

    2022-12-27 21:24:02
  • Java中的this、package、import示例详解

    2021-06-10 10:37:50
  • mybatis-plus返回查询总记录数方式

    2021-11-27 01:31:34
  • Android仿美团下拉菜单(商品选购)实例代码

    2023-05-07 06:03:34
  • java生成饼图svg及JFreeChart生成svg图表

    2023-10-25 19:27:00
  • 教你使用idea搭建ssm详细教程(Spring+Spring Mvc+Mybatis)

    2021-09-23 12:37:42
  • 浅谈Java线程间通信之wait/notify

    2022-06-09 11:26:19
  • Android自定义View实现开关按钮

    2021-09-08 08:53:22
  • java简单实现用语音读txt文档方法总结

    2022-11-10 22:02:54
  • Android基于TextView实现的跑马灯效果实例

    2023-10-07 02:45:05
  • java使用Filter实现自动登录的方法

    2022-09-09 15:46:47
  • asp之家 软件编程 m.aspxhome.com