Android开发 移动端适配

1 UI自适应(UGUI)

UI自适应又分为锚点自适应和缩放。锚点主要控制UI控件在父控件之中的位置,同时也能影响缩放。

锚点自适应缩放:

我们使用UGUI创建一个界面,设计使用1920x1080分辨率

在我们设计好,然后改变设计大小时,会发生意想不到的情况

这个时候我们可以使用锚点的自适应,在这里选择好缩放方法和设计尺寸

然后不管我们怎么缩放,都能够很好的适配

2 视口自适应(摄像机)

首先创建一个场景

然后我们改变视口大小,发现Unity的自适应做的很好,只不过它是优先保证高度看全,自动裁剪宽度上的东西

有的时候我们需要宽度看全,高度不需要。这个时候我们可以在摄像机上挂一个脚本来控制。

using UnityEngine;

public class CamearAdaptation : MonoBehaviour 
{
    public float initOrthoSize;
    public float initWidth;
    public float initHeight;
    float factWidth;
    float factHeight;

	void Start () 
	{
        factWidth = Screen.width;
        factHeight = Screen.height;
        //实际正交视口 = 初始正交视口 * 初始宽高比 / 实际宽高比
        GetComponent<Camera>().orthographicSize = (initOrthoSize * (initWidth / initHeight)) / (factWidth / factHeight);
    }
}

3 Touch类介绍

下面的代码包含了Touch类的一些成员,然后使用这个做了一个手指追踪的小Demo和单手势识别的小Demo,还有返回键的操控权,以及双端通用的API

using UnityEngine;
using UnityEngine.UI;

public class TouchDemo : MonoBehaviour 
{
    public GameObject effectPrefab;
    public Text infoText;
    GameObject markGo;
    string info;
    Vector2 touchOrigin;

    void Start()
    {
        // 这句代码表示使用Android的返回键直接退出App
        Input.backButtonLeavesApp = true;
    }

    void Update () 
	{
        // 返回键,点击Android的返回键会调用
        if (Input.GetKeyDown(KeyCode.Escape))
        {
            info += "Escape
";
        }
        //所有Touch类在PC端均不生效
        //每当一个手指触摸屏幕时,Unity都会为其生成一个Touch对象
        //Input.touchCount可以获取当前Touch对象的个数
        if (Input.touchCount > 0)
        {
            info = string.Empty;
            //以下三行在移动端也生效,带来方便的同时也会带来隐患
            info += "GetMouseButton(0) : " + Input.GetMouseButton(0) + "
";
            info += "GetAxis("Mouse X") : " + Input.GetAxis("Mouse X") + "
";
            info += "GetAxis("Mouse Y") : " + Input.GetAxis("Mouse Y") + "
";
            info += "touchCount : " + Input.touchCount + "
";
            //Unity会将当前存在的所有Touch对象放在Input.touches这个数组中
            //另一种方式获取指定Index的Touch对象:Input.GetTouch(index);
            Touch myTouch = Input.touches[0];
            //fingerId是用来识别当前手指的唯一标示
            info += "fingerId : " + myTouch.fingerId + "
";
            //deltaPosition当前位置与上次位置之间的差
            info += "deltaPosition : " + myTouch.deltaPosition + "
";
            //deltaTime本次记录Touch对象状态与上次记录Touch状态之间的时间差
            info += "deltaTime : " + myTouch.deltaTime + "
";
            //Touch对象的生命周期的结束并不是手指离开屏幕后立刻销毁
            //如果一根手指在同一位置快速点击,则视作同一Touch对象
            //tapCount为Touch对象所对应的手指点击屏幕的次数
            info += "tapCount : " + myTouch.tapCount + "
";
            //phase表示当前手指所对应的Touch对象的阶段(状态)
            info += "phase : " + myTouch.phase + "
";
            //rawPosition为当前Touch对象所对应的手指的初始(刚按下时)屏幕坐标
            info += "rawPosition : " + myTouch.rawPosition + "
";
            //position为当前Touch对象所对应的手指的屏幕坐标
            info += "position : " + myTouch.position + "
";
            switch (myTouch.phase)
            {
                //当一个手指刚按下时,其对应的Touch对象的Phase是Began
                case TouchPhase.Began:
                    touchOrigin = myTouch.position;
                    markGo = Instantiate(effectPrefab, Camera.main.ScreenToWorldPoint(myTouch.position) + new Vector3(0, 0, 10), Quaternion.identity);
                    break;
                //当一个手指在屏幕上移动时,其对应的Touch对象的Phase是Moved
                case TouchPhase.Moved:
                //当一个手指在屏幕上按住不动时,其对应的Touch对象的Phase是Stationary
                case TouchPhase.Stationary:
                    markGo.transform.position = Camera.main.ScreenToWorldPoint(myTouch.position) + new Vector3(0, 0, 10);
                    break;
                //当一个手指离开屏幕时,其对应的Touch对象的Phase是Ended
                case TouchPhase.Ended:
                //当因为某些原因(系统原因)取消对某个手指的追踪时,其对应的Touch对象的Phase是Canceled
                case TouchPhase.Canceled:
                    if (touchOrigin.x >= 0 && touchOrigin.y >= 0)
                    {
                        Vector2 touchEnd = myTouch.position;
                        float x = touchEnd.x - touchOrigin.x;
                        float y = touchEnd.y - touchOrigin.y;
                        if (Mathf.Abs(x) > Mathf.Abs(y))
                        {
                            if (x > 0.25f)
                            {
                                info += "dir : Right
";
                            }
                            else if (x < -0.25f)
                            {
                                info += "dir : Left
";
                            }
                            else
                            {
                                info += "dir : Unknow
";
                            }
                        }
                        else
                        {
                            if (y > 0.25f)
                            {
                                info += "dir : Up
";
                            }
                            else if (y < -0.25f)
                            {
                                info += "dir : Down
";
                            }
                            else
                            {
                                info += "dir : Unknow
";
                            }
                        }
                    }
                    Destroy(markGo);
                    break;
                default:
                    break;
            }
        }
        infoText.text = info;
	}
}

4 虚拟摇杆

Unity官方自带了虚拟摇杆,但是我们使用Easy Touch 5这个插件来控制虚拟摇杆和触摸

原文地址:https://www.cnblogs.com/lmx282110xxx/p/10798669.html