• 屏幕坐标点转UGUI坐标【包含屏幕适配】


    using UnityEngine;
    
    public class ScreenToUI : MonoBehaviour
    {
        public const float UI_Width = 1366f;
        public const float UI_Height = 768f;
    
        public readonly static float Screen_Width_Half = Screen.width / 2f;
        public readonly static float Screen_Height_Half = Screen.height / 2f;
    
        public readonly static float Screen_UI_Ratio = UI_Width / UI_Height;
        public readonly static float Screen_Screen_Ratio = Screen.width / Screen.height;
    
        public readonly static float Screen_Width_Ratio = UI_Width / Screen.width;
        public readonly static float Screen_Height_Ratio = UI_Height / Screen.height;
    
        private Vector3 m_position_offset;
    
        private void Awake()
        {
            m_position_offset = Vector3.zero;
    
            //计算目标偏移量,遍历到以中心为锚点的父物体为止
            Transform target = transform;
    
            int index = 0, count = 0;
    
            while (target != null)
            {
                if (index++ < count)
                {
                    m_position_offset += target.localPosition;
    
                    target = target.parent;
                }
                else
                {
                    break;
                }
            }
        }
    
        private void Update()
        {
            if (Input.GetMouseButton(0))
            {
                Vector3 position = FormatPosition(Input.mousePosition);
    
                //do something...
    
                Debug.LogError(position);
            }
        }
    
        private Vector3 FormatPosition(Vector3 position)
        {
            float ratio_width = 1, ratio_height = 1;
    
            if (Screen_UI_Ratio != Screen_Screen_Ratio)
            {
                if (Screen_UI_Ratio < Screen_Screen_Ratio)
                {
                    float real = Screen.height * Screen_UI_Ratio;
                    ratio_width = Screen.width / real;
                }
                else
                {
                    float real = Screen.width / Screen_UI_Ratio;
                    ratio_height = Screen.height / real;
                }
            }
    
            position.x -= Screen_Width_Half;
            position.y -= Screen_Height_Half;
    
            position.x *= Screen_Width_Ratio * ratio_width;
            position.y *= Screen_Height_Ratio * ratio_height;
    
            position -= m_position_offset;
    
            return position;
        }
    }
    View Code

    屏幕坐标以左下角为坐标

    UGUI以中心为坐标

    首先将坐标位置转换

    然后通过屏幕宽高比与UGUI设置的宽高比进行计算,UGUI.UIScaleMode = Scale With Screen Size

    最后计算父物体与中心点的偏移量

  • 相关阅读:
    Android对包名和类名是否存在的判断
    Android权限表
    论艺术的背后还有纪律
    jeecgboot/IDEA中 debug不行,run可以
    java集合类
    HashMap、HashTable、LinkedHashMap和TreeMap用法和区别
    protobuf序列化算法原理
    谁能帮我看看着究竟是什么问题呀,我在本机运行都是好好的,但在别人的机子上运行就出这个呢?我快疯了!!!
    VS删除空白行
    POJ 2516 Minimum Cost
  • 原文地址:https://www.cnblogs.com/Joke-crazy/p/11696548.html
Copyright © 2020-2023  润新知