스파르타코딩클럽 Unity 사전강의 4주차 [르탄이 뒤집기]

2025. 4. 4. 14:09·스파르타코딩클럽_Unity개발과정

1. 게임 개요

1) 환경 : 카드를 뒤집어 앞면의 그림의 짝을 맞추는 게임

2) 목표 : 제한시간 내 모든 짝 맞추기

3) 실패 : 제한시간 내 모든 카드의 짝을 맞추지 못함

 

2. 새로 배운 내용

1) 스프라이트 크기 조정

이미지 에셋의 인스펙터 >> pixel per unit 조정 >> Apply

값이 커질수록 단위 당 들어가는 픽셀이 많아지므로 이미지가 작아집니다.

pixel per unit = 500. 1Unit에 500픽셀이 들어갑니다

 

이미지 크기 가로x세로 = 500x500 픽셀
따라서, 그리드로 확인해보니 1Unit 크기에 맞춰졌습니다.

 

2) 스크립트를 통한 오브젝트 생성 및 정렬

이전까지 쭉 프리펩을 만들고 이를 Instantiate()를 이용하여 복사 생성하여 게임에서 사용하는 것을 다뤘습니다.

이번엔 심화로 여러 오브젝트 생성, 하이어라키 창에서의 정리, 정렬까지 해보았습니다.

 

(1) 반복문

놀랍게도 지금까지 반복문 없이 기초적인 미니게임을 만들며 성취감을 줬었습니다.

이번에는 for 루프에 대한 설명부터 사용까지 보여주었습니다.

프로그래밍 반복문을 검색해 보면 자세한 내용이 나온 자료가 많을 것이기에 루프에 대한 설명은 생략토록 하겠습니다.

 

(2) Instantiate()와 동시에 부모 오브젝트에 넣기

Instantiate()의 첫번째 매개변수에는 복제하여 생성할 대상 오브젝트 혹은 트랜스폼이 들어갑니다.

여기에 , 를 찍고 2번째 매개변수로 트랜스폼 값을 넣어주면 해당 트랜스폼 >> 오브젝트의 자식으로 바로 넣어줄 수 있습니다.

 

(3) % 연산자

나눗셈을 배울 때 이런 말을 들어봤을 것입니다.

예를 들어, 6을 4로 나누면 몫이 1이고 나머지가 2

 

이를 프로그래밍으로 표현하기 위해 몫과 나머지에 각각 하나의 기호를 사용합니다.

 

나눗셈의 몫을 구하기 위해서 /

나눗셈의 나머지를 구하기 위해서 %

 

위의 예시를 프로그래밍으로 쓴다면 이렇게 씁니다.

몫 : 6 / 4 

나머지 : 6 % 4

 

그리고 그 값은 몫 1, 나머지 2로 나옵니다.

 

이 3가지 새로운 내용을 활용하여

카드 1장 생성, 카드판인 Board의 자식 오브젝트로, 생성한 순서에 따라 카드의 위치를 정렬 하는 과정을 16회 반복

 

16장의 카드를 생성하여 하이어라키, 게임 화면에서 정렬하는 과정을 구현하였습니다.

using UnityEngine;

public class Baord : MonoBehaviour
{
    public Transform card;
    [Tooltip("한 줄에 들어갈 카드 갯수, 카드는 정사각형으로 배치")]
    public int cardNumInRow = 4;

    float space = 1.4f;
    void Start()
    {
        // 카드 수
        int cardNum = cardNumInRow * cardNumInRow;

        for (int i = 0; i < cardNum; i++)
        {
            // card 프리팹을 복제하여 오브젝트 생성
            // >> 해당 스크립트를 부착한 Board 를 부모 오브젝트로
            // >> 생성한 card 오브젝트의 위치를 정사각형 형태로 정렬
            Instantiate(card, transform).position = space * new Vector3((i % cardNumInRow), (i / cardNumInRow), 0);
        }
    }
}

 

3) 자료구조 랜덤 셔플

System.Linq 네임스페이스의 OrderBy()를 활용하여 자료구조의 항목들을 랜덤으로 섞는 방법을 배웠습니다.

        // 이미지 짝의 수
        int pair = (cardNum / 2);
        GameManger.Instance.pairCount = pair;

        // cardNumInRow에 따라 자동으로 랜덤 짝을 카드에 부여하기 위해 아래 예제 배열을 리스트로 변경
        List<int> listEx = new List<int>();
        for (int i = 0; i < pair; i++)
        {
            listEx.Add(i);
            listEx.Add(i);
        }
        listEx =listEx.OrderBy(x => Random.Range(0f, 7f)).ToList();

        // 어떤 카드 이미지가 나올지 정수로 들고 있는 배열. 짝이 되게 2개씩 가지고 있음
        // 랜덤 정렬 (OrderBy() 사용에 System.Linq 네임스페이스 필요) 
        // .을 눌러 파생 메서드
        // >> OrderBy : 정렬
        // >> x => (왼쪽에서부터 순서대로 전부 수행)
        // >> Random.Range(0f, 7f) 정렬 기준으로 0f~7f사이 랜덤한 값 뽑아서 이 랜덤값들을 기준으로 정렬하게끔
        // >> 메서드의 리턴 형식을 .ToList()로 리스트로 변경
        // >> 랜덤으로 섞은 리스트가 원래 리스트에 들어가게끔

 

