드디어 본캠프...!
한 달 동안 자습위주의 사전캠프가 있었지만 그 마저도 시간이 촉박했다...
협업에 앞서 하나라도 더 많은것을 배워 가고 싶었지만 아쉬운대로 나머진 짬짬히 하도록하자
본캠프에 들어와 캠프에 관한 설명을 들은 뒤 드디어 본격적인 조를 나뉘어 협업을 시작했다.
나의 첫 주차 조는 살2어조 (2조)
혹독한 9 to 9 일정속에 살아남고싶은 강한 의지가 보인다...
각설하고
1주차에는 미니 프로젝트로 사전캠프 4주차 강의에서 배웠던 르탄이 카드 뒤집기 게임에서 조금 더 살을 붙여나가는 작업을 협업으로 하는것이다.
조원 5명이 서로 5가지의 추가 기능 구현목록을 하나씩 맡아서 하기로 했다.
내가 맡은 파트는
" 매칭 성공 시, 팀원의 이름 표시 / 실패 시 실패 표시 (종료 시 끝! 나타나는 것처럼) " 이다.
1. 팀원이 직접 고른 사진들을 기존 프로젝트의 Sprite 대신 쓸 것.
2. 해당 사진의 주인인 '팀원 이름'을 표시할 것.
3. 실패 시 '실패' 표시할 것.
벌써 머리속에 그려진다... 뭔가 건드릴게 좀 있어보이는데?
바로 들어가보자
먼저 카드들의 스프라이트를 변경해주자
각자 보내준 이미지들을 사용해 스프라이트를 교체하자!
※ 여기서 잠깐!
조건 2를 다시 살펴보자
2. 해당 사진의 주인인 '팀원 이름'을 표시할 것.
그렇다. 해당 사진이 누구의 것 인지 알 수 있어야 한다.
기존 코드에선
Card 프리팹을 Instantiate 함수로 생성한 뒤, Resources 폴더의 파일 이름을 찾아
Card 프리팹의 자식인 front의 SpriteRenderer - Sprite에 할당하는 방식이었다.
int[] rtans = { 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7 };
for (int i = 0; i < 16; i++)
{
GameObject newCard = Instantiate(card);
newCard.transform.parent = cards.transform;
string rtanName = "rtan" + rtans[i].ToString();
newCard.transform.Find("front").GetComponent<SpriteRenderer>().sprite
= Resources.Load<Sprite>(rtanName);
}
- 기존의 Sprite를 할당하는 코드
하지만!
이 코드를 그대로 재사용 해버린다면 누구의 카드인지 알 수 없다.
코드를 수정해보자.
int[] rtans = { 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7 };
for (int i = 0; i < 16; i++)
{
GameObject newCard = Instantiate(card);
newCard.transform.parent = cards.transform;
newCard.GetComponent<card>().Setup(rtans[i]);
//string rtanName = "rtan" + rtans[i].ToString();
//newCard.transform.Find("front").GetComponent<SpriteRenderer>().sprite
// = Resources.Load<Sprite>(rtanName);
}
string으로 Resources 폴더내에 파일 이름을 찾는 방식은 주석 처리 후
Card 오브젝트의 card 컴포넌트에 매개변수로 int를 갖는 함수 Setup()을 실행한다.
다시 card 컴포넌트의 Setup 함수를 살펴보자.
public enum WhosCard
{
어쩌고,
저쩌고,
대충,
사람,
이름들
}
public class card : MonoBehaviour
{
public WhosCard WhosCard { get; private set; }
SpriteRenderer spriteRenderer;
[SerializeField] Sprite[] sprites;
public void Setup(int index)
{
spriteRenderer = transform.Find("front").GetComponent<SpriteRenderer>();
switch (index)
{
case 0:
case 1:
WhosCard = WhosCard.어쩌고;
break;
case 2:
case 3:
WhosCard = WhosCard.저쩌고;
break;
case 4:
case 5:
WhosCard = WhosCard.대충;
break;
case 6:
WhosCard = WhosCard.사람;
break;
case 7:
WhosCard = WhosCard.이름들;
break;
}
spriteRenderer.sprite = sprites[index];
}
}
먼저 Card 프리팹이 생성됨과 동시에 Setup 함수를 통해
card 컴포넌트의 자식인 front 오브젝트를 찾아 SpriteRenderer 컴포넌트를 spriteRenderer 전역변수에 할당 해준다.
그리고 switch 문으로 index 값에 따라 누구의 카드인지 판별하는 enum WhosCard를 할당한다.
마지막으로 sprite를 Inspector 창에서 Card 프리팹에 미리 할당해둔 sprite로 변경한다.
자 일단 테스트 해보자.
다음으로
매칭 성공 시 팀원의 이름이 표시
매칭 실패 시 실패 표시
되도록 해보자.
GameManager 에 매칭이 됐을 때 실행되는 코드가 있으니 GameManager에 몰아넣을 순 있지만,
스크립트를 새로 만들어서 해당 기능만 할당해보자.
using UnityEngine;
using UnityEngine.UI;
public class CardFlipNotice : MonoBehaviour
{
[SerializeField] Text _noticeText;
[SerializeField] string[] _names;
private void Start()
{
_noticeText.text = "";
}
public void MatchCheck(bool isMatched, WhosCard whos)
{
if (isMatched)
_noticeText.text = $"{_names[(int)whos]} 를(을) 찾았다!";
else
_noticeText.text = "틀렸지롱~ :p";
}
public void ResetText() => _noticeText.text = "";
}
매개변수로 bool 와 enum WhosCard 를 받는 MatchCheck 함수를 통해 bool 값인
isMatched == true 일 때 enum whos를 int 값으로 변환시켜
이름들이 적혀있는 string 배열의 index로 사용 해 팀원의 이름을 출력 시키도록 하자
isMatched == false 라면 틀렸다고 출력하자 (얄밉게 놀리기도 해주자)
이대로만 둔다면 다음 카드가 매칭될 때 까지 계속 텍스트가 유지되는게 보기 싫으니
ResetText 함수를 통해 text를 비도록 한다. (별로 중요하진 않아 코드는 생략!)
다음으로 GameManager 클래스의 isMatched 함수에 방금 작성한 코드를 적용하자
[SerializeField] CardFlipNotice cardFlipNotice;
public void isMatched()
{
bool isMatched = false;
string firstCardImage = firstCard.transform.Find("front").GetComponent<SpriteRenderer>().sprite.name;
string secondCardImage = secondCard.transform.Find("front").GetComponent<SpriteRenderer>().sprite.name;
if(firstCardImage == secondCardImage)
isMatched = true;
cardFlipNotice.MatchCheck(isMatched, firstCard.GetComponent<card>().WhosCard);
}
먼저 isMatched 함수 내부에 지역변수로 bool 값을 false로 선언.
firstCardIamage와 secondCardImage의 이름이 같으면 매칭 성공이므로 isMatched에 true를 할당.
이후 CardFlipNotice 클래스의 MatchCheck함수에
isMatched 와 첫번째 카드의 card 컴포넌트에 할당되어있는 enum WhosCard를 매개변수로 넣어주자.
(첫번째든 두번째든 별로 상관없다.)
자 이제 코드가 완성 되었으니 Inspector 창에서 클래스와 string값을 할당 후 게임을 실행해보자.
이렇게 본 캠프 1일차의 하루가 지나갔다!
(구현한 코드만 추출 해왔기 때문에 실제 클래스의 코드가 많이 생략되어 있습니다.)
'스파르타 내배캠' 카테고리의 다른 글
스파르타 내배캠 Unity 3기 6일차 (1) | 2023.12.29 |
---|---|
스파르타 내배캠 Unity 3기 5일차 (0) | 2023.12.28 |
스파르타 내배캠 Unity 3기 4일차 (1) | 2023.12.27 |
스파르타 내배캠 Unity 3기 3일차 (2) | 2023.12.26 |
스파르타 내배캠 Unity 3기 2일차 (2) | 2023.12.22 |