//--------------------------------------------------------- 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; } } } }
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); } }