Unity

[내일배움캠프 사전캠프] + 칼 피하는 르탄 완성, 4강

옹즤 2025. 4. 2. 18:07

1. 오늘 학습 한 내용
- 오목 관련 팀 회의

- 칼 피하는 르탄이 완성

- 사전캠프 강의 4-3까지 학습

- C# 달리기반 '기초 문법 톺아보기' 학습

2. 학습하며 겪었던 문제점 & 에러
- 아래에서 후술할 '칼 피하는 르탄이' 제작 과정에서 일부 이슈가 존재했다.


3. 다음에 학습 할 것은 무엇인지
- C# 달리기반 문법 학습 마무리

- 사전 캠프 4강 마무리

4. 칼 피하는 르탄이

결과적으로 처음에 의도했던대로 게임이 작동하였다.

조작감 부분에서 별로라는 느낌이 들어 계속해서 속도가 적용되는 부분을 '키를 누른 상태에서만' 작동하게

속도값을 초기화 해줄 수 있도록 바꾸어서 많이 개선되었다.

제작을 하면서 2가지 큰 문제가 발생했었다.

1) 게임 오버 후 RetryButton을 눌러 재시작 후 다시 게임 오버가 되었을 때 RetryButton이 뜨지 않는 문제

2) 인스턴스 값을 받아오지 못하는 문제

 

위의 2가지 문제 때문에 시간적인 소모가 좀 있었다.

원인은 간단했는데

1)의 경우 RetryButton에서 "MainScene" 을 불러온다고 세팅해놓았으나, 정작 Unity에서 Scene 이름이 SampleScene인 상태여서 기능하지 않았었다.

2)의 경우 인스턴스 선언을 instance라고 해놓고 정작 사용은 Instance로 하여 대소문자 이슈로 문제가 있었다.

 

제작 후 이슈도 발견했는데

칼이 생성되면서 서로 부딪혀서 기울어진 상태에서 떨어지는 문제가 확인되었다.

게임 진행 자체에는 큰 문제는 없으나 시각적 디테일은 많이 떨어져보이는 문제가 발생했다.

목적이 복습의 목적이었기에 이 부분에 대해선 수정하지 않고 그냥 두기로 했으나, 이후 분명히 비슷한 문제를 만날 수 있기 때문에 해결 방법을 찾아두었다.

더보기

🚀 Prefab 오브젝트들이 서로 영향을 주지 않게 하기

🔍 문제 상황:

프리팹으로 생성된 오브젝트들이 같은 위치에 생성될 때, 충돌(Collision) 때문에 서로 튕기거나 예상치 못한 동작을 함.

✅ 해결 방법 3가지


1️⃣ Physics2D.IgnoreCollision() 사용 (가장 추천)

📌 특정 오브젝트들끼리 충돌을 무시하는 방법

🔹 구현 방법

void Start()
{
    GameObject[] objects = GameObject.FindGameObjectsWithTag("PrefabObject");
    foreach (GameObject obj in objects)
    {
        if (obj != gameObject) // 자기 자신은 제외
        {
            Physics2D.IgnoreCollision(GetComponent<Collider2D>(), obj.GetComponent<Collider2D>());
        }
    }
}

🎯 효과:
✔ 같은 Tag를 가진 프리팹들끼리 충돌 무시
✔ Start()에서 실행되므로 성능에 부담 없음


2️⃣ Layer를 이용한 충돌 무시 (Inspector 설정 필요)

📌 레이어를 활용하여 특정 그룹끼리 충돌을 방지하는 방법

🔹 설정 방법

  1. 프리팹에 새로운 Layer를 추가
    • Unity 상단 메뉴 → Edit → Project Settings → Physics2D 로 이동
    • Layer Collision Matrix에서 프리팹끼리 충돌하지 않도록 설정
  2. 코드에서 Layer를 변경 가능
gameObject.layer = LayerMask.NameToLayer("IgnoreCollision");

🎯 효과:
✔ Inspector에서 미리 설정 가능
✔ 코드 없이 Unity UI에서 쉽게 조정 가능


3️⃣ 랜덤 위치 조정 (중첩 방지)

📌 같은 위치에 겹쳐서 생성되는 걸 사전에 방지

🔹 구현 방법

Vector3 randomPos;
do
{
    randomPos = new Vector3(Random.Range(-5f, 5f), Random.Range(-5f, 5f), 0f);
} while (Physics2D.OverlapCircle(randomPos, 0.5f) != null); // 충돌이 감지되면 다시 위치 선정

Instantiate(prefab, randomPos, Quaternion.identity);

🎯 효과:
✔ 처음부터 충돌 없이 배치
✔ 추가적인 IgnoreCollision() 설정 없이 해결


🔚 결론 (추천 방법)

방법 장점 단점
Physics2D.IgnoreCollision() 프리팹끼리 충돌을 무시 (가장 효율적) 한 번만 실행해야 함
Layer 충돌 무시 Unity UI에서 쉽게 설정 Layer 관리 필요
랜덤 위치 배치 애초에 겹치지 않도록 생성 완벽한 해결책은 아님

👉 내 추천:
✔ 충돌을 완전히 무시하려면 Physics2D.IgnoreCollision() 사용
✔ 특정 그룹끼리만 충돌 제거하려면 Layer 설정
✔ 같은 공간에 겹쳐서 생성되는 걸 방지하려면 랜덤 위치 조정

5. 오목 팀 기획

팀원들과 함께 개개인의 오목 관련 개인 기획에 대해 발표하고 그에 대한 Q&A 시간을 가진 후 가장 괜찮고 발전시키고 싶은 기획을 하나 뽑아 그것을 토대로 최종 팀 오목 기획서를 작성하였다.

기획이란 것이 나의 아이디어를 어떤 의도와 목적을 가졌는지, 상대방을 얼마나 잘 납득시킬 수 있는지 상당히 중요하다고 생각되는 부분이기에 이것을 연습하기 위해 팀원끼리 모두 동의하여 진행을 하였다.

전반적으로 다른 팀원분들의 기획을 보며 다양한 아이디어가 있다는 것을 확인할 수 있는 부분과

나의 기획적인 아이디어를 잘 정리해보는 시간을 가질 수 있었다.

 

6. 카드 뒤집기

 

for문을 활용하여 카드를 16개를 반복시킨 후

그 for문 안에서 x, y좌표를 설정하여 4x4 모양으로 펼치는 부분까지 따라 구현했다.

아직까진 크게 막히는 부분은 없었고 4번째 반복을 하다보니 이해가 어려운 부분도 없었다.