Android開發 移動端適配

1 UI自適應(UGUI)

UI自適應又分爲錨點自適應和縮放。錨點主要控制UI控件在父控件之中的位置,同時也能影響縮放。數組

錨點自適應縮放:ide

咱們使用UGUI建立一個界面,設計使用1920x1080分辨率插件

在咱們設計好,而後改變設計大小時,會發生意想不到的狀況設計

這個時候咱們可使用錨點的自適應,在這裏選擇好縮放方法和設計尺寸3d

而後無論咱們怎麼縮放,都可以很好的適配code

 

2 視口自適應(攝像機)

首先建立一個場景orm

而後咱們改變視口大小,發現Unity的自適應作的很好,只不過它是優先保證高度看全,自動裁剪寬度上的東西對象

有的時候咱們須要寬度看全,高度不須要。這個時候咱們能夠在攝像機上掛一個腳原本控制。blog

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\n";
        }
        //全部Touch類在PC端均不生效
        //每當一個手指觸摸屏幕時,Unity都會爲其生成一個Touch對象
        //Input.touchCount能夠獲取當前Touch對象的個數
        if (Input.touchCount > 0)
        {
            info = string.Empty;
            //如下三行在移動端也生效,帶來方便的同時也會帶來隱患
            info += "GetMouseButton(0) : " + Input.GetMouseButton(0) + "\n";
            info += "GetAxis(\"Mouse X\") : " + Input.GetAxis("Mouse X") + "\n";
            info += "GetAxis(\"Mouse Y\") : " + Input.GetAxis("Mouse Y") + "\n";
            info += "touchCount : " + Input.touchCount + "\n";
            //Unity會將當前存在的全部Touch對象放在Input.touches這個數組中
            //另外一種方式獲取指定Index的Touch對象:Input.GetTouch(index);
            Touch myTouch = Input.touches[0];
            //fingerId是用來識別當前手指的惟一標示
            info += "fingerId : " + myTouch.fingerId + "\n";
            //deltaPosition當前位置與上次位置之間的差
            info += "deltaPosition : " + myTouch.deltaPosition + "\n";
            //deltaTime本次記錄Touch對象狀態與上次記錄Touch狀態之間的時間差
            info += "deltaTime : " + myTouch.deltaTime + "\n";
            //Touch對象的生命週期的結束並非手指離開屏幕後馬上銷燬
            //若是一根手指在同一位置快速點擊,則視做同一Touch對象
            //tapCount爲Touch對象所對應的手指點擊屏幕的次數
            info += "tapCount : " + myTouch.tapCount + "\n";
            //phase表示當前手指所對應的Touch對象的階段(狀態)
            info += "phase : " + myTouch.phase + "\n";
            //rawPosition爲當前Touch對象所對應的手指的初始(剛按下時)屏幕座標
            info += "rawPosition : " + myTouch.rawPosition + "\n";
            //position爲當前Touch對象所對應的手指的屏幕座標
            info += "position : " + myTouch.position + "\n";
            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\n";
                            }
                            else if (x < -0.25f)
                            {
                                info += "dir : Left\n";
                            }
                            else
                            {
                                info += "dir : Unknow\n";
                            }
                        }
                        else
                        {
                            if (y > 0.25f)
                            {
                                info += "dir : Up\n";
                            }
                            else if (y < -0.25f)
                            {
                                info += "dir : Down\n";
                            }
                            else
                            {
                                info += "dir : Unknow\n";
                            }
                        }
                    }
                    Destroy(markGo);
                    break;
                default:
                    break;
            }
        }
        infoText.text = info;
	}
}

4 虛擬搖桿

Unity官方自帶了虛擬搖桿,可是咱們使用Easy Touch 5這個插件來控制虛擬搖桿和觸摸

相關文章
相關標籤/搜索