카드에 랜덤으로 이미지 넣기 / 카드 2장만 열게 하기
오늘의 학습 키워드
1. 이미지 사이즈 조절하기
1) 카메라 사이즈 조절하기
2) Resources 또는 Images - 각 요소의 Pixels Per Unit 조절하기
Pixels Per Unit의 값이 클수록 이미지는 작아진다.
2. for 문
많은 요소에 같은 명령을 실행하고 싶을 때, for 문을 사용한다.
즉, for 문을 통해 반복적으로 명령을 내릴 수 있다.
void Start()
{
for (int i = 0; i < 16; i++)
{
Debug.Log(i);
}
}
1) { ~ } 안의 내용은 for 문으로 수행할 내용,
2) ( ~ ) 안의 내용은 for 문이 적용되는 조건을 나타낸다.
( ~ ) 는 2개의 ; 로 구분하는데,
( 조건에 사용될 숫자 ; 언제까지 반복수행할 것인지 ; 1회 수행 후 어떤 조치를 취할 것인지 ) 이다.
위 코드블럭의 경우 for (int i = 0; i < 16; i++) 이므로
( i라는 값이 존재하고 0으로 시작함 ; 15일 때까지 반복 ; 1회 수행 후 i에 1만큼 더해준다) 라고 해석한다.
3. 카드에 랜덤으로 이미지 부착하기 (단, pair 가 생기도록)
<Logic>
숫자를 입력한 후 + 랜덤으로 배열시켜서 + 숫자에 맞는 이미지를 출력한다
1) [0,0,1,1,2,2, ... ,7,7] 까지 입력
2) 16개의 숫자를 랜덤으로 출력
3) 카드가 만들어질 때마다 해당 번호에 맞는 이미지 부착
<적용하기>
// gameManager.cs
void Start()
{
Time.timeScale = 1.0f;
int[] rtans = { 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7 };
rtans = rtans.OrderBy(item => Random.Range(-1.0f, 1.0f)).ToArray();
string rtanName = "rtan" + rtans[i].ToString();
newCard.transform.Find("front").GetComponent<SpriteRenderer>().sprite = Resources.Load<Sprite>(rtanName);
}
1) 어떤 값의 모음(집합)을 저장하고 싶을 때 int[] 함수를 사용한다.
* 주의사항 *
for 문 안에 int[]를 넣으면 같은 값이 또 나오는 경우가 발생할 수 있다.
오류를 줄이기 위해서는 for 문 위에 int[]를 선언하는 것이 좋다.
2) 랜덤으로 배열하고 싶다? : Random.range 를 떠올리자!
3) script 에서 이미지를 지정하고 싶다면 unity-asset-resources 폴더를 활용하자.
Unity - Assets 아래 Images 폴더가 아닌 Resources 폴더로 이미지를 저장하면
스크립트에서 파일명을 명시하는 것으로 resource를 불러올 수 있다.
4. 카드 뒷면을 눌렀을 때 일어나는 일 3가지
1) 애니메이션 작동을 위해 isOpen true 로 만들기
2) 앞면 보이게 하기 : Front setActive 를 true 로 만들기
3) 뒷면 안보이게 하기 : Back setActive 를 false 로 만들기
// card.cs
public void openCard()
{
anim.SetBool("isOpen", true);
transform.Find("front").gameObject.SetActive(true);
transform.Find("back").gameObject.SetActive(false);
}
5. 카드 2장만 열게 하기
gameManage가 게임 규칙을 수행하기 위해서는
user가 처음 클릭한 카드가 firstCard인지, 두 번째로 클릭한 카드가 secondCard 인지 인식해야 한다.
// card.cs
if (gameManager.I.firstCard == null)
{
gameManager.I.firstCard = gameObject;
}
else
{
gameManager.I.secondCard = gameObject;
gameManager.I.isMatched();
}
<코드 해석>
if (gameManager.I.firstCard == null) : 카드를 하나 열었는데 null(공란) 이라면
(여기서 null 은 기억하고 있는 값이 없음을 의미한다.)
gameManager.I.firstCard = gameObject; : 이것은 fistCard가 된다.
else : 만약 null이 아니라면
gameManager.I.secondCard = gameObject; : 이것은 secondCard가 되며
gameManager.I.isMatched(); : gameManager에게 isMatched를 요청한다.
Unity 복습
1. 음향 효과 집어넣기
: 재생할 음악과 재생할 컴포넌트 두 가지가 필요하다.
public AudioClip : 어떤 음악을 재생할 것인가?
public AudioSource : 누가 음악을 재생할 것인가?
2. 출시 전 세팅하기
: 세로모드로 제작된 게임의 경우 가로모드를 제한해야 하는데,
Default Orientation 을 Auto Rotation 으로 설정하되,
아래의 Landscape Right/Left 를 끄면 된다.
(180도 돌렸을 때 세로모드에서는 작동할 수 있도록)
3. Keystore
: 안드로이드에서 이 앱을 배포할 수 있는 권리이다.
Keystore 를 갖고 있지 않으면 앱을 배포할 수 없다!
4. 광고 붙이기
: adsManager를 만들고 싱글톤화 해서 관리하는 것이 편하다.
* 주의사항 *
게임을 만든 Unity 엔진의 버전과 Ads package 버전이 호환되는지 확인할 필요가 있다.
5. 하이퍼캐주얼 게임이란?
: 하이퍼캐주얼 게임의 주요 특징은 다음과 같다.
1) 세로 화면으로 플레이
2) 원 버튼 플레이 제공 (터치 또는 슬라이드)
3) 1라운드에 30~60초
하이퍼캐주얼 게임은 아이디어와 빠른 실행력이 있다면 만들 수 있다.
C# 복습
1. string firstCardImage = firstCard.transform.Find("front").GetComponent<SpriteRenderer>().sprite.name;
해석 ) firstCardImage란, firstCard의 front의 SpriteRenderer에 있는 name을 의미한다.
오늘의 회고
광고 삽입 부분의 강의를 따라가기 위해 20.3.18 버전을 설치하고 게임을 새로 만들었다.
만들면서 C# 함수와 Unity 기능에 대한 복습이 되어서 좋았다.
하지만 adsManager.cs 에 빨간줄이 계속 그어져서 결국 광고 삽입 부분을 들어내고 광고 없는 버전으로 복구시켰다.
Unity 20.3.18 버전에 Ads package 4.4.2 버전을 사용하니 충돌이 일어난 것 같다.
내일은 과제 제출 전 게임을 업그레이드 시키고 싶다.
르탄이만큼 귀여운 모코코를 데려와야겠다. findmokoko !!
하루밖에 안 남았지만, 1주차부터 배운 내용을 녹여서 최대한 게임성을 높여 제출하고 싶다.
스크립트에 직접 코드를 넣을 때마다 게임이 망가지면 어떡하지? 무섭긴 하다.
직접 입력한 코드를 메모장에 붙여 넣어 문제가 생긴다면 해당 부분을 들어내는 방법을 사용해야겠다.
오늘도 알찬 공부!
내일 계획
오전 ) 1~5주차 강의에서 핵심 내용 복습
오후 ) findmokoko develop하기