欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

unity实现手游虚拟摇杆

程序员文章站 2023-11-14 14:57:34
本文实例为大家分享了unity实现手游虚拟摇杆的具体代码,供大家参考,具体内容如下using system.collections;using system.collections.generic;u...

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

using system.collections;
using system.collections.generic;
using unityengine;
using unityengine.ui;
/// <summary>
/// 绑定到摇杆上的摇杆类,参考半径50
/// </summary>
public class rocker : monobehaviour {

  vector2 m_offet;//偏移向量
  vector2 m_originalpos;//摇杆原始屏幕坐标
  touch[] touches;//屏幕上触控点数组
  int touch_id = -1;//触控点数组下标
  bool ismove = false;//是否移动
  float m_screenscale;
  /// <summary>
  /// 给外部调用的偏移向量,告知摇杆参数
  /// </summary>
  public vector3 offet
  {
    get
    {
      return m_offet;
    }
  }

  // use this for initialization
  void start () {

    m_originalpos = transform.position;//摇杆中心的屏幕坐标位置
    m_screenscale = screen.width / 800f;
  }

  // update is called once per frame
  void update () {
    //得到屏幕触控数组
    touches = input.touches;
    if (touches.length > 0)//如果触点开启
    {
      //得到离摇杆中心最近的触点下标 touch_id;
      if (touches.length == 1)//只有一个触点时
      {
        touch_id = 0;
      }
      else if (touches.length > 1)//触点大于1个时
      {
        touch_id = 0;//先假设下标为0
        for (int i = 1; i < touches.length; i++)//遍历触点数组
        {
          if (vector2.sqrmagnitude(touches[i].position - m_originalpos) < vector2.sqrmagnitude(touches[touch_id].position - m_originalpos))//第i个点比假设的点近
          {
            touch_id = i;//假设的点改为第i个点
          }
        }

      }

      //如果得到的触点不是取消或抬起
      if (input.gettouch(touch_id).phase != touchphase.canceled && input.gettouch(touch_id).phase != touchphase.ended)
      {
        //触点在摇杆范围内
        if(vector2.sqrmagnitude(touches[touch_id].position - m_originalpos) <= 50*50 * m_screenscale * m_screenscale)//50为背景半径
        {
          ismove = true;//开启遥控
          //摇杆开始控制,计算偏移量
          setoffetin();
        }
        else if(ismove)//触点在摇杆范围外,但是遥控已经开启
        {
          setoffetout();
        }
      }
      else// 手指抬起,摇杆回归原始位置
      {
        transform.position = m_originalpos;
        m_offet = vector2.zero;
        ismove = false;
        touch_id = -1;
      }
    }

  }
  /// <summary>
  /// 触点在操作盘内时
  /// 摇杆控制方法
  /// </summary>
  void setoffetin()
  {
    //距离过小视为不偏移摇杆位置不变
    if(vector2.sqrmagnitude(touches[touch_id].position - m_originalpos) < 5 * m_screenscale)
    {
      getcomponent<image>().recttransform.position = m_originalpos;//摇杆定位在原始位置
      m_offet = vector3.zero;
    }
    else
    {
      //摇杆位置追踪
      getcomponent<image>().recttransform.position = touches[touch_id].position;
      m_offet = touches[touch_id].position - m_originalpos;//赋值偏移值
      m_offet = m_offet.normalized;//归一化
    }
  }
  /// <summary>
  /// 触点在操作盘外时
  /// 摇杆控制方法
  /// </summary>
  void setoffetout()
  {
    vector2 tempdir;//临时偏移向量
    tempdir = touches[touch_id].position - m_originalpos;
    //更新摇杆位置:距离原始位置127各单位
    getcomponent<image>().recttransform.position = m_originalpos + (tempdir.normalized) * 25*m_screenscale;
    //偏移量
    m_offet = tempdir.normalized;//归一化
  }
  private void ongui()
  {
    guistyle style = new guistyle(); //实例化一个新的guistyle,名称为style ,后期使用
    style.fontsize = 50; //字体的大小设置数值越大,字越大,默认颜色为黑色 
    style.normal.textcolor = new color(1, 1, 1); //设置文本的颜色为 新的颜色(0,0,0)修改值-代表不同的颜色,值为整数 我个人觉得有点像rgb的感觉
    gui.label(new rect(20, 30, 300, 60), "原始位置:" + m_originalpos.tostring(),style);
    gui.label(new rect(20, 100, 300, 60), "摇杆位置:" + getcomponent<image>().recttransform.position.tostring(), style);
    gui.label(new rect(20, 170, 300, 60), "触点位置:" + touches[touch_id].position.tostring(), style);
    gui.label(new rect(20, 240, 300, 60), "屏幕分辨率:" + screen.currentresolution, style);


  }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。