• 用UGUI制作可根据手指位置自动定位的隐形遥杆


    之前写过遥杆怎么做,这里依然用的是之前的方法,就不介绍了。

    之前玩过《蜡烛人》,发现手游版的《蜡烛人》的遥杆是看不见的,手指直接在屏幕左边滑动人物就可以移动,可能是为了增强沉浸感。最近在写2D游戏所以就想来实现一下。

    大概思路:

    1. 把遥杆UI的GetComponent<Image>().color的透明度改为0;

    2.手指落到哪里就修改摇杆的位置在哪里。

    显示隐藏摇杆和自动定位的代码(下面的代码挂在摇杆上)如下:

     1 public void Hide()
     2     {
     3         viewport.GetComponent<Image>().color *= new Color(1, 1, 1, 0);  // 透明度改为0,用乘法
     4         content.GetComponent<Image>().color *= new Color(1, 1, 1, 0);
     5     }
     6     public void Show()
     7     {
     8         viewport.GetComponent<Image>().color += new Color(0, 0, 0, 1);  // 透明度改为1,用加法
     9         content.GetComponent<Image>().color += new Color(0, 0, 0, 1);
    10     }
    11     public void AutoSetPosition(Vector2 screenPos)
    12     {
    13         if ((!Input.GetMouseButton(0) || Input.GetMouseButtonDown(0)) && screenPos.x < Screen.width / 2)  // 在移动端Input.GetMouseButton(0)表示单指按下
    14         {
    15             transform.GetChild(0).localPosition = ScreenPosToLocalPos(GetComponent<RectTransform>(), Input.mousePosition); ;    // 注意是LocalPosition
    16         }
    17 
    18         // 如果采用自动定位的方式,就一定要让stick跟随手指
    19         if (Input.mousePosition.x < Screen.width / 2 && Input.GetMouseButton(0))
    20             content.localPosition = ScreenPosToLocalPos(content.parent.GetComponent<RectTransform>(), Input.mousePosition);
    21     }
    22 
    23     private Vector2 ScreenPosToLocalPos(RectTransform rt, Vector2 pos)
    24     {
    25         Vector2 localPoint;
    26         RectTransformUtility.ScreenPointToLocalPointInRectangle(rt, pos, null, out localPoint);
    27         return localPoint;
    28     }

    遇到的问题:

    1. 一开始我发现手放屏幕上后立即拖动不能拖动stick,因为是先放手,摇杆后根据手定位到手的位置的,所以不能触发拖动事件,所以我就加入了在手机按下时让杆跟随手指移动的代码,在上面有体现。

    补充:

    1.因为摇杆脚本继承了ScrollRect脚本,ScrollRect中有关控制stick的代码位于LateUpdate中,比Update后执行,所以可能会比自己写的控制Stick的代码后执行,所以我们需要对LateUpdate进行覆写,让ScrollRect中控制Stick的代码不执行,不然的话我们写的代码和ScrollRect中的代码都会对stick进行控制,会出BUG的。代码如下:

        protected override void LateUpdate()
        {
            // base.LateUpdate();    控制stick,比如stick的回弹
            if (Input.GetMouseButtonUp(0))
                content.localPosition = Vector2.zero;
            if(Input.GetMouseButton(0))
                if (content.localPosition.magnitude > radius)
                    content.localPosition = content.localPosition.normalized * radius;
            stickPos = content.localPosition / radius;
        }
  • 相关阅读:
    模块
    关于使用 jBox 对话框的提交问题
    Julia is a high-level, high-performance dynamic programming language for technical computing, with syntax that is familiar to users of other technical
    Julia语言:让高性能科学计算人人可用
    [ASP.NET Web API]如何Host定义在独立程序集中的Controller
    ASHX呼叫ASPX.cs的方法
    robotlegs2.0框架实例源码带注释
    指针指向一块内存,它的内容是所指内存的地址;而引用则是某块内存的别名(转)
    老板该如何正确的犒赏程序员(转)
    Jass 技能模型定义(转)
  • 原文地址:https://www.cnblogs.com/csymaet/p/9751776.html
Copyright © 2020-2023  润新知