Short Cake
8PM - Animal Crossing Wild World

사생활 보호 설정

https://gamjia.tistory.com

Mini Rooms

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

What Friends Say

한마디로 표현해봐~

1촌평 관리

[Day 17] Suika Game Tutorial 1

GamJia 2024. 11. 23. 02:54

오블완 챌린지 17일차


오늘 얼른 블로그 정리하고

본가 가야돼서 귀찮은

GamJia 입니다

 

어제 Color Fill 강의를 끝냈고

오늘부터 Suika Game 강의를

5일 동안 진행하려고 합니다

 


 

혹시 원작을 모르시는 분들을 위해

원작 이미지를 첨부합니다

어떤 게임인지 감이 오시나요?ㅎㅎ

 

https://gamjia.tistory.com/259

 

수박게임 개발일지 - 1

수박게임 개발일지 1편 과일들을 그려보자 그녀의 다이어트 블로그 주소 https://blog.naver.com/smg5175 민영 : 네이버 블로그자기소개를 입력하세요.blog.naver.com 왜 그 많은 게임 중 수박게임이냐? 이유

gamjia.tistory.com

 


 

게임을 개발하기에 앞서 Sprite 이미지를

먼저 다운로드 받아주세요

 

좋은 스프라이트 이미지를 공유해주신

apps2amigos님께 감사드립니다!

 

https://apps2amigos.itch.io/fruit-game-free-asset-pack

 

Fruit Game - Free Asset Pack by Apps2Amigos

Free assets for a "suika game" project.

apps2amigos.itch.io

 


 

솔직히 이제 프로젝트 초기 세팅

감이 오셨을거라고 생각합니다

늘 그랬듯 sprite들을 정리해줄게요

 


 

배경의 패턴이 깨지지 않게

Draw ModeTiled로 설정해주고

윗부분 제외 나머지 구석에

collider 벽을 세워주도록 하겠습니다

 


 

그 다음 과일 객체에

Circle Collider, Rigidbody를 적용하고

Fruit라는 class를 추가해주도록 할게요

 


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

public class GameManager : MonoBehaviour
{
    [SerializeField] private List<GameObject> fruitPrefabs; // 랜덤으로 생성할 과일 프리팹 리스트
    private GameObject fruit; // 현재 드래그 중인 과일

    void Start()
    {
        CreateFruit();
    }

    void Update()
    {
  
        if (Input.GetMouseButton(0)) // 마우스 버튼을 누르고 있을 때
        {
            DragFruit();
        }

        if (Input.GetMouseButtonUp(0)) // 마우스 버튼을 뗄 때
        {
            DropFruit();
        }
    }

    void CreateFruit()
    {
        // 과일 리스트에서 랜덤으로 선택
        int randomIndex = Random.Range(0, 4);
        fruit = Instantiate(fruitPrefabs[randomIndex]);

        // 과일 초기 위치 설정 (화면 중앙 위)
        fruit.transform.position = new Vector3(0f, 4f, 0f);

        // Rigidbody2D를 Kinematic으로 설정
        Rigidbody2D rb = fruit.GetComponent<Rigidbody2D>();
        if (rb != null)
        {
            rb.isKinematic = true;
        }
    }

    void DragFruit()
    {
        if (fruit != null)
        {
            // 마우스 위치를 가져와 X 좌표만 업데이트
            Vector3 mousePos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
            mousePos.z = 0f; // 2D 환경을 가정하여 Z 좌표를 0으로 고정
            mousePos.x = Mathf.Clamp(mousePos.x, -3f, 3f); // X 좌표 -3 ~ 3으로 제한

            // 과일 위치 업데이트
            fruit.transform.position = new Vector3(mousePos.x, fruit.transform.position.y, fruit.transform.position.z);
        }
    }

    void DropFruit()
    {
        if (fruit != null)
        {
            // Rigidbody2D를 Dynamic으로 변경
            Rigidbody2D rb = fruit.GetComponent<Rigidbody2D>();
            if (rb != null)
            {
                rb.isKinematic = false;
            }

            // 현재 과일 초기화
            fruit = null;

            StartCoroutine(DelayFruit());

        }
    }

    IEnumerator DelayFruit()
    {
        yield return new WaitForSeconds(1f); // 1초 대기
        CreateFruit();
    }
}

 

그 다음 GameManager를 만들어주겠습니다

 

일단 과일은 체리~레몬까지만

자연적으로 생성되게 해주고

마우스를 떼기 전까지는 좌우 이동

가능한 기능을 구현해주겠습니다

 

Method 설명
Create Fruit 랜덤한 과일 프리팹을 화면 위(0, 4)에 생성하고 물리 엔진 상태를 Kinematic으로 설정.(생성하자마자 떨어지지 않게)
Drag Fruit 과일이 마우스의 X 좌표를 따라 움직이며 Z 좌표는 고정.
Drop Fruit 
  • 마우스를 떼면 Kinematic을 해제하여 과일이 떨어지도록 설정.
  • 현재 과일 레퍼런스를 비워 다음 과일을 생성할 준비를 함.
Delay Fruit delay를 이용해 떨어지는 중에 머지가 되는 상황을 방지

 


 

그 다음 Fruits Prefab에 방금 만든

과일 Prefab들을 레벨 순서로 넣어주겠습니다

체리가 가장 먼저, 수박이 가장 마지막이겠죠?

 


 

저장 후 실행해보니

제가 지정한 범위 내에 있는 과일들이

랜덤으로 잘 나타나고 떨어지고 있습니다!

 


 

오늘은 여기까지 하고

GitHub에 Commit하는걸로

마무리 하겠습니다!

요즘 날씨가 너무 추워졌어요ㅜㅜ

감기 안 걸리게 조심하세요!

저는 추운거 싫어해서 방금 전기장판

4단계로 틀어뒀어요....얼른 자야짓

 

 

감사합니다!!
 


 

'Challenge' 카테고리의 다른 글

[Day 19] Suika Game Tutorial 3  (0) 2024.11.25
[Day 18] Suika Game Tutorial 2  (0) 2024.11.24
[Day 16] Color Fill Tutorial 5  (0) 2024.11.22
[Day 15] Color Fill Tutorial 4  (0) 2024.11.21
[Day 14] Color Fill Tutorial 3  (0) 2024.11.20