4) 실행 중 public이 아닌 변수의 값을 확인하고 싶다면?

접근제한자를 public으로 선언한 변수는 인스펙터에 출현하여 값을 바로 확인하고 수정할 수 있습니다.

 

하지만 private, protected와 같은 다른 접근제한자로 선언한 경우 그 값을 알고 싶을 때 확인하는 방법입니다.

인스펙터에서는 접근제한자가 private 인 변수의 정보를 볼 수 없습니다.

 

상단의 Inspector 탭 우클릭 >> Debug

 

Card 스크립트 내 private int index 변수의 값을 확인할 수 있습니다.

 

다시 인스펙터로 돌리고 싶다면 상단 Debug 탭 우클릭 >> Normal 을 눌러주면 됩니다.

 

5) Resources

Assets 폴더에 Resources 명칭의 폴더를 생성합니다.

이 이름은 틀려서는 안되기에 철자에 유의해야 합니다.

스크립트로 접근할 에셋들을 Resources 폴더 내에 넣어줍니다.

 

문자열 내부에 변수를 문자로 바꿔서 넣고 싶을 때는 아래와 같은 방법 사용합니다.

주석에 설명을 달아놓았습니다.

using UnityEngine;

public class Card : MonoBehaviour
{
    int index = 0;
    public SpriteRenderer frontImage;

    public void Setting(int num)
    {
        index = num;

        // Resources 폴더 이름을 그대로 적어주라는 것이 Resources 클래스에서 그 이름의 폴더에 접근하기 때문입니다.
        // Resources.Load : Resources 폴더에서 불러오기
        // <Sprite> : 불러올 에셋의 리턴 타입
        // (string path) : Resources 폴더 내부의 경로
        // 예를 들어 Resources >> Image 폴더 >> rtan0가 있다면 Resources.Load<Sprite>("Image/rtan0") 를 적어주면 해당 스프라이트에 접근할 수 있습니다.

        // $ 를 문자열 앞에 붙이면
        // 중괄호 {}는 해당 문자열에서 문자(주황색)로 취급되지 않고 흰색으로 표시됩니다.
        // 이때 중괄호 안에 변수를 넣어주면 그 변수를 문자로 바꿔서 넣을 수 있습니다.
        // 예) index가 5일 때, 아래 구문의 문자열은 rtan5
        frontIamge.sprite = Resources.Load<Sprite>($"rtan{index}");
    }
}

 

저작자표시 비영리 동일조건 (새창열림)

'스파르타코딩클럽_Unity개발과정' 카테고리의 다른 글

스파르타코딩클럽 Unity 사전강의 5주차 - (2) [안드로이드 빌드]  (0) 2025.04.05
스파르타코딩클럽 Unity 사전강의 5주차 - (1) [르탄이 뒤집기++]  (0) 2025.04.05
스파르타코딩클럽 Unity 사전강의 3주차 [고양이 밥주기]  (0) 2025.04.03
스파르타코딩클럽 Unity 사전강의 2주차 [풍선을 지켜라]  (0) 2025.04.03
스파르타코딩클럽 Unity 사전강의 1주차 [빗물받는 르탄이].. 였던 것  (1) 2025.04.02
'스파르타코딩클럽_Unity개발과정' 카테고리의 다른 글
  • 스파르타코딩클럽 Unity 사전강의 5주차 - (2) [안드로이드 빌드]
  • 스파르타코딩클럽 Unity 사전강의 5주차 - (1) [르탄이 뒤집기++]
  • 스파르타코딩클럽 Unity 사전강의 3주차 [고양이 밥주기]
  • 스파르타코딩클럽 Unity 사전강의 2주차 [풍선을 지켜라]
ybbro
ybbro
대부분의 포스팅은 pc에서 작성되었습니다. 모바일에서 볼 때 설명이 잘리면 데스크탑 모드를 사용해보길 바랍니다.
  • ybbro
    어떻게든 굴리는 게임 공방
    ybbro
  • 전체
    오늘
    어제
    • 전체 N
      • 스파르타코딩클럽_Unity개발과정 N
      • Unity 2D
        • 카드게임
        • 플랫포머 게임
        • 뱀서라이크
      • Unity 3D
        • 닷지
        • 유니티 짱
        • 디펜스 게임
      • Unity 에러 노트
      • 기능 구현 방법 정리
      • 셰이더 그래프
        • 2D
        • 3D
      • 프로그래머스
      • 자료구조
      • 기타
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    룰렛
    대시
    무료스킨
    텍스트매시프로
    마스크
    UI
    sprite mask
    유니티
    잔상
    64비트
    앱이 휴대전화와 호환되지 않아 설치되지 않았습니다
    unity
    다크모드
    세이브
    직렬화
    유니티 애니메이터 파라미터 초기화
    삭제
    hello
    스파인
    갤럭시 S24
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
ybbro
스파르타코딩클럽 Unity 사전강의 4주차 [르탄이 뒤집기]
상단으로

티스토리툴바