Как остановить анимацию плитки в Unity TileSystem? - PullRequest
3 голосов
/ 05 апреля 2019

Я пытаюсь понять сборку tileSystem в Unity, и я не знаю, как остановить анимацию в 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 секунды) или после последнего кадра. Любая помощь будет оценена!

1 Ответ

1 голос
/ 25 июля 2019

Итак, через некоторое время есть обходной путь, и он выглядит так:

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, поэтому каждая анимация будет одинаковой в каждом кадре.

Однако, если кому-то нужен такой вид эффекта, это один из способов сделать это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...