내일배움캠프 Unity [2023.12.22]TIL

응징·2023년 12월 22일
0

TIL

목록 보기
2/36
post-thumbnail

이미지 크기 변경

이미지 사이즈가 맞지 않을땐 두가지 방법으로 사이즈를 맞출 수 있는데 첫번째는 저번에 했듯이 카메라를 멀리 떨어트리는 것이고 두번째 방법은 이미지 픽셀을 줄이는 것이다

이미지를 누르면 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;

이름에 현재 남아있는 오브젝트 수가 초기화 된다. 이번 게임엔 오브젝트 개수에 따라 게임 종료할 때 쓰지만, 예를 들어 왕관을 찾는 게임의 경우 왕관 의 남은 갯수를 표기할때라던가, 모으면 보스가 등장할 때 쓰기에도 좋을 듯 하다.

profile
Unity 개발 위주로 정리합니다

0개의 댓글