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