Felix Boucher 9e07c48fd4 ajout de transition avant de loader le level
besoin :

- le level était loadé directement au moment de cliquer dans le level selector ce qui n'est pas très fenshui

solution :

- fade out avec nuages
- les tuiles tombent à leur place au lieu d'apparaitre toutes en même temps
2023-10-01 21:48:35 -04:00

79 lines
2.2 KiB
C#

using UnityEngine;
using GatherAndDefend.LevelEditor;
using System.Collections;
using UnityEngine.Tilemaps;
using System.Threading.Tasks;
using System;
public delegate Task PlacementAnimationHandler(Vector3 position, TileBase tile, Action tilePlacement);
public class LevelManagerScript : SingletonBehaviour<LevelManagerScript>
{
private Action updateAction = null;
public bool loadOnStart = false;
public Level firstLevel;
async void Start()
{
LevelManager.Instance.LevelLoaded += Instance_LevelLoaded;
if (loadOnStart && firstLevel)
{
await LevelManager.Instance.LoadLevel(firstLevel, placementAnimation: PlacementAnimation);
}
}
void OnDestroy()
{
updateAction = null;
}
void Update()
{
updateAction?.Invoke();
}
private void Instance_LevelLoaded(Level level)
{
updateAction = LevelManager.Instance.UpdateLevel;
}
public static async Task PlacementAnimation(Vector3 position, TileBase tile, System.Action putTileOnTilemap)
{
float speed = 0;
float acceleration = -9.81f;
var tilePlaceholder = new GameObject("tile");
var rend = tilePlaceholder.AddComponent<SpriteRenderer>();
rend.sortingOrder = 10;
rend.sortingLayerName = "Unit";
if (tile is LevelTile)
{
rend.sprite = (tile as LevelTile).Sprite;
}
else
{
rend.sprite = (tile as Tile).sprite;
}
tilePlaceholder.transform.position = position + Vector3.up * Camera.main.orthographicSize * 2;
var delta = tilePlaceholder.transform.position - position;
var direction = delta.normalized;
var signY = delta.y / Mathf.Abs(delta.y);
while (true)
{
if (!tilePlaceholder) break;
speed += acceleration * Time.deltaTime;
tilePlaceholder.transform.position += direction * Time.deltaTime * speed;
var newDelta = tilePlaceholder.transform.position - position;
var newSign = newDelta.y / Mathf.Abs(newDelta.y);
if (newSign != signY) break;
await Task.Yield();
}
putTileOnTilemap.Invoke();
Destroy(tilePlaceholder);
}
}