Fix scaling issues in the statue minigame sprites
This commit is contained in:
@@ -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
|
||||
};
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user