Beispiel #1
0
    async void Start()
    {
        Application.runInBackground = false;

        if (gridWorld == null)
        {
            return;
        }

        // Lobby 신에서 넘어왔다면 이 조건문이 만족할 것이다.
        if (StageButton.CurrentStageMetadata != null)
        {
            stageMetadata = StageButton.CurrentStageMetadata;

            if (Verbose)
            {
                ConDebug.Log($"Stage metadata specified by StageButton: {stageMetadata.name}");
            }
        }

        if (stageMetadata == null)
        {
            while (Data.dataSet == null || Data.dataSet.StageMetadataLocList == null)
            {
                await Task.Yield();
            }

            stageMetadata = await Addressables.LoadAssetAsync <StageMetadata>(Data.dataSet.StageMetadataLocList[0]).Task;
        }

        using (var stream = new MemoryStream(stageMetadata.RawStageData.bytes))
        {
            var formatter = new BinaryFormatter();
            stageData = (StageData)formatter.Deserialize(stream);
            stream.Close();
        }

        stageData.islandCountByColor = stageData.islandDataByMinPoint.GroupBy(g => g.Value.rgba)
                                       .ToDictionary(g => g.Key, g => g.Count());

        if (Verbose)
        {
            ConDebug.Log($"{stageData.islandDataByMinPoint.Count} islands loaded.");
        }

        var maxIslandPixelArea = stageData.islandDataByMinPoint.Max(e => e.Value.pixelArea);

        if (Verbose)
        {
            foreach (var mp in stageData.islandDataByMinPoint)
            {
                ConDebug.Log($"Island: Key={mp.Key} PixelArea={mp.Value.pixelArea}");
            }

            ConDebug.Log($"Max island pixel area: {maxIslandPixelArea}");
        }

        //var skipBlackMaterial = Instantiate(stageMetadata.SkipBlackMaterial);
        //var colorTexture = Instantiate((Texture2D) skipBlackMaterial.GetTexture(ColorTexture));
        //skipBlackMaterial.SetTexture(ColorTexture, colorTexture);

        gridWorld.LoadTexture(stageMetadata.A1Tex, stageData);

        gridWorld.StageName       = stageMetadata.name;
        nameplateGroup.ArtistText = stageMetadata.StageSequenceData.artist;
        nameplateGroup.TitleText  = stageMetadata.StageSequenceData.title;
        nameplateGroup.DescText   = stageMetadata.StageSequenceData.desc;

        //targetImage.SetTargetImageMaterial(skipBlackMaterial);

        // 플레이어가 색칠한 칸을 하나씩 렌더링하는 컴포넌트
        // 화면에 보여지는 것은 색칠된 칸이 모두 누적된 형태다.
        // 이를 위해 Render Texture 이용
        islandShader3DController.Initialize(stageMetadata);

        // 플레이어가 선택한 팔레트에 해당하는 모든 칸을 특정 색깔로 그리는 컴포넌트
        // 게임을 더 편-안-하게 플레이할 수 있도록 해 준다.
        // 그러나 4 스테이지부터 켜준다.
        singlePaletteRenderer.gameObject.SetActive(stageMetadata.StageIndex >= 3);
        singlePaletteRenderer.Initialize(stageMetadata);

        targetImageOutline.material = stageMetadata.SdfMaterial;
        // SDF 머티리얼 없으면 아예 이 이미지는 안보이게 하자.
        targetImageOutline.enabled = stageMetadata.SdfMaterial != null;

        paletteButtonGroup.CreatePalette(stageData);

        islandLabelSpawner.CreateAllLabels(stageData);

        remainTime = stageMetadata.StageSequenceData.remainTime;

        if (stageMetadata.StageSequenceData.remainTime > 0)
        {
            ActivateTime();
        }
        else
        {
            DeactivateTime();
        }

        if (Verbose)
        {
            ConDebug.Log($"Tex size: {gridWorld.TexSize}");
            ConDebug.Log($"CanInteractPanAndZoom = {CanInteractPanAndZoom}");
        }

        gridWorld.ResumeGame();
    }