ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • PlayFab과 Unity 연동 (4) - 게임 점수 Data 보내고 가져오기
    CS/졸업 프로젝트(Duk to Me) 2023. 9. 18. 21:41
    반응형

        지난 단계에 닉네임 Data를 계정별로 보낸 것과 같이 Unity 내에서 게임을 끝까지 마쳤을 때 저장되는 점수 Data를 PlayFab으로 보내고 가져오는 기능을 구현해보자.

     


     

    ① 'ScoreManager.cs'는 영어회화 학습을 진행하는 여러 개의 Scene으로 부터 인식된 음성인식을 미리 지정된 Script Text File과 대조하여 나온 점수 정보를 관리하는 C# Script이다. 이 Script에서 최종적으로 나온 점수 Data를 PlayFab으로 보내는 동작을 정의하는 'SendScoreToPlayFab()'를 추가하여 수정하기 (이때 점수 Data는 Dictionary Type으로 보냄)

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using PlayFab;
    using PlayFab.ClientModels;
    using UnityEngine.UI;
    
    public class ScoreManager : MonoBehaviour
    {
    	public Text t_score, t_average;
        public static int totalScore = 0;
    
        public static void AddScore(int score)
        {
            totalScore += score;
        }
    
        public static int GetScore()
        {
            return totalScore / 6; // 씬의 갯수만큼 나눠서 평균 출력하기
        }
    
    	// SendScoreToPlayFab() method를 call
    	public void HandleButtonClick()
    	{
    		int scoreValue = ScoreManager.GetScore();
    
    		if (scoreValue <= 100 && scoreValue >= 80)
    		{
    			t_score.text="Excellent!";
    			t_average.text=$"Average Score: {scoreValue}%";
    			//Debug.Log("Excellent!");
    			//Debug.Log($"Average Score: {scoreValue}%");
    		}
    		else if (scoreValue >= 70)
    		{
    			t_score.text="Great job!";
    			t_average.text=$"Average Score: {scoreValue}%";
    			//Debug.Log("Great job!");
    			//Debug.Log($"Average Score: {scoreValue}%");
    		}
    		else if (scoreValue >= 50)
    		{
    			t_score.text="Well done!";
    			t_average.text=$"Average Score: {scoreValue}%";
    			//Debug.Log("Well done!");
    			//Debug.Log($"Average Score: {scoreValue}%");
    		}
    		else if (scoreValue >= 0)
    		{
    			t_score.text="Keep Practicing!";
    			t_average.text=$"Average Scor: {scoreValue}%";
    			//Debug.Log("Keep Practicing!");
    			//Debug.Log($"Average Scor: {scoreValue}%");
    		}
    
    		// Call the method to send the score to PlayFab
    		SendScoreToPlayFab(scoreValue);
    	}
    
    	// Call받으면 PlayFab DB로 score를 account별로 보내기
    	private void SendScoreToPlayFab(int score)
    	{
    		// Assuming you have already authenticated the player with PlayFab
    
    		// Create a request to update the player's data
    		UpdateUserDataRequest request = new UpdateUserDataRequest
    		{
    			Data = new Dictionary<string, string>
    			{
    				{ "score", score.ToString() }
    			}
    		};
    
    		// Send the request to PlayFab
    		PlayFabClientAPI.UpdateUserData(request, OnUpdateUserDataSuccess, OnUpdateUserDataFailure);
    	}
    
    	private void OnUpdateUserDataSuccess(UpdateUserDataResult result)
    	{
    		Debug.Log("Score successfully sent to PlayFab!");
    	}
    
    	private void OnUpdateUserDataFailure(PlayFabError error)
    	{
    		Debug.LogError("Failed to send score to PlayFab: " + error.ErrorMessage);
    	}
    
    }

     

    ② 이제 점수 Data를 가져올 'My Page' Scene에 적용되는 'nick_mypage.cs' Script를 점수 Data를 가져오는 Method인 'FetchScoreFromPlayFab()' 등을 추가하여 수정하기

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using UnityEngine.SceneManagement;
    using PlayFab;
    using PlayFab.ClientModels;
    using UnityEngine.UI;
    
    public class nick_mypage : MonoBehaviour
    {
        public TMPro.TextMeshProUGUI t_name, t_score1;
    
        public void Start()
        {
            
            // Fetch and display PlayFab data when transitioning scenes
            FetchDataFromPlayFab();
        }
    
    	// 닉네임 Data 불러오기
        private void FetchDataFromPlayFab()
        {
            // Request to get the player's account info
            GetAccountInfoRequest request = new GetAccountInfoRequest();
    
            // Send the request to PlayFab
            PlayFabClientAPI.GetAccountInfo(request, OnGetAccountInfoSuccess, OnGetAccountInfoFailure);
        }
    
        private void OnGetAccountInfoSuccess(GetAccountInfoResult result)
        {
            // Fetch and display user's display name
            string displayName = result.AccountInfo.TitleInfo.DisplayName;
            //Debug.Log("Fetched Display Name: " + displayName);
            t_name.text = displayName;
    
            // Fetch and display user's score
            FetchScoreFromPlayFab();
        }
    
        private void OnGetAccountInfoFailure(PlayFabError error)
        {
            Debug.LogError("Failed to fetch PlayFab account info: " + error.ErrorMessage);
        }
    
    	// 점수 Data 불러오기
        private void FetchScoreFromPlayFab()
        {
            // Assuming you have already authenticated the player with PlayFab
    
            // Create a request to get the player's data
            GetUserDataRequest request = new GetUserDataRequest();
    
            // Send the request to PlayFab
            PlayFabClientAPI.GetUserData(request, OnGetUserDataSuccess, OnGetUserDataFailure);
        }
    
        private void OnGetUserDataSuccess(GetUserDataResult result)
        {
            if (result.Data.TryGetValue("score", out var scoreValue))
            {
                if (int.TryParse(scoreValue.Value, out var parsedScore))
                {
                   // Debug.Log("Fetched Score: " + parsedScore);
                    t_score1.text = parsedScore.ToString();
                }
                else
                {
                    Debug.LogError("Failed to parse fetched score.");
                }
            }
            else
            {
                Debug.Log("No 'score' data found in PlayFab.");
            }
        }
    
        private void OnGetUserDataFailure(PlayFabError error)
        {
            Debug.LogError("Failed to fetch PlayFab data: " + error.ErrorMessage);
        }
    }

     

        여기까지 끝나면 Unity Project를 Play하여 영어회화 학습 게임을 끝까지 진행했을 때 점수 Data가 Playfab으로 보내지고, My Page에서 마지막에 실행한 게임에 대한 점수 정보를 확인할 수 있다.

     


     

    점수 Data 출력결과

     

     

     

    반응형
Designed by Tistory.