2023/07/21 TIL

김도현·2023년 7월 21일
0

TIL

목록 보기
4/76

금일 한 것

[스파르타코딩클럽] 게임개발 종합반 - 4주차-르탄이 카드 뒤집기 게임!

금일 배운 것

1. Unity

(1). 카메라 사이즈 대신 이미지 사이즈 조절하기

Pixels Per Unit(단위당 픽셀)을 조절해 이미지 크기 조절(클수록 사이즈가 작아짐, 기본값 100)

(2). 이미지 스케일로 크기 조절


기본적으로는 너비, 높이로 조절하였지만 스케일의 x,y,z로 조절도 가능

(3).상위(부모)에서 조절


이처럼 젤 상위 Object에서 값을 조절시 하위 Object에서도 영향을 받음
(예 상위인 card스케일을 1.3으로 하였을시 하위 front에서는 스케일 값이 1이지만 실제 크기는 1.3이다) -> 기준이 상위값이라고 생각한다.
(증명 : card의 포지션이 0,1,0일 때 front의 포지션은 0,0,0으로 기록되지만 실제 위치는 0,1,0이다. 그리고 front에서 0,1,0으로 변경시 실제 위치는 0,2,0이다)

(4).Main Camera의 위치

기본적으로 만들어져 있는 카메라의 초기값은 0,0,-10이다. 하지만 초기화시 0,0,0이 되며 이러면 내가 만든 Object와 위상 위치가 같아 보이지 않는다.(오브젝트 위치가 X,Y,0
정상

초기화 후

(5).이미지를 선언없이 사용하는 방법

원래 image는 Images폴더에 저장하였지만 Resources에 gameManager에서 별도 선언없이 바로 사용가능

2.C#

(1).카드 클릭시 애니메이션 전환

  anim.SetBool("isOpen", true);
  transform.Find("front").gameObject.SetActive(true);
  transform.Find("back").gameObject.SetActive(false);

(2).카드비교

        if (gameManager.I.firstCard == null)
        {
            gameManager.I.firstCard = gameObject;
        }
        else
        {
            gameManager.I.secondCard = gameObject;
            gameManager.I.isMatched();
        }

(3)카드 비교 이후 삭제 또는 다시 덮기

    public void destroyCard()
    {
        Invoke("destroyCardInvoke", 1.0f);
    }

    void destroyCardInvoke()
    {
        Destroy(gameObject);
    }

    public void closeCard()
    {
        Invoke("closeCardInvoke", 0.5f);
    }

    void closeCardInvoke()
    {
        anim.SetBool("isOpen", false);
        transform.Find("back").gameObject.SetActive(true);
        transform.Find("front").gameObject.SetActive(false);
    }

(4)gameManager에서 카드 배치

    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 : 정렬해라, item : (?)안에 든 값을
       
        for (int i = 0; i < 16; i++) //16장의 카드 배치
        {
            GameObject newCard  = Instantiate(card); // 생성된 카드는 newCard라고 호칭
            newCard.transform.parent = GameObject.Find("cards").transform; // newCard의 부모(상위폴더) = card라는 이름의 GameObject의 값(transform)
            float x = (i / 4) * 1.4f - 2.1f;
            float y = (i % 4) * 1.4f - 3.0f;
            newCard.transform.position = new Vector3(x, y, 0);
			
            //이미지 분배
            string rtanName = "rtan" + rtans[i].ToString();
            newCard.transform.Find("front").GetComponent<SpriteRenderer>().sprite = Resources.Load<Sprite>(rtanName);
        }
    }

(5)gameManager에서 card 비교

    public void isMatched() //카드 비교
    {
    	//각 변수에 이미지 명을 넣어줌
        string firstCardImage = firstCard.transform.Find("front").GetComponent<SpriteRenderer>().sprite.name;
        string secondCardImage = secondCard.transform.Find("front").GetComponent<SpriteRenderer>().sprite.name;
		
        if (firstCardImage == secondCardImage) //이미지명 비교
        {
            firstCard.GetComponent<card>().destroyCard();
            secondCard.GetComponent<card>().destroyCard();

            int cardsLeft = GameObject.Find("cards").transform.childCount;
            if (cardsLeft == 2) //2개를 비교할 때 2개 남으면 마지막임
            {
                Invoke("GameEnd",1f);
            }
        }
        else
        {
            firstCard.GetComponent <card>().closeCard();
            secondCard.GetComponent<card>().closeCard();
        }
		//다시 반복할 수 있도록 초기화
        firstCard = null;
        secondCard = null;
    }

(6)gameManager에 새로 사용된 것

using System.Linq; // c#에 통합된 데이터 질의 기능(Language Integrated Query) SQL와 같은 Query언어를 사용할 수 있음

느낀점
이번에는 새로 배운 것이 많고 복잡하여 어려웠다.. 익숙해지려면 많은 반복을 해야 할 것 같다.
gif에 소스코드 알집이 있습니다.

0개의 댓글