Scale UI for multiple resolutions/different devices

前端 未结 2 1006
猫巷女王i
猫巷女王i 2020-12-04 04:03

I have a quite simple unity GUI that has the following scheme :

Where Brekt and so are buttons.

The GUI works just fine on PC and is on scree

相关标签:
2条回答
  • 2020-12-04 04:33

    Automatically scaling the UI requires using combination of anchor,pivot point of RecTransform and the Canvas Scaler component. It is hard to understand it without images or videos. It is very important that you thoroughly understand how to do this and Unity provided full video tutorial for this.You can watch it here.

    Also, when using scrollbar, scrollview and other similar UI controls, the ContentSizeFitter component is also used to make sure they fit in that layout.

    0 讨论(0)
  • 2020-12-04 04:37

    There is a problem with MovementRange. We must scale this value too. I did it so:

    public int MovementRange = 100;
        public AxisOption axesToUse = AxisOption.Both; // The options for the axes that the still will use
        public string horizontalAxisName = "Horizontal"; // The name given to the horizontal axis for the cross platform input
        public string verticalAxisName = "Vertical"; // The name given to the vertical axis for the cross platform input
        private int _MovementRange = 100;
    
        Vector3 m_StartPos;
        bool m_UseX; // Toggle for using the x axis
        bool m_UseY; // Toggle for using the Y axis
        CrossPlatformInputManager.VirtualAxis m_HorizontalVirtualAxis; // Reference to the joystick in the cross platform input
        CrossPlatformInputManager.VirtualAxis m_VerticalVirtualAxis; // Reference to the joystick in the cross platform input
    
        void OnEnable()
        {
            CreateVirtualAxes();
        }
    
        void Start()
        {
            m_StartPos = transform.position;
            Canvas c = GetComponentInParent<Canvas>();
            _MovementRange = (int)(MovementRange * c.scaleFactor);
            Debug.Log("Range:"+ _MovementRange);
        }
    
        void UpdateVirtualAxes(Vector3 value)
        {
            var delta = m_StartPos - value;
            delta.y = -delta.y;
            delta /= _MovementRange;
            if (m_UseX)
            {
                m_HorizontalVirtualAxis.Update(-delta.x);
            }
    
            if (m_UseY)
            {
                m_VerticalVirtualAxis.Update(delta.y);
            }
        }
    
        void CreateVirtualAxes()
        {
            // set axes to use
            m_UseX = (axesToUse == AxisOption.Both || axesToUse == AxisOption.OnlyHorizontal);
            m_UseY = (axesToUse == AxisOption.Both || axesToUse == AxisOption.OnlyVertical);
    
            // create new axes based on axes to use
            if (m_UseX)
            {
                m_HorizontalVirtualAxis = new CrossPlatformInputManager.VirtualAxis(horizontalAxisName);
                CrossPlatformInputManager.RegisterVirtualAxis(m_HorizontalVirtualAxis);
            }
            if (m_UseY)
            {
                m_VerticalVirtualAxis = new CrossPlatformInputManager.VirtualAxis(verticalAxisName);
                CrossPlatformInputManager.RegisterVirtualAxis(m_VerticalVirtualAxis);
            }
        }
    
    
        public void OnDrag(PointerEventData data)
        {
            Vector3 newPos = Vector3.zero;
    
            if (m_UseX)
            {
                int delta = (int)(data.position.x - m_StartPos.x);
                delta = Mathf.Clamp(delta, -_MovementRange, _MovementRange);
                newPos.x = delta;
            }
    
            if (m_UseY)
            {
                int delta = (int)(data.position.y - m_StartPos.y);
                delta = Mathf.Clamp(delta, -_MovementRange, _MovementRange);
                newPos.y = delta;
            }
            transform.position = new Vector3(m_StartPos.x + newPos.x, m_StartPos.y + newPos.y, m_StartPos.z + newPos.z);
            UpdateVirtualAxes(transform.position);
        }
    
    0 讨论(0)
提交回复
热议问题