본문 바로가기

유니티/2D러닝액션(모바일)

현재점수 최고점수

반응형

쿠키런같은 게임에서 매우 필수적인 현재점수 최고점수를 구현해보겠다.

참고로 기본적인 점프, 수그리기 같은 버튼들은 구현이 되어 있다.

 

 

우측 상단의 현재 점수 최고점수는 단순히 캔버스에 Text만 추가해주면 된다. 그 후 각각 최고점수 Text에는 SaveScore.cs

를 넣어주고 현재점수 Text에는 LoadText.cs를 넣어준다. 좌측 상단은 임시적으로 만든 저장 버튼이다.

 

 

 

우선적으로 시간이 지나면서 점수가 오르는 시스템이 필요하다.

 단순히 score라는 int형에 코루틴을 이용해서 반복문으로 계속 score가 올라가게 구현해주었다.

 

SaveScore.cs의 일부

public int score=0;
private void Start() 
{
        StartCoroutine("plus");
 }
 IEnumerator plus()
 {
     while(true)
     {
          yield return new WaitForSecondsRealtime(0.1f);
          score++;
      }
  }

 

시간이 지날수록 score는 늘어난다. 

 

LoadScore.cs 전체

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using System.IO;
using System;
using System.Text;
public class LoadScore : MonoBehaviour
{
    Text contents;
    public GameObject nowScore;
    private SaveScore script; 
    private void Start() 
    {
        contents=this.gameObject.GetComponent<Text>();
        script=nowScore.GetComponent<SaveScore>();
    }
    int now=0;
    private void Update()
    {
        now=script.score;
        contents.text="현재점수: "+now;
    }
}

LoadScore는 앞서 말햇듯이 현재 점수: Text에 넣어주고 nowScore 게임오브젝트는 SaveScore.cs를 넣어준 최고점수 Text를 참조한다. script는 SaveScore 스크립트를 참조한다. Update문에서 now는 계속해서 값이 커지는 SaveScore의 score를 의미한다. 

 

현재점수가 올라가는 것을 확인할 수 있다.

 

이제 SaveScore.cs 전체를 첨부하겠다. 참고로 저 좌측상단의 Button을 누르면 SaveScore.cs의 Save 함수가 실행되게 설정했다.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.IO;
using System;
using System.Text;
using System.Security.Cryptography;
using UnityEngine.UI;
[System.Serializable]
class Score
{
    public int value;
}

public class SaveScore : MonoBehaviour
{
    Text contents;
    public int score=0;
    private int bestScore;//현재 최고점수
    private void Start() 
    {
        StartCoroutine("plus");
        contents=this.gameObject.GetComponent<Text>();
        bestScore=LoadJsonData_FromAsset();//Json에서 최고점수를 받아온다.
        contents.text="최고점수: "+bestScore;
    }
    public void Save()//저장하는 함수
    {
        if(score<bestScore)//현재 점수가 최고점수보다 작다면 저장하지 않는다.
        {
            return ;
        }
        Score data=new Score();
        data.value=score;
        string temp=JsonUtility.ToJson(data);//data를 json으로 바꿔줌
        temp=Encrypt(temp,"321");//암호는 321
        if(temp!=null)
        {
            File.WriteAllText(Application.dataPath+"/Json"+"/Score.json",temp);//제이슨 저장
        }
        Debug.Log("저장됨");
    }
    private static int LoadJsonData_FromAsset()//경로 기반 json불러오기
    {
        string pAsset=File.ReadAllText(Application.dataPath+"/Json"+"/Score.json");
        if(pAsset==null)//경로에 파일이없을시, 즉 처음시작한거면 0점으로 설정
        {
            Debug.LogError("파일 없음");
            return 0;
        }
        return Load_Integer(pAsset);//pAsset에서 정수를 불러온다.
    }
    private static int Load_Integer(string sJsonData)
    {
        sJsonData=Decrypt(sJsonData,"321");//복호화
        Score pData = JsonUtility.FromJson<Score>(sJsonData);
        return pData.value;
    }
    IEnumerator plus()
    {
        while(true)
        {
            yield return new WaitForSecondsRealtime(0.1f);
            score++;
        }
    }
    public static string Encrypt(string textToEncrypt, string key)//암호화 함수
    {
        RijndaelManaged rijndaelCipher = new RijndaelManaged();
        rijndaelCipher.Mode = CipherMode.CBC;
        rijndaelCipher.Padding = PaddingMode.PKCS7;
        rijndaelCipher.KeySize = 128;
        rijndaelCipher.BlockSize = 128;
        byte[] pwdBytes = Encoding.UTF8.GetBytes(key);
        byte[] keyBytes = new byte[16];
        int len = pwdBytes.Length;
        if (len > keyBytes.Length)
        {
            len = keyBytes.Length;
        }
        Array.Copy(pwdBytes, keyBytes, len);
        rijndaelCipher.Key = keyBytes;
        rijndaelCipher.IV = keyBytes;
        ICryptoTransform transform = rijndaelCipher.CreateEncryptor();
        byte[] plainText = Encoding.UTF8.GetBytes(textToEncrypt);
        return Convert.ToBase64String(transform.TransformFinalBlock(plainText, 0, plainText.Length));
    }
    public static string Decrypt(string textToDecrypt, string key)//복호화 함수
    {
        RijndaelManaged rijndaelCipher = new RijndaelManaged();
        rijndaelCipher.Mode = CipherMode.CBC;
        rijndaelCipher.Padding = PaddingMode.PKCS7;
        rijndaelCipher.KeySize = 128;
        rijndaelCipher.BlockSize = 128;
        byte[] encryptedData = Convert.FromBase64String(textToDecrypt);
        byte[] pwdBytes = Encoding.UTF8.GetBytes(key);
        byte[] keyBytes = new byte[16];
        int len = pwdBytes.Length;
        if (len > keyBytes.Length)
        {
              len = keyBytes.Length;
        }
        Array.Copy(pwdBytes, keyBytes, len);
        rijndaelCipher.Key = keyBytes;
        rijndaelCipher.IV = keyBytes;
        byte[] plainText = rijndaelCipher.CreateDecryptor().TransformFinalBlock(encryptedData, 0, encryptedData.Length);
        return Encoding.UTF8.GetString(plainText);
    }
}

암호화 함수와 복호화 함수는 나도 구글링해서 얻은것이어서  따로 설명할 것은 없다. 꼭 using System.Security.Cryptography;을 써주자

현재 설정된 경로상에 Json파일이 존재하지않으면 최고점수는 0으로 설정하고 존재한다면 그 값을 반환해서 최고점수로 설정한다. 만약 Save함수가 실행되었는데 최고점수보다 낮다면 저장하지 않는다. 더 크다면 Save가 실행되며 지정된 경로에 Json을 저장한다. Json 다루는법에 대해서도 따로 말은 설명은 안하겠다. 따로 더 자세히 설명된 블로그가 매우 많기도 하고 내가 쓴건 매우 간단해서 바로 알아 보기도 쉽기 때문이다. 

 

성공적으로 저장했다면 암호화된 Json파일이 지정된 경로에 생성된다.

 

위와 같이 최고점수를 Load하는데도 성공했다.

반응형