summaryrefslogtreecommitdiff
path: root/WorldlineKeepers/Assets/Scripts/Stage/StageBuilder.cs
blob: e55751856378dd314f82546024fc680487a97bb6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
using JetBrains.Annotations;
using MovementEffects;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using WK;
using WK.Data;

/// <summary>
/// 构建关卡
/// </summary>
public class StageBuilder : Singleton<StageBuilder>
{

    /// <summary>
    /// 异步构建关卡
    /// </summary>
    /// <param name="metadata"></param>
    /// <param name="root"></param>
    /// <returns></returns>
    public CoroutineHandle AsyncBuildStage(StageMetadata metadata, Transform root = null)
    {
        return Timing.Instance.RunCoroutineOnInstance(CoBuildStage(metadata, root));
    }

    private void Build<TYPE_ENTITY, TYPE_META>(List<TYPE_META> metadatas, Transform root = null) where TYPE_ENTITY : StageEntityBase where TYPE_META : StageEntityMetadata
    {
        for(int i = 0; i < metadatas.Count; ++i)
        {
            TYPE_META meta = metadatas[i];
            GameObject go = new GameObject();
            if(root != null)
                go.transform.SetParent(root);
            var entity = go.AddComponent<TYPE_ENTITY>();
            entity.OnDeserialize(meta);
        }
    }

    private IEnumerator<float> CoBuildStage(StageMetadata metadata, Transform root = null)
    {
        Build<StageEntity_Background, StageEntityMetadata_Background>(metadata.backgrounds, root);
        yield return Timing.WaitForSeconds(StaticDefine.IntervalBuildStage);
        Build<StageEntity_Collider, StageEntityMetadata_Collider>(metadata.colliders, root);
        yield return Timing.WaitForSeconds(StaticDefine.IntervalBuildStage);
        Build<StageEntity_Trigger, StageEntityMetadata_Trigger>(metadata.triggers, root);
        yield return Timing.WaitForSeconds(StaticDefine.IntervalBuildStage);
    }

}