유니티3D 프로그래밍

Unity 6주차 5일 수업 내용 : 다단계 Scene 구성 (21.04.06) 본문

Unity/수업내용

Unity 6주차 5일 수업 내용 : 다단계 Scene 구성 (21.04.06)

tjdgus9955 2021. 4. 16. 18:19
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;

public class App : MonoBehaviour
{

    public enum eSceneType
    {
        App, Logo, Title, InGame
    }

    private eSceneType sceneType;

    void Start()
    {
        DontDestroyOnLoad(this.gameObject);

        //씬전환 App -> Logo     
        //SceneManager.LoadScene("Logo"); //동기 로드 
        this.ChangeScene(eSceneType.Logo);
    }

    public void ChangeScene(eSceneType sceneType)
    {
        switch (sceneType)
        {
            case eSceneType.Logo:
                {
                    AsyncOperation ao = SceneManager.LoadSceneAsync("Logo");
                    ao.completed += (obj) => {
                        Debug.Log("complete");
                        //씬이 로드완료됨 
                        var logo = GameObject.FindObjectOfType<Logo>();
                        logo.onComplete = () => {
                            Debug.Log("title");
                            this.ChangeScene(eSceneType.Title);
                        };
                        logo.Init();
                    };
                }
                break;

            case eSceneType.Title:
                {
                    AsyncOperation ao = SceneManager.LoadSceneAsync("Title");
                    ao.completed += (obj) => {
                        Debug.Log("complete");
                        //씬이 로드완료됨 
                        var title = GameObject.FindObjectOfType<Title>();
                        title.onTouch = () => {

                            //데이터 로드 
                            DataManager.GetInstance().LoadDatas();

                            this.ChangeScene(eSceneType.InGame);
                        };
                    };
                }
                break;


            case eSceneType.InGame:
                {
                    //InGameScene 로드 
                    var ao = SceneManager.LoadSceneAsync("InGame");
                    ao.completed += (oper) => {
                        InGame inGame = GameObject.FindObjectOfType<InGame>();
                        inGame.Init(100);
                    };
                }
                break;
        }
    }
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CharacterData
{
    public int id;
    public string name;
    public float damage;
    public string res_name;
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CharacterInfo
{
    public int Id { get; private set; }
    //생성자 
    public CharacterInfo(int id)
    {
        this.Id = id;
    }
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Newtonsoft.Json;
using System.Linq;

public class DataManager
{
    private static DataManager instance;
    public Dictionary<int, CharacterData> dicCharacterDatas;
    //생성자 
    private DataManager() { }

    public static DataManager GetInstance()
    {
        if (DataManager.instance == null)
            DataManager.instance = new DataManager();
        return DataManager.instance;
    }

    public void LoadDatas()
    {
        var ta = Resources.Load<TextAsset>("Data/chracter_data");
        var json = ta.text;
        //역직렬화 
        var arr = JsonConvert.DeserializeObject<CharacterData[]>(json);
        this.dicCharacterDatas = arr.ToDictionary(x => x.id);
        Debug.Log(this.dicCharacterDatas.Count);
    }


}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Hero : MonoBehaviour
{
    //데이터 
    private CharacterInfo info;
    //모델 
    private GameObject model;
    private Animation anim;
    //초기화 
    public void Init(CharacterInfo info, GameObject model)
    {
        this.info = info;
        this.model = model;
        this.anim = this.model.GetComponent<Animation>();
    }
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class InGame : MonoBehaviour
{
    public void Init(int characterId)
    {
        var shell = new GameObject();
        shell.name = "Hero";
        var model = CreateModel(characterId);
        model.name = "Model";
        model.transform.SetParent(shell.transform);
        var hero = shell.AddComponent<Hero>();
        var info = new CharacterInfo(characterId);
        hero.Init(info, model);
    }

    public GameObject CreateModel(int id)
    {
        var data = DataManager.GetInstance().dicCharacterDatas[id];
        var path = string.Format("Prefabs/{0}", data.res_name);
        var prefab = Resources.Load<GameObject>(path);
        var go = Instantiate<GameObject>(prefab);
        return go;
    }
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;

public class Logo : MonoBehaviour
{
    public UnityAction onComplete;

    public void Init()
    {
        StartCoroutine(this.WaitForDisplayLogo());
    }

    private IEnumerator WaitForDisplayLogo()
    {
        Debug.Log("1");
        yield return new WaitForSeconds(3f);
        Debug.Log("2");
        this.onComplete();
    }
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Title : MonoBehaviour
{
    public System.Action onTouch;
    void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            this.onTouch();
        }
    }
}

각 Scene 마다 빈 오브젝트에 해당 씬의 스크립트를 넣는다.