본문 바로가기
게임프로젝트/쿠키런 모작

베스트 스코어 저장하기

by pudding81 2024. 4. 8.

 

 

 

유저 인포  

- 아이디와 스코어 

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

public class UserInfo 
{
    public int id;
    public int score;

    public UserInfo(int id, int score)
    {
        this.id = id;
        this.score = score;

    }
}

 

 

 

게임인포 

- 유저가 1명일때 /배열  List 사용하지 않음

- 아이디 1 / 점수 0으로 신규 유저인포 입력 

 

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


public class GameInfo
{
    //유저 인포가 1개
    public UserInfo userInfo;

    /// <summary>
    /// 신규유저일경우만 호출 
    /// </summary>
    public void Init()
    {
        userInfo = new UserInfo(1,0);
       

    }

}

 

 

- 유저아이디가 여럿일때 

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

public class GameInfo 
{
    public List<UserInfo> userInfos;

    /// <summary>
    /// 신규유저일경우만 호출 
    /// </summary>
    public void Init()
    {
        this.userInfos = new List<UserInfo>();
    }
}

 

 

 

 

 

 

 

인포매니져

- 싱글톤

- 유저인포 제이슨 파일로 저장하기

- 씬 전환시 데이터 기억하기 

using Newtonsoft.Json;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using Unity.VisualScripting;
using UnityEngine;

public class InfoManager : MonoBehaviour
{
    public static InfoManager Instance; //싱글톤

    private void Awake()
    {
        if (Instance == null)
        {
            Instance = this;
        }

        else
        {
            //게임매니저는 씬에 1개만
            Destroy(gameObject);

        }

        DontDestroyOnLoad(this.gameObject); //씬전환시 데이터 기억하기

    }

    public GameInfo GameInfo
    {
        get; set;
    }
    private InfoManager() { }

    public void SaveLocal()
    {
       // Debug.Log("<color=yellow>SaveLocal</color>");
        var json = JsonConvert.SerializeObject(this.GameInfo);
        string path = Path.Combine(Application.persistentDataPath, "game_info.json");
        Debug.Log(path);
        File.WriteAllText(path, json);
       // Debug.Log("save complete!");
    }
}

 

 

 

UI매니저

- 게임종료시 플레이어의 스코어를 유저인포에 있는 스코어와 비교하여

- 베스트스코어 메인화면에 저장하기 

 

using System.Collections;
using System.Collections.Generic;
using Unity.VisualScripting;
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.UI;

public class UIManager : MonoBehaviour
{
    public Text scoreText;
    public Text Coinscore;
    PlayerController player;
    public Slider slider;
    public UIGameover UIGameover;

   // private int currentScore;
    //private int id;

    void Start()
    {
        player = FindAnyObjectByType<PlayerController>();


    }


    void Update()
    {
       
        scoreText.text = string.Format("{0:n0}", player.score);
        Coinscore.text = string.Format("{0:n0}", player.Coinscore);

       

        if (slider.value <=0 || player.isgameover == true)
        {
            
            GameManager.instance.OnPlayerDead();

            Invoke("UIPopup", 3f);

            SaveBestScore();
           
        }





     }


    

     void UIPopup()
    {
        UIGameover.Open();


    }



    void SaveBestScore()
    {
        // 베스트 스코어를 인포에 저장한다.
        // 유저인포를 아이디로 찾아서 스코어에 반영한다.

        UserInfo info = InfoManager.Instance.GameInfo.userInfo;

        

        if (info.score < player.score)
        {
            //플레이어의 점수가 더 높으면 인포의 점수를 갱신한다.
            info.score= player.score;
            InfoManager.Instance.SaveLocal();
            Debug.Log("점수 갱신");

        }


       


    }





}

 

 

 

유저인포 불러오기 

 

UIHome

-  유저인포를 UI에 반영하기 

using Newtonsoft.Json;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using Unity.VisualScripting;
using UnityEngine;
using UnityEngine.SocialPlatforms.Impl;
using UnityEngine.UI;

public class UIHome : MonoBehaviour
{

    public Button btn;
    public UIMap uimap;
    public Text bestscore;


    public void Init()
    {
        // 유저인포를 아이디로 찾아서 스코어에 반영한다.

        UserInfo info = InfoManager.Instance.GameInfo.userInfo;

        
        bestscore.text = string.Format("{0:n0}", info.score);

    }

}

 

메인

 

using System.Collections.Generic;
using System.IO;
using UnityEngine;
using UnityEngine.UI;
using Newtonsoft.Json;
using Unity.VisualScripting;



public class Main : MonoBehaviour
{
    public UIHome uiHome;
    public UIMap uiMap;


       


    void Start()
    {
        Init();




        //UIHome에 있는 버튼을 누르면 
        this.uiHome.btn.onClick.AddListener(() => {
            //팝업을 보여준다 
            this.uiMap.Open();
        });

       


      

    }

    private void Init()
    {
        GameInfo gameInfo = null;

        string path = Path.Combine(Application.persistentDataPath, "game_info.json");

        if (File.Exists(path))
        {
            Debug.Log("<color=yellow>기존유저</color>");
            string json = File.ReadAllText(path);
            gameInfo = JsonConvert.DeserializeObject<GameInfo>(json);
            InfoManager.Instance.GameInfo = gameInfo;


        }
        else
        {
            Debug.Log("<color=yellow>신규유저</color>");
            gameInfo = new GameInfo();
            gameInfo.Init();
            InfoManager.Instance.GameInfo = gameInfo;
            InfoManager.Instance.SaveLocal();
            Debug.Log("<color=yellow> 신규 데이터 생성 </color>");


        }

        uiHome.Init();

    }






}

 

 

 

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

public class UIpopupbase : MonoBehaviour
{
    public virtual void Init()
    {

    }
    public virtual void Open()
    {
        this.gameObject.SetActive(true);

    }

    public virtual void Close()
    {
        this.gameObject.SetActive(false);
    }
}

 

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.UI;

public class UIMap : UIpopupbase //자식클래스
{
    public Button stage1;
    public Button stage2;
    public UIHome uiHome;

    void Start()
    {
        stage1.onClick.AddListener(() =>
        {
            SceneManager.LoadScene(2); //게임씬 

        });

        stage2.onClick.AddListener(() =>
        {
           // Debug.Log("스테이지 2로 이동");
            SceneManager.LoadScene(3); 

        });



    }

    
    void Update()
    {
        
    }
}