UI自適應又分爲錨點自適應和縮放。錨點主要控制UI控件在父控件之中的位置,同時也能影響縮放。數組
錨點自適應縮放:ide
咱們使用UGUI建立一個界面,設計使用1920x1080分辨率插件
在咱們設計好,而後改變設計大小時,會發生意想不到的狀況設計
這個時候咱們可使用錨點的自適應,在這裏選擇好縮放方法和設計尺寸3d
而後無論咱們怎麼縮放,都可以很好的適配code
首先建立一個場景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); } }
下面的代碼包含了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; } }
Unity官方自帶了虛擬搖桿,可是咱們使用Easy Touch 5這個插件來控制虛擬搖桿和觸摸