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

  • 相关阅读:
    七牛大数据平台的演进与大数据分析实践--转
    Re:从0开始的微服务架构:(一)重识微服务架构--转
    Re:从 0 开始的微服务架构--(三)微服务架构 API 的开发与治理--转
    Java7里try-with-resources分析--转
    线上服务CPU100%问题快速定位实战--转
    Windows下本机简易监控系统搭建(Telegraf+Influxdb+Grafana)--转
    Scalable, Distributed Systems Using Akka, Spring Boot, DDD, and Java--转
    ES Segment Memory——本质上就是segment中加到内存的FST数据,因此segment越多,该内存越大
    Self Organizing Maps (SOM): 一种基于神经网络的聚类算法
    RBF网络——核心思想:把向量从低维m映射到高维P,低维线性不可分的情况到高维就线性可分了
  • 原文地址:https://www.cnblogs.com/lmx282110xxx/p/10798669.html
Copyright © 2020-2023  润新知