Fix scaling issues in the statue minigame sprites

This commit is contained in:
Michal Pikulski
2025-12-16 18:01:44 +01:00
parent ba1e506bc6
commit 0055efaee2
3 changed files with 51 additions and 1 deletions

View File

@@ -300,12 +300,15 @@ namespace Minigames.StatueDressup.Controllers
RectTransform rectTransform = decoration.GetComponent<RectTransform>();
SpriteRenderer spriteRenderer = decoration.GetComponent<SpriteRenderer>();
// Get actual displayed size (accounts for preserveAspect)
Vector2 actualSize = decoration.GetActualDisplayedSize();
DecorationPlacement placement = new DecorationPlacement
{
decorationId = decoration.Data.DecorationId,
localPosition = decoration.transform.localPosition,
localScale = decoration.transform.localScale,
sizeDelta = rectTransform != null ? rectTransform.sizeDelta : Vector2.zero,
sizeDelta = actualSize != Vector2.zero ? actualSize : (rectTransform != null ? rectTransform.sizeDelta : Vector2.zero),
rotation = decoration.transform.eulerAngles.z,
sortingOrder = spriteRenderer != null ? spriteRenderer.sortingOrder : 0
};

View File

@@ -43,6 +43,51 @@ namespace Minigames.StatueDressup.DragDrop
public DecorationData Data => _decorationData;
public bool IsPlacedOnStatue => _isPlacedOnStatue;
/// <summary>
/// Get the actual displayed size of the sprite after aspect ratio preservation
/// This accounts for preserveAspect = true on the Image component
/// </summary>
public Vector2 GetActualDisplayedSize()
{
if (decorationImage == null || decorationImage.sprite == null || _rectTransform == null)
{
return Vector2.zero;
}
// If not preserving aspect, the displayed size is the same as sizeDelta
if (!decorationImage.preserveAspect)
{
return _rectTransform.sizeDelta;
}
// Get sprite dimensions
Sprite sprite = decorationImage.sprite;
float spriteWidth = sprite.rect.width;
float spriteHeight = sprite.rect.height;
float spriteAspect = spriteWidth / spriteHeight;
// Get container dimensions
Vector2 containerSize = _rectTransform.sizeDelta;
float containerAspect = containerSize.x / containerSize.y;
// Calculate actual displayed size based on which dimension is limiting
Vector2 displayedSize;
if (spriteAspect > containerAspect)
{
// Sprite is wider - width is constrained by container width
displayedSize.x = containerSize.x;
displayedSize.y = containerSize.x / spriteAspect;
}
else
{
// Sprite is taller - height is constrained by container height
displayedSize.y = containerSize.y;
displayedSize.x = containerSize.y * spriteAspect;
}
return displayedSize;
}
private void Awake()
{
_rectTransform = GetComponent<RectTransform>();
@@ -102,6 +147,7 @@ namespace Minigames.StatueDressup.DragDrop
if (decorationImage != null && context.Data != null && context.Data.DecorationSprite != null)
{
decorationImage.sprite = context.Data.DecorationSprite;
decorationImage.preserveAspect = true; // Maintain sprite aspect ratio
}
// Set authored size

View File

@@ -36,6 +36,7 @@ namespace Minigames.StatueDressup.DragDrop
if (iconImage != null && data != null && data.DecorationSprite != null)
{
iconImage.sprite = data.DecorationSprite;
iconImage.preserveAspect = true; // Maintain sprite aspect ratio within grid cell
}
}