[새롭게 배우는 것]
- 게임매니저가 심판 역할 하도록 기능 추가
- 오브젝트의 반복적인 배치를 반복문으로 해보기
1. 카드 만들기
- 16장의 카드가 모두 들어있는 엠티오브젝트 생성
- 카메라 크기가 아닌 이미지 사이즈 조정: 이미지의 pixel per unit 조절하기 (값이 클 수록 이미지는 작아짐)
- World Space로 내려온 UI 요소들은 대체적으로 아주 큰 편이기 때문에 사이즈를 아주 작게 설정해야 함 / 자체의 크기를 키우거나 Scale 조절
2. 카드 생성 및 배치하기
- 일반적으로 카드를 생성하면 cards라는 상위오브젝트에 속하지 않음
- 따라서 새로 생성된 카드를 newCard라는 변수에 할당하여 부모 속성을 변경
- newCard.transform.parent = GameObject.Find("cards").transform;
- 반복문의 i를 활용해서 위치 조정
- 카드 위치 잡아주기 코드 로직 의문
void Start()
{
for (int i = 0; i < 16; i++)
{
GameObject newCard = Instantiate(card);
newCard.transform.parent = GameObject.Find("cards").transform;
float x = (i / 4) * 1.4f;
float y = (i % 4) * 1.4f;
newCard.transform.position = new Vector3(x, y, 0);
}
}
수업 시간에 다룬 코드
void Start()
{
for (int i = 0; i < 16; i++)
{
GameObject newCard = Instantiate(card);
newCard.transform.parent = GameObject.Find("cards").transform;
float x = (i % 4) * 1.4f;
float y = (i / 4) * 1.4f;
newCard.transform.position = new Vector3(x, y, 0);
}
}
정렬하고자 하는 카드가 정육면체이고 카드간 세로, 가로 간격이 같기 때문에 상관 없는 것으로 보이는데, 논리를 따져봤을 때는 x좌표를 4로 나눈 나머지를, y좌표를 4로 나눈 몫을 기준으로 배치시키는 것이 정확하지 않나 생각한다.
- 수업에서 제공하는 코드로 해도 무관한 이유를 좀 더 찾아보고 이해해보기
3. 르탄이 이미지
- 르탄이 이미지 8개를 두 번씩 등장하게 하려면 (0,0,1,1,…,7,7)리스트 생성 후 숫자를 섞어서 순서대로 이미지 할당!
- 정수 리스트 생성: int [] 리스트명 = { };
- 리스트 요소의 번호와 i가 동일하기 때문에 리스트를 섞은 후 하나씩 호출해서 부여하면 됨!
- using System.Linq; // 리스트 아이템의 순서를 섞기 위해 필요
- rtans = rtans.OrderBy(item => Random.Range(-1.0f, 1.0f)).ToArray(); // 리스트 아이템의 순서를 섞는 코드
- OrderBy(item => item)으로 할 경우 숫자의 크기대로 정렬됨
- Random.Range(-1.0f, 1.0f))의 의미 찾아보기
- 이미지 불러오기
- Resources라는 폴더 생성 후 Resources.Load<Sprite>(rtanName); 활용
- string rtanName = "rtan" + rtans[i].ToString();
- newCard.transform.Find("front").GetComponent<SpriteRenderer>().sprite = Resources.Load<Sprite>(rtanName);
- Resources라는 폴더 생성 후 Resources.Load<Sprite>(rtanName); 활용
4. 애니메이션
- 애니메이션 전환(복습)
- public Animator anim;
- anim.SetBool(“parameter”, trueOrFalse);
- 이미지 전환: 스크립트가 적용된 것은 card라는 빈 오브젝트. 그 하위에 있는 front와 back 이미지를 활성화, 비활성화 할 때는 transform.Find(“front).gameObject.SetActive(“true”)이런 식으로 Find 함수 활용
5. 카드 매칭
- 첫번쨰 카드와 두 번째 카드 설정하기
- 카드 각각이 아닌 게임 전체에서 인식돼야 하는 정보이기 때문에 GameManager에 변수 등록
- card.cs에서 조건에 따라 변수에 오브젝트 할당
- 카드 매치를 확인하는 함수를 GameObject에 생성
- 매치 확인은 이미지 이름으로
- string firstCardImage = firstCard.transform.Find("front").GetComponent<SpriteRenderer>().sprite.name;
- 각각의 카드가 다시 뒤집어지거나 없어지는 함수는 card.cs에
- public 함수 선언
- GameObject에서 함수를 불러올 때는 firstCard와 secondCard의 GetComponent<card>() 활용 //오브젝트의 컴포넌트 불러오기
- 매칭 확인 후 첫 번째, 두 번째 카드 비워주기: null값 할당
6. 게임 끝내기
- 마지막 매칭되는 순간에 종료
- isMatched 안에서 조건 달고 종료 함수 Invoke
- 수업에서는 다루지 않았지만 isRunning 활용하는 게 사용감에 훨씬 좋은 영향을 줌
- 끝! 클릭하면 다시 시작
- 끝 오브젝트에 버튼 컴포넌트와 스크립트 추가해서 onclick시 ReGame(씬로드) 되도록 하기
[기록]
카드 매칭 하는 부분은 만들어본 경험이 없는 기능들을 많이 다루어서 다시 한 번 활용해서 게임을 만들어봐야겠다!
더 찾아볼 부분:
- 카드 배치 부분 코드 살펴보기
- 리스트 아이템 순서 재배열에서 Random.Range(-1.0f, 1.0f))의 의미(왜 랜덤함을 의미하는지) 찾아보기
'👾 내일배움캠프 > 🃏 사전캠프' 카테고리의 다른 글
C# 기초 - 기록1 (0) | 2023.08.02 |
---|---|
유니티 입문 5일차 - 런칭 준비하기 (0) | 2023.08.01 |
유니티 입문 3일차 - 고양이 밥주기 (0) | 2023.07.31 |
유니티 입문 2일차 - 풍선을 구해라! (0) | 2023.07.31 |
유니티 입문 1일차 - 빗물 받는 르탄이 (0) | 2023.07.28 |