You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity 2D中如何实现Tilemap特定瓦片的缩放?

解决Unity 2D Tilemap单个瓦片缩放问题

Unity里的Tile是共享资源,直接修改它的transform或者操作Sprite的缩放都不可行——前者会影响所有使用该Tile的瓦片,后者本身就不生效(Sprite没有localScale属性,那是GameObject的专属属性)。

正确的做法是利用Tilemap.SetTransformMatrix方法,单独为目标单元格设置变换矩阵,这样只会改变该位置的瓦片显示效果,不会影响其他实例。

修改后的代码示例

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Tilemaps;

public class SnowTaking : MonoBehaviour
{
    public Tilemap tilemap;
    public Tile whiteTile;
    public Tile redTile;
    public Tile greenTile;
    public Tile blueTile;

    // 记录目标瓦片的原始变换矩阵,用于恢复
    private Matrix4x4? originalTileMatrix;
    private Vector3Int targetTilePos;

    void OnTriggerStay2D(Collider2D other)
    {
        if (other.gameObject.tag == "Snow")
        {
            Vector3Int tilePosition = tilemap.WorldToCell(transform.position);
            Tile currentTile = tilemap.GetTile<Tile>(tilePosition);

            if (Input.GetKey(KeyCode.LeftShift))
            {
                // 仅当目标瓦片是我们需要的类型时执行缩放
                if (currentTile == whiteTile || currentTile == redTile || currentTile == greenTile || currentTile == blueTile)
                {
                    // 第一次按下时记录原始矩阵
                    if (!originalTileMatrix.HasValue)
                    {
                        originalTileMatrix = tilemap.GetTransformMatrix(tilePosition);
                        targetTilePos = tilePosition;
                    }

                    // 设置缩放矩阵(这里缩放到0.5倍,可调整)
                    Matrix4x4 scaleMatrix = Matrix4x4.Scale(new Vector3(0.5f, 0.5f, 1f));
                    // 结合原始矩阵的位移,避免偏移
                    tilemap.SetTransformMatrix(tilePosition, originalTileMatrix.Value * scaleMatrix);
                }
            }
            else
            {
                // 松开Shift时恢复原始矩阵
                if (originalTileMatrix.HasValue)
                {
                    tilemap.SetTransformMatrix(targetTilePos, originalTileMatrix.Value);
                    originalTileMatrix = null;
                }
            }
        }
    }

    // 离开触发器时也要恢复原始矩阵,避免残留
    void OnTriggerExit2D(Collider2D other)
    {
        if (other.gameObject.tag == "Snow" && originalTileMatrix.HasValue)
        {
            tilemap.SetTransformMatrix(targetTilePos, originalTileMatrix.Value);
            originalTileMatrix = null;
        }
    }
}

关键说明

  • SetTransformMatrix是针对单个单元格的,所以只会修改该位置的瓦片显示,不会影响其他使用同一Tile的单元格。
  • 必须记录原始矩阵,否则无法恢复到初始状态。
  • 如果需要动态渐进式缩放(比如按住Shift时逐渐缩小),可以把缩放逻辑放到Update里,在OnTriggerStay里标记需要缩放的瓦片位置,然后在Update中根据按键状态逐步调整缩放比例。

额外注意

确保Tilemap的Tile Anchor设置合理(比如中心锚点),否则缩放时瓦片可能会出现偏移。可以在Tilemap组件的Inspector里调整Tile Anchor参数。

内容的提问来源于stack exchange,提问作者SlimeChannel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 21:40:41