程序员技术栈

NGUI手游摇杆制作

2019-10-24  本文已影响0人  Walk_In_Jar

https://blog.csdn.net/snowdust/article/details/5895593

目的是在一个限定的区域内,触摸开始,就在这个位置使用转盘来控制人物的行走之类的,类似王者农药的转盘操作,手指之间不能影响。


image.png

开始制作:
首先需要ngui插件,自行搜索。
创建UIRoot,分辨率对齐1920*1080


image.png

然后创建一个空白的UI2D Sprite


image.png

区域是整个屏幕左下角的四分之一


image.png
其锚点设置如下,并添加Box Collider组件,与区域保持一致
image.png

放入摇杆素材,大小合适。


image.png
编写代码:
需要用到UIDragDropItem.cs脚本
新建一个脚本PanController.cs挂载到 PanArea 上,因为它是移动区域。
PanController继承UIDragDropItem,定义如下变量:
 public Transform pan, move;//摇杆背景与移动摇杆。
    //摇杆pan移动的最远距离
    public float range = 110;
    private Vector2 orgPos, startPos;//一些初始参数
    //输出参数
    public float  x,y;

重写start方法,让摇杆一开始的透明度低些,并记录此时摇杆pan物体的本地位置。

    protected override void Start()
    {
        base.Start();
        pan.GetComponent<UI2DSprite>().alpha = 0.6f;
        orgPos = pan.gameObject.transform.localPosition;
    }

重写OnPress方法,参数isPressed在按下时为true,松开为false,非常适合摇杆按下的初始化操作和释放操作。

    protected override void OnPress(bool isPressed)
    {
         base.OnPress(isPressed);
        if (isPressed)
        {
           if (UICamera.currentTouchID < 0)//鼠标也会触发,屏蔽鼠标的输入
            {
                return;
            }
//在按下时摇杆pan的透明度提升,并且记录按下时手指的位置startpos,并将其转化,与屏幕的一半相减,让摇杆pan的位置在这里
            pan.GetComponent<UI2DSprite>().alpha = 1f;
            startPos = Input.touches[UICamera.currentTouchID].position-new Vector2 (Screen.width,Screen.height)/2;
            pan.gameObject.transform.localPosition = startPos;
        }
        else
        {
//松开摇杆时,让pan透明度降低,并让里面的按钮回到原点,pan的位置回到没有按下的位置
            pan.GetComponent<UI2DSprite>().alpha = 0.6f;
            move.localPosition = Vector2.zero;
            pan.gameObject.transform.localPosition = orgPos;
        }
    }

那么在移动时,重写OnDrag方法

  protected override void OnDrag(Vector2 delta)
    {
        Vector2 pos= (Input.touches[UICamera.currentTouchID].position - new Vector2(Screen.width / 2, Screen.height / 2)-startPos);
        if (pos.magnitude >= range)
        {
            x = pos.normalized.x;
            y = pos.normalized.y;
            move.localPosition = pos.normalized * range;
        }
        else
        {
            x = pos.x / range;
            y = pos.y / range;
            move.localPosition = pos;
        }
        Debug.Log(x + " ," + y);
        //输出了x,与y  其满足x²+x²=1
    }

后面是一些文档
visual studio 2019下载慢的 将下面的添加到host,不确定安全性
110.53.72.104 download.visualstudio.microsoft.com

//判断是否存在光传感器来判断是否为模拟器

public bool GetIsSimulator()
    {
#if UNITY_ANDROID
        AndroidJavaObject sensorManager  = currentActivity.Call<AndroidJavaObject>("getSystemService", "sensor");
        AndroidJavaObject sensor  = sensorManager.Call<AndroidJavaObject>("getDefaultSensor",5);    //光传感器
        if(sensor == null){
            return true;
        }else{
            return false;
        }
# endif
        return false;
    }
上一篇 下一篇

猜你喜欢

热点阅读