이미지 사이즈가 맞지 않을땐 두가지 방법으로 사이즈를 맞출 수 있는데 첫번째는 저번에 했듯이 카메라를 멀리 떨어트리는 것이고 두번째 방법은 이미지 픽셀을 줄이는 것이다
이미지를 누르면 Pixels Per Unit에서 숫자를 변경할 수 있다. 숫자가 클수록 이미지가 작아진다 개인적으로 이미지 하나 하나를 카메라에 맞출 수는 없으니 이 방법이 더 편하다.
함수를 쓰다보면 매번 필요한 네임스페이스 찾아오기 힘들었으나 그 과정이 수월해지게 된다.
단축키는 Alt+Enter
규칙적인 룰을 갖는 배치를 수동으로 만들기는 힘들기 때문에 10개가 넘어가면 코드를 이용해서 배치하는 것이 좋을것이다.
카드의 스케일이 1.3이므로 1.4당 배치를 할 것이다.
public GameObject card;
void Start()
{
for (int i = 0; i < 16; i++)
{
GameObject newCard = Instantiate(card);
newCard.transform.parent = GameObject.Find("cards").transform;
}
}
GameObject newCard 에 먼저 생성한 오브젝트 변수를 넣어주고 newCard 변수를 이용해서 배치를 해줄 것이다.
이때 프리팹 card를 게임오브젝트 Cards 안에 생성하려고 한다
위치 변경할 오브젝트.transform.parent : 부모 오브젝트를 얘기한다.
저번에 배운 Find 함수로 부모 오브젝트를 초기화 해주면 newCard의 부모 오브젝트가 바뀐다.
void Start()
{
for (int i = 0; i < 16; i++)
{
... 생략
float x = (i / 4) * 1.4f;
float y = (i % 4) * 1.4f;
newCard.transform.position = new Vector3(x, y, 0);
}
}
이제 각 오브젝트마다 배치 해준다. 이론적으로는 i는 반복할때마다 올라가니까 i에 4를 몫 연산, 나머지 연산으로 하나는 x축을 하나는 y축을 계산해주면 된다
위의 상태일때는 gamobject.transform이 x = 0, y = 0일때 기준이기 때문에 왼쪽 아래 위치로 포지션값을 땡겨줘야 한다.
x - 2.1f;
y - 3.0f;
참고로 고정관념 때문에 왼쪽에서 오른쪽으로 윗줄부터 Instantiate() 되는줄 알고 왜 x를 몫연산하는지 영상 멈추고 엄청 봤다. 보니까 튜터님이 예시 로직까지 구현해주면서 잘 설명해 주시더라
using System.Linq; //필요 라이브러리
void Start()
{
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();
}
리스트.OrderBy : 이 리스트를 정렬하는 함수이다.
위의 경우에는 리스트를 랜덤하게 정렬한다.
void Start()
{
int[] rtans = { 3, 3, 2, 2, 1, 1, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7 };
rtans = rtans.OrderBy(item => item).ToArray();
}
참고로 이 경우에는 0부터 순서대로 리스트를 정렬한다.
리스트에 맞는 이미지들을 Resources파일에 넣는다.
void Start()
{
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();
for (int i = 0; i < 16; i++)
{
...생략
string rtanName = "rtan" + rtans[i].ToString();
newCard.transform.Find("front").GetComponent<SpriteRenderer>().sprite = Resources.Load<Sprite>(rtanName);
}
}
스프라이트는 모두 rtan + num 이 붙는다.
이 규칙을 이용하여 반복문으로 컴포넌트 스프라이트를 바꿔줄 수 있다.
string rtanName = "rtan" + rtans[i].ToString();
rtanName은 'rtan' 문자열과 리스트 [i]를 문자열로 바꾼 문자열들을 더하여 초기화한다.
i == 0 이라면, rtanName == rtan0
newCard.transform.Find("front")
card 하위오브젝트 front 오브젝트를 찾는다
GetComponent().sprite
컴포넌트안에 스프라이트에 접근한다
Resources.Load(rtanName);
폴더.스프라이트를 로드한다
firstCard.GetComponent<card>().destroyCard();
secondCard.GetComponent<card>().destroyCard();
게임오브젝트.GetComponent<스크립트이름>().함수();
게임오브젝트의 컴포넌트에 접근해서 card 스크립트내 함수를 사용하는 느낌으로 외우면 될듯하다.
오브젝트가 현재 몇개 남았는지 알수 있는 함수가 있다.
int 이름 = GameObject.Find("오브젝트명").transform.childCount;
이름에 현재 남아있는 오브젝트 수가 초기화 된다. 이번 게임엔 오브젝트 개수에 따라 게임 종료할 때 쓰지만, 예를 들어 왕관을 찾는 게임의 경우 왕관 의 남은 갯수를 표기할때라던가, 모으면 보스가 등장할 때 쓰기에도 좋을 듯 하다.