如何在Unity TileSystem中停止瓷砖动画?

3

我正在尝试理解Unity中的tileSystem构建,并且不知道如何停止AnimatedTiles中的动画。

一旦动画开始,我就想不出任何停止它的方法。我正在使用Unity 2018.3.2f1,但我认为TileSystem在下一个版本中是类似的。

仅在AnimatedTile中处理动画的代码为:

public override void GetTileData(Vector3Int location, ITilemap tileMap, ref TileData tileData)
        {
            tileData.transform = Matrix4x4.identity;
            tileData.color = Color.white;
            if (m_AnimatedSprites != null && m_AnimatedSprites.Length > 0)
            {
                tileData.sprite = m_AnimatedSprites[0];
                tileData.colliderType = m_TileColliderType;
            }
        }

        public override bool GetTileAnimationData(Vector3Int location, ITilemap tileMap, ref TileAnimationData tileAnimationData)
        {
            if (m_AnimatedSprites.Length > 0)
            {
                tileAnimationData.animatedSprites = m_AnimatedSprites;
                tileAnimationData.animationSpeed = Random.Range(m_MinSpeed, m_MaxSpeed);
                tileAnimationData.animationStartTime = m_AnimationStartTime;
                return true;
            }
            return false;
        }

我想在一定时间(比如3秒)或者最后一帧后停止动画。希望能得到帮助!


你最终解决了这个问题吗?我和另一个人也有同样的疑问:https://gamedev.stackexchange.com/questions/166930/stop-animated-tile-from-looping-unity2d-c?rq=1 - fulvio
1
我有一个临时的解决办法。你只需等待动画结束,然后用第一张图片将动态瓷砖替换为静态瓷砖。 - McCorner
1个回答

1

所以过了一段时间后,我找到了一个解决方法,它看起来是这样的:

public class TileBump : MonoBehaviour
{

    public Transform m_GridParent;
    public GameObject m_TileMap_Prefab;
    public AnimatedTile m_tilePrefabAnimated;
    public Tile m_tilePrefabStatic;

    private Tilemap map;

    void Start()
    {
        StartCoroutine(EStart());
    }

    public IEnumerator EStart()
    {
        GameObject t = Instantiate(m_TileMap_Prefab, m_GridParent);
        map = t.GetComponent<Tilemap>();
        for (int i = 0; i < 10; i++)
        {
            for (int j = 0; j < 10; j++)
            {
                map.SetTile(new Vector3Int(i, j, 0), m_tilePrefabAnimated);
                StartCoroutine(Operation(new Vector3Int(i, j, 0)));
                yield return new WaitForSeconds(0.3f);
            }
        }

    }

    public IEnumerator Operation(Vector3Int x)
    {
        yield return new WaitForSeconds(m_tilePrefabAnimated.m_AnimatedSprites.Length / m_tilePrefabAnimated.m_AnimationSpeed);
        map.SetTile(x, m_tilePrefabStatic);
    }
}

但是,我理解的是瓷砖不适用于这种情况。TileMap中的每个瓦片都指向ScriptableObject,因此每个动画在每一帧中都是相同的。
然而,如果有人需要这种效果,这是一种方法。

脚本附加在哪里? - fulvio
任何游戏对象都可以。只需记住,您需要在连接到m_GridParent变量的游戏对象上拥有网格组件,并在TileMapPrefab上拥有Tilemap + Tilemap Renderer。 - McCorner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接