前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Unity3d+moba+UGUI摇杆

Unity3d+moba+UGUI摇杆

作者头像
立羽
发布2023-08-24 13:25:02
1610
发布2023-08-24 13:25:02
举报
文章被收录于专栏:Unity3d程序开发

1 功能描述

使用UGUI制作摇杆,摇杆的初始位置是可变的,当按下同时改变Bg位置和thumb位置,当松手时Bg,thumb返回初始原位。主要函数:ScreenPointToLocalPointInRectangle,Vector3.Distance。

2 详细设计

Bg为摇杆的大圆背景,thumb为中心小圆,JoyCollider为可触发碰撞区(可设置大小,只有按在此区域才能触发摇杆的操作)

2.1 主要类成员

代码语言:javascript
复制
public GameObject m_objJoyCollider;//碰撞区域
    public GameObject m_objThumb;//中心小圆
    public GameObject m_objBg;//背景大圆
    public Canvas can;//主要为获取画布上的摄像机

    private float m_limitBg;//大圆移动限制
    private float m_limitThumb;//小圆移动限制

    public GameObject m_cube;
    public bool m_bMoving;//可用作防在摇杆区域多点触控
    public Vector3 m_dir;//方向供外部调用摇杆的方向
public Touch m_touch;//保存按下时触摸点信息

2.2 当按在触摸区域时

代码语言:javascript
复制
void onDownCollider(GameObject obj)
    {
        m_bMoving = true;
        RectTransform rect = transform as RectTransform;
        Vector3 newPos;
        if (Application.platform == UnityEngine.RuntimePlatform.WindowsEditor)
        {
            newPos = uiPosGet(Input.mousePosition, rect);
        }
        else
        {
            m_touch = Input.touches[Input.touches.Length - 1];
            newPos = uiPosGet(m_touch.position, rect);
        }
        float dis = Vector3.Distance(newPos, new Vector3(0,0,0));//鼠标与中心距离
        if (dis <= m_limitBg)
        {
            newPos = newPos*dis/m_limitBg;
        }
        else
        {
            Vector3 normalPos = newPos.normalized;
            newPos = normalPos*m_limitBg*1.5f;
        }
        m_objBg.transform.localPosition = newPos;
        StartCoroutine("yieldStickMove");
        
}

1.得到触摸坐标转化为相对ui父节点的localPostion

2.设置Bg的位置,注意位置有限制,不能让这个大圆的部分超过屏幕边缘。

3.开启协程

2.3 手指移动时

代码语言:javascript
复制
private IEnumerator yieldStickMove()
    {
        while (true)
        {
            RectTransform rect = m_objBg.GetComponent<RectTransform>();
            Vector3 realTouchPos = Vector3.zero;
            if (Application.platform == UnityEngine.RuntimePlatform.WindowsEditor)
            {
                realTouchPos = uiPosGet(Input.mousePosition, rect);
            }
            else
            {
                for (int i = 0; i < Input.touchCount; i++ )
                {
                    if ( m_touch.fingerId == Input.touches[i].fingerId)
                    {
                        realTouchPos = uiPosGet(Input.touches[i].position, rect);
                    }
                }
            }
       
            float dis = Vector3.Distance(new Vector3(0,0,0), realTouchPos);
            if (dis <= m_limitThumb)
            {
                Vector3 normalPos = realTouchPos.normalized;
                m_objThumb.transform.localPosition = realTouchPos;
            }
            else
            {
                Vector3 normalPos = realTouchPos.normalized;
                realTouchPos = normalPos * m_limitThumb;
                m_objThumb.transform.localPosition = realTouchPos;
            }

            m_dir = m_objThumb.transform.localPosition.normalized;

            Vector3 cubePos = m_cube.transform.position;
            m_cube.transform.LookAt(new Vector3(cubePos.x + m_dir.x, cubePos.y, cubePos.z + m_dir.y));
            m_cube.transform.Translate(Vector3.forward * Time.deltaTime * 70);

            yield return null;
        }
}

1.thumb坐标相对bg坐标超过限制时与没超过时处理

2.得到thumb的localPostion的移动偏移的标准向量作为摇杆的传出信息

2.3当手指松开始时

代码语言:javascript
复制
    void onUpCollider(GameObject obj)
    {
        StopCoroutine("yieldStickMove");
        m_objBg.transform.localPosition = new Vector3(0,0,0);
        m_objThumb.transform.localPosition = new Vector3(0,0,0);
        m_bMoving = false;
}

Ui回到初始位置。

3 运行效果

源码地址

https://download.csdn.net/download/luoyikun/10345848

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2016-05-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1 功能描述
  • 2 详细设计
    • 2.1 主要类成员
      • 2.2 当按在触摸区域时
        • 2.3 手指移动时
          • 2.3当手指松开始时
          • 3 运行效果
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档