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这个插件来控制虚拟摇杆和触摸