김김김의 게임개발
  • 유니티 게임개발 입문 #6
    2023년 09월 11일 21시 55분 50초에 업로드 된 글입니다.
    작성자: noun06

    운석 타입 별 점수

    • 점수 시스템 관련된 부분들을 추가하였음. 점수는 게임 점수와 별점으로 나누어지며 그 중 별점만이 저장되는 값임.
    • 우선 Meteor.cs에서 타입 별 점수를 지정해줌. 실제 값은 자식 클래스에서 설정.
    //Meteor.cs
    
    	//...
    public int Score { get; set; }
    	//...
    
        public Meteor(string name, int hardness, int score)
        {
            Name = name;
            Hardness = hardness;
            Score = score;   
        }

     

    점수 계산

    • GameManager.cs에서 점수 관련 로직을 작성하였음. 시간과 파괴한 운석 수를 통해 계산되는 최종점수, 게임 플레이 중 업데이트되는 운석 파괴 점수, 그리고 최종점수에 기반한 별점이 있음. 별점은 키값을 통해 저장되고StageManager.cs에서 불러옴.
    //GameManager.cs
    
    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using TMPro;
    
    public class GameManager : MonoBehaviour
    {
        public static GameManager I;
    
        [SerializeField] private Stage _stage;
        private int _curStage;
        private bool _isOver;
    
        public int finalScore = 0;
        public int score = 0;
        public TMP_Text scoreText;
    
        public int starRating = 0;
    
        private float _runningTime = 0f;
        public TMP_Text timeText;
    
        private void Awake()
        {
            I = this;
        }
    
        void Start()
        {
            // StageManager에서 stage 정보 가져오는 부분
            //_curStage = StageManager.SM.GetStage();
            _curStage = 1;
            if (_curStage == 1)
            {
                // TODO SetStageInfo 인자 값 설정
                _stage.SetStageInfo("NewEasyStageGrid", "");
            }
            else if (_curStage == 2)
            {
                _stage.SetStageInfo("NormalStageGrid", "");
            }
            else if (_curStage == 3)
            {
                _stage.SetStageInfo("HardStageGrid", "");
            }
           
            _isOver = false;
    
            starRating = PlayerPrefs.GetInt(StringKey.STAR_RATING_PREFS, 0);
        }
    
        void Update()
        {
            if (_isOver)
            {
                _stage.StageFail();
            }
    
            _runningTime += Time.deltaTime;
            timeText.text = _runningTime.ToString("N2");
    
            finalScore = score + Mathf.FloorToInt(1000 / _runningTime);
    
            CalculateStarRating();
        }
    
        public void GameOver()
        {
            _isOver = true;
        }
    
        public void UpdateScore(int scoreValue)
        {
            score += scoreValue;
            scoreText.text = "Score: " + score;
        }
    
        private void CalculateStarRating()
        {
            if (finalScore > 300)
            {
                starRating = 3;
            }
            else if (finalScore > 200)
            {
                starRating = 2;
            }
            else if (finalScore > 100)
            {
                starRating = 1;
            }
            else
            {
                starRating = 0;
            }
    
            PlayerPrefs.SetInt(StringKey.STAR_RATING_PREFS, starRating);
            PlayerPrefs.Save();
        }
    }

     

    별점 이미지 적용

    • StageUIManager.cs 내에서 게임매니저의 별점 값을 가져와 이미지로 나타냄.
    • 그리고 Stage.cs에서 SetStageEndPanel 메서드를 호출하여 별점을 나타냄.
    //StageUIManager.cs
    
    public void SetStageEndPanel(bool isClear, int score)
        {
            string clearText = isClear ? STAGE_CLEAR : STAGE_FAIL;
            clearText += " Score: " + GameManager.I.finalScore;
            _gameOverText.text = clearText;
    
            SetStarImage(GameManager.I.starRating);
    
            SetBtn();
    
            _stageEndPanelImage.SetActive(true);
        }
    
    
        // 점수에 따른 별 이미지 세팅
        private void SetStarImage(int starRating)
        {
    
            Sprite filledStar = Resources.Load<Sprite>("Image/StarImage/filled_star_img");
            Sprite emptyStar = Resources.Load<Sprite>("Image/StarImage/empty_star_img");
    
            _star1Image.sprite = (starRating >= 1) ? filledStar : emptyStar;
            _star2Image.sprite = (starRating >= 2) ? filledStar : emptyStar;
            _star3Image.sprite = (starRating >= 3) ? filledStar : emptyStar;
        }

     

    댓글