Short Cake
8PM - Animal Crossing Wild World

사생활 보호 설정

https://gamjia.tistory.com

Mini Rooms

  • 내 미니룸
  • 미니미설정
  • 미니룸설정
  • 답글수 [0]

What Friends Say

한마디로 표현해봐~

1촌평 관리

[Day 20] Suika Game Tutorial 4

GamJia 2024. 11. 26. 01:07

오블완 챌린지 20일차


오늘 저녁에 술 마셔야 돼서
12시 되자마자 블로그를
작성하고 있는 GamJia 입니다
 
어제 강의에 이어서
Suika Game을 만들어 보겠습니다


 
일단 점수 Text와 GameOver 창을
Canvas에 추가해주겠습니다
저 폰트로 정말 뽕을 뽑은거 같습니다
 


 

다운로드 받은 Sprite 중에 UI
Sprite도 있길래 잘라서 사용하겠습니다
 
오른쪽의 점선은 Auto로 자를 경우
점선이 전부 분리 되는데 이미지처럼
하나로 이어주도록 하겠습니다
 


 
자른 이미지는 버튼점선
객체에 적용해주겠습니다
객체 위치는 이미지를 참고해주세요
 


using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using SuikaGame;
using TMPro;   
using UnityEngine.UI;

namespace SuikaGame
{   
    public class GameManager : MonoBehaviour
    {

        [System.Serializable]
        public class Fruits
        {
            public GameObject prefab; // 과일 프리팹
            public int score; // 점수
        }
        [SerializeField] private List<Fruits> fruits; // 랜덤으로 생성할 과일 프리팹 리스트
        [SerializeField] private GameObject guide;
        [SerializeField] private GameObject gameOver;
        [SerializeField] private TextMeshProUGUI scoreText;
        [SerializeField] private Button restartButton; 
        private GameObject fruit; // 현재 드래그 중인 과일
        private int score=0;


        public static GameManager Instance => instance;
        private static GameManager instance;

        private void Awake()
        {
            if (instance == null)
            {
                instance = this;
                DontDestroyOnLoad(gameObject); 
            }
            else
            {
                Destroy(gameObject); 
            }
        }



        void Start()
        {
            if (restartButton != null)
            {
                restartButton.onClick.AddListener(RestartGame);
            }

            gameOver.SetActive(false);
            guide.SetActive(false);

            CreateFruit();
        }

        void Update()
        {
            if (gameOver.activeSelf)
            {
                return;
            }


            ...
        }

        void RestartGame()
        {
            foreach (Transform child in transform)
            {
                Destroy(child.gameObject);
            }

            gameOver.SetActive(false);
            guide.SetActive(false);

            score=0;
            scoreText.text="0";

            fruit=null;
            
            StartCoroutine(DelayFruit(0.3));
        }

        void CreateFruit()
        {
        	...
            fruit = Instantiate(fruits[randomIndex].prefab,transform.position, Quaternion.identity, this.transform);
            ...
        }


        void DragFruit()
        {
            if (fruit != null)
            {
                ...

                if(!guide.activeSelf)
                {
                    guide.SetActive(true);
                }

                guide.transform.position=new Vector3(mousePos.x, guide.transform.position.y, guide.transform.position.z);
            }
        }

        void DropFruit()
        {
            if (fruit != null)
            {
                ...
                
                if(guide.activeSelf)
                {
                    guide.SetActive(false);
                }


            }
        }

        public void DestroyFruit(GameObject first, GameObject second)
        {
            ...
            int index = -1;
            for (int i = 0; i < fruits.Count; i++)
            {
                if (fruits[i].prefab.name == first.gameObject.name)
                {
                    index = i;
                    break;
                } 
            }

            // 다음 레벨 과일 생성
            if (index == -1 || index + 1 >= fruits.Count)
            {
                return;
            }

            Vector3 spawnPosition = (first.transform.position + second.transform.position) / 2;
            GameObject newFruit = Instantiate(fruits[index+1].prefab, spawnPosition, Quaternion.identity,this.transform);

            UpdateScore(fruits[index+1].score);

            ...
        }

        void UpdateScore(int add)
        {
            score+=add;
            scoreText.text=score.ToString();
        }


        IEnumerator DelayFruit(double time)
        {
            yield return new WaitForSeconds((float)time);  // double을 float로 변환
            CreateFruit();
        }

    }
    

}

 
일단 수정, 추가된 부분은 다음과 같습니다

Method설명
CreateFruit, DestroyFruit(수정)현재 객체(GameManager)의 자식으로 객체가 생성되게 바꿔줬습니다, 기존 Prefab List에서 Prefab과 int가 같이 있는 Fruits라는 List로 변경하면서 관련 내용도 수정했습니다
DragFruit, DropFruit(수정)Drag할 때는 가이드가 보이게, Drop할때는 안보이게 설정했습니다
RestartGame(추가)GameOver가 된 경우 현재 내용을 초기화 하고 다시 게임을 재시작 하게 해줍니다 GameOver창이 떠있을 경우에는 drag, drop 등이 불가능 합니다
UpdateScore(추가)Fruits의 점수를 더해 text에 표시합니다

 


 
List를 다음과 같이 Prefab List에서
<Prefab,int> List로 변경했습니다
체리는 가장 작은 객체라
합쳐서 체리가 나오는 경우가 없기에
0점으로 처리했습니다
 
체리+체리인 경우에는 딸기의
1점을 추가하게 설정했습니다
 
점수는 원작의 나무위키를 참고 했습니다!
https://namu.wiki/w/%EC%88%98%EB%B0%95%EA%B2%8C%EC%9E%84#s-3

수박게임

2021년 발매된 닌텐도 스위치 전용 퍼즐 게임 . 당초 일본 닌텐도 e숍 에서만 구매 가능한 내수용 게

namu.wiki

 


 
GameOver 조건이 아직 없어서
오늘은 제가 hiearchy에서 직접
GameOver창을 활성화 해주었습니다
 
점수도 잘 증가하고
게임 재시작 후 초기화와
점수 증가에 문제가 없는걸 확인했습니다
 


 

오늘은 여기까지 하고
GitHub에 Commit하는걸로
마무리 하겠습니다!

드디어 내일 블로그 챌린지가
끝나는 날이네요!
끝까지 최선을 다하겠습니다
 
 

감사합니다!!
 


 

'Challenge' 카테고리의 다른 글

티스토리 연말 결산 캘린더(12월 19일)  (0) 2024.11.28
[Day 21] Suika Game Tutorial 5  (1) 2024.11.27
[Day 19] Suika Game Tutorial 3  (0) 2024.11.25
[Day 18] Suika Game Tutorial 2  (0) 2024.11.24
[Day 17] Suika Game Tutorial 1  (1) 2024.11.23