コード例 #1
0
    //---------------------------------------------------------
    protected override void OnGUIUpdate(float parentAlpha)
    {
        if (IsDirty == false)
        {
            return;
        }

        if (m_UpdateDelegate != null)
        {
            m_UpdateDelegate();
        }

        if (m_Sprites != null)
        {
            Vector4    currColor = m_Color;
            Transform  tr        = gameObject.transform;
            Vector3    pos       = tr.position;
            Vector3    scale     = tr.lossyScale;
            Quaternion rot       = tr.rotation;       //faster way of detecting the rotation change (no need to decompose to euler angles)

            currColor.w *= FadeAlpha * parentAlpha;

            bool transformChanged = false;
            bool rotChanged       = false;

#if     GUI_ENABLE_ANIMATIONS
            transformChanged = pos != m_Pos || scale != m_Scale;

            if (!transformChanged)
            {
                rotChanged = rot != m_Quat;
            }
#endif

#if GUI_ENABLE_ANIMATIONS
            m_Pos   = pos;
            m_Scale = scale;
            m_Quat  = rot;
#endif
            Vector2 deltaPos;
            Vector2 dPos;
            Vector2 rotDelta;

            if (rotChanged)
            {
                m_RotZ = m_Quat.eulerAngles.z;                 //decompose only when really necessary
            }

            float rot_z = m_RotZ;
            float angle = -rot_z * Mathf.Deg2Rad;

            deltaPos.x = pos.x - m_OrigPos.x;
            deltaPos.y = pos.y - m_OrigPos.y;

            for (int i = 0; i < m_Sprites.Length; ++i)
            {
                S_Sprite s = m_Sprites[i];

                if (s.m_IsVisible)
                {
                    float width  = s.m_Width;                    // * scale.x;
                    float height = s.m_Height;                   // * scale.y;

                    if (m_TextScaleFix_HACK == false)
                    {
                        dPos.x = s.m_Pos.x - m_OrigPos.x;
                        dPos.y = s.m_Pos.y - m_OrigPos.y;
                    }
                    else
                    {
                        dPos.x = (s.m_Pos.x - m_OrigPos.x) * scale.x;
                        dPos.y = (s.m_Pos.y - m_OrigPos.y) * scale.y;
                    }

                    float cos = Mathf.Cos(angle);
                    float sin = Mathf.Sin(angle);

                    rotDelta.x = dPos.x * cos + dPos.y * sin;
                    rotDelta.y = -dPos.x * sin + dPos.y * cos;

                    float rx = m_OrigPos.x + deltaPos.x + rotDelta.x;
                    float ry = m_OrigPos.y + deltaPos.y + rotDelta.y;

                    UpdateSprite(s.m_Sprite, new Rect(rx, ry, width, height), rot_z, scale, -(float)m_Layout.m_LayoutLayer, m_Grid9);

                    s.m_Sprite.color = currColor;
                }
            }
        }
    }
コード例 #2
0
    public void PrepareSprites(int count)
    {
        if (m_GuiRenderer == null)
        {
            return;
        }
        if (m_Sprites != null && m_Sprites.Length == count)
        {
            return;
        }

        // prepare temp list
        S_Sprite[] sprites = new S_Sprite[count];

        int spriteIdx = 0;

        // remove all unwanted sprites
        if (m_Sprites != null)
        {
            for (int idx = 0; idx < m_Sprites.Length; ++idx)
            {
                if (m_Sprites[idx].m_Sprite == null)
                {
                    continue;
                }

                if (spriteIdx < count)
                {
                    sprites[spriteIdx++] = m_Sprites[idx];
                }
                else
                {
                    m_GuiRenderer.RemoveSprite(m_Sprites[idx].m_Sprite);
                }
            }
        }

        // add new sprites if needed
        while (spriteIdx < count)
        {
            MFGuiSprite sprite = AddSprite(
                new Rect(0, 0, 0, 0),
                0,
                ComputedWidgetLayer * -(1.0f / GUIBase_Layout.MAX_LAYERS),
                0,
                0,
                0,
                0,
                null);

            sprites[spriteIdx++].m_Sprite = sprite;
        }

        // store new list
        m_Sprites = sprites;

        // update visibility
        for (int idx = 0; idx < m_Sprites.Length; ++idx)
        {
            ShowSprite(idx, Visible);
        }
    }