Post

Unity 1차 미니 프로젝트 - 3

해당 내용의 전부는 학원에서 배우는 것이기 때문에 공개가 어렵습니다.

해당 내용의 자세한 강의가 필요하신 분들은 이곳에서 확인하시면 됩니다.

2023-11-01 TIL

현재 제작중인 게임은 팀원들과 함께 제작되고 있음으로 첫 문제점으로 잡은 것을 다 다룰수 없을거 같습니다.

알고리즘 문제

오늘의 알고리즘 문제 : 평균 구하기

정수를 담고 있는 배열 arr의 평균값을 return하는 함수, solution을 완성해보세요.

1
2
3
4
5
6
public class Solution {
    public double solution(int[] arr) {
        double answer = 0;
        return answer;
    }
}

해결

작성자는 이렇게 풀었습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
public class Solution {
    public double solution(int[] arr) {
        double answer = 0;

for (int i = 0; i < arr.Length; i++)
{
    answer += arr[i];
}
answer = answer / arr.Length;

        return answer;
    }
}

배열의 길이만큼 for문을 돌려 해당 배열의 모든 값을 더해 answer변수에 저장합니다.
그후 answer변수를 배열의 길이만큼 나누면 평균이 구해집니다.

하지만 해당 코드보다 더 좋은 방법이 있었습니다. 바로 C#에서 지원해주는 메서드 .Average을 사용하는 것입니다.

1
2
3
4
5
6
using System.Linq;
public class Solution {
    public double solution(int[] arr) {
        return arr.Average();
    }
}

배열뒤에 해당 메서드를 사용하면 더욱 직관적이고 가독성이 좋은 코드를 만들수 있습니다.

카드 페어 맞출시 해당 카드의 이름 띄어주기 문제

본론으로 넘어와서 코드를 짜기전 모습입니다. Desktop View 카드가 맞춰졌는데 뭔가 많이 심심하게 보입니다.
여기에서 카드를 맞출시 해당 카드 2개에서 이름이 뜨게해보려고 합니다.
코드의 일부분입니다.


  1. Card.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
public class Card : MonoBehaviour
{

    //등장하는 사람의 이름을 담아놓은 배열
    string[] imgName = { "사람1", "사람2", "사람3", "사람4", "사람5" };
    void Start()
    {
        //조커 판별을 위한 이름 받아와 끝 수자리만 int 값으로 만들기
        joker = gameObject.transform.Find("Front").GetComponent<SpriteRenderer>().sprite.name;
        jokerCheck = int.Parse(joker.Substring(joker.Length - 1));
        cardName.text = imgName[jokerCheck % 5];
    }
    public void openCard()
    {
        anim.SetBool("isOpen", true);
        transform.Find("Front").gameObject.SetActive(true);
        transform.Find("Back").gameObject.SetActive(false);




        //조커의 규칙인 5로 나누면 4가 나올 때 시간 줄이기
        if(jokerCheck%5== 4)
        {
            GameManager.Instance.time -= 3.0f;
        }

        if (GameManager.Instance.firstCard == null)
        {
            GameManager.Instance.firstCard = gameObject;
        }
        else
        {
            GameManager.Instance.secondCard = gameObject;
            GameManager.Instance.cardMatched();
        }
    }

    void NameCheck()
    {
        cardName.text = imgName[jokerCheck];
        anim.SetBool("isFair", true);
    }

    public void DestroyCard()
    {
        NameCheck();
        Invoke("DestroyCardInvoke", 0.5f);
    }

    void DestroyCardInvoke()
    {
        Destroy(gameObject);
    }
}

Desktop View

  1. GameManager.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
public class GameManager : SingletonMonoBase<GameManager>
{
    public void CardMatched()
    {
        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<MemberCard>().DestroyCard();
            secondCard.GetComponent<MemberCard>().DestroyCard();

            //카드 판별과 마찬가지로 나머지 값이 4일 때만 게임 종료
            if (int.Parse(secondCardImage.Substring(secondCardImage.Length - 1)) % 5 == 4 &&
                int.Parse(firstCardImage.Substring(firstCardImage.Length - 1)) % 5 == 4)
            {
                GameManager.Instance.GameOver();
            }
        }
        else
        {
            firstCard.GetComponent<MemberCard>().CloseCard();
            secondCard.GetComponent<MemberCard>().CloseCard();
        }

        firstCard = null;
        secondCard = null;

        // 카드 매치 시도 횟수
        this.TryTextUpdate();
    }
}

이렇게 했더니 카드를 맞췄을 때 일부카드는 오류가 뜨기 시작했습니다.

Desktop View

해결

cardName.text = imgName[jokerCheck]; 이코드가 문제였습니다.
고민을 해보았고 번역기를 돌려확인해본 결과 배열의 크기보다 더 큰 값은 안된다고 합니다.
아차 저렇게 되면 이미지의 숫자가 클수록 안되는구나…
그래서 cardName.text = imgName[jokerCheck]; -> cardName.text = imgName[jokerCheck%5]; 나머지 숫자로 규칙을 만들어 했습니다.
현재 저희 5명의 사진은 순서대로 1,2,3,4,5 순으로 로테이션 되어 나옵니다. 그래서 나머지 연산을 사용하여 로테이션대로 잘 나오게 만들었습니다.

Desktop View

잘 나오는걸 확인할수 있습니다.

Desktop View

오늘의 정리

알고리즘 문제를 풀며 자체 메서드의 중요성을 잘 알았고 또한 코드를 짤 때 항상 하나가 아닌 열을 봐야한다는 것을 알았다.
조금 익숙해졌다고 안일해지기 보다는 좀더 꼼꼼히 좀더 자세히 찾아보고 나중을 위한 코드는 좀더 보기 쉽고 사용하기 쉽게 두어야 한다고 생각했다.

Desktop View

This post is licensed under CC BY 4.0 by the author.