Carrot
본문 바로가기
Unity/멋쟁이사자처럼 부트캠프

[멋쟁이사자처럼부트캠프] 유니티 게임 개발 5기(13일차) - 핀볼 게임 및 애니메이션 활용

by 독기품은토끼 2025. 5. 29.
✅ 오늘의 학습 목표
1. 핀볼 게임 만들기
2. Door 애니메이션 적용

 

1. 핀볼 게임

🥕 예행 작업
1. Scene 생성 (Pinball)
2. Script 생성 (PinballManager)
3. 핀볼 오브젝트 만들기

 

1. 오브젝트

1.1. 핀볼 백그라운드 생성

 

1.2. 집게(?) 생성

집게를 할 삼각형 오브젝트를 생성한다.

이 집게가 움직여야 하므로 피봇용 빈 obj를 생성한 후 부모 자식 관계를 형성해 준다!

 

1.3. 콜라이더 및 리지드바디 적용

핀볼 백그라운드 - 엣지

집게 (빈오브제였던) - 리지드바디

삼각형 - 폴리곤

 

1.4. 볼 생성 및 컴포넌트 적용

 

1.5.  Hinge Joint 구현

 

힌지 조인트는 문이 회전하는 것처럼 하나의 축을 중심으로 회전을 하는 컴포넌트이다.

조인트의 피봇을 중심으로 빙글빙글 도는데 우리가 원하는 각도만 회전되도록 앵글값을 수정해 주면 된다.

using UnityEngine;

public class PinballManager : MonoBehaviour
{
    public Rigidbody2D leftBarRb;
    public Rigidbody2D rightBarRb;

    // Score 구현
    public int totalScore = 0;

    void Update()
    {
        if (Input.GetKey(KeyCode.LeftArrow))
        {
            leftBarRb.AddTorque(35f);
        }
        else
        {
            leftBarRb.AddTorque(-25f);
        }

        if (Input.GetKey(KeyCode.RightArrow))
        {
            rightBarRb.AddTorque(-35f);
        }
        else
        {
            rightBarRb.AddTorque(25f);
        }
    }
}

 

이제 저 경첩 역할을 하는 집게를 움직일 수 있도록 코드를 구현해 준다.

2. 디테일

어제 배운 피직스 머테리얼을 사용해 준다!

 

2.1. 피직스 머테리얼 2개 생성

 

2.2. 머테리얼 설정

 

2.3. 바운스를 잘 조절해 줘야 아래 같은 불상사가 안 일어남

 

3. 게임 플레이

3.1. 게임 오버용 오브젝트 생성

 

핀볼이 집게 밖으로 벗어나는 순간 게임 오버기 때문에 집게보다 아래에 세팅해 준다.

그리고 게임뷰에서 보일 필요 없으니 Sprite도 비활성화시키자

 

3.2. 게임 점수 관련 오브젝트 생성

 

핀볼이 특정 오브젝트에 닿으면 점수가 올라가는 코드를 구현하려고 한다.

먼저 오브젝트들을 먼저 세팅해 주고, 폴리곤 콜라이더를 추가해 주자.

 

그런 다음 각 오브젝트별로 점수를 다르게 설정하기 위해서 오브젝트에 태그를 달아준다.

  • 초록색 - 50점
  • 빨간색 - 30점
  • 파란색 - 10점

 

3.3. if문 VS switch문

이제 점수가 카운트 되도록 코드를 구현해 보자.

🥕 Script 생성 (Pinball)

 

수업에서는 if문과 switch문 두 가지를 사용해서 구현하였다.

if(other.gameObject.CompareTag("Score10"))
{
    pinballManager.totalScore += 10;
    Debug.Log("10점 획득");
} 
else if (other.gameObject.CompareTag("Score30"))
{
    pinballManager.totalScore += 30;
    Debug.Log("30점 획득");
}
else if (other.gameObject.CompareTag("Score50"))
{
    pinballManager.totalScore += 50;
    Debug.Log("50점 획득");
}
int score = 0;
switch (other.gameObject.tag)
{
    case "Score10":
        score = 10;
        break;
    case "Score30":
        score = 30;
        break;
    case "Score50":
        score = 50;
        break;
}
pinballManager.totalScore = score;
Debug.Log($"{score}점 획득!");

 

이제 해당 스크립트를 핀볼에 적용시켜 준다.

 

3.4. 결과

 

ㄷㄷ 내가 만들었는데 짱 못함.. ㅋ;;;ㅋ;ㅋ;;

 

2. 번외

핀볼씬 열심히 다 만들어놓고 이제 다른 실습하려고 새로운 씬 생성했는데

그전에 핀볼씬 막 건들다가 이상해져서 씬 저장 안함을 누르고 새로운 씬으로 이동해버림

???? 

예.. 씬 날아갔습니다 ㅋ

 

Temp 파일 있겠지 설마 설마 설마 이러면서 공포에 질려 열심히 폴더를 뒤졌음

 

정말!! 다행히도 백업 파일이 있었음 ㅠ

 

근데 이 백업 파일로 뭐 어캐해야하지? 하면서 서치하다가 

걍 "씬이름.unity" 으로 이름을 변경해 주면 끝이라 함! (완전 초초초간단..)

 

진짜 심장이 철렁쓰했다..

 

3. Animation

백업 작업 & 국취제 연락 때문에 수업 진도를 한 20분 동안 못 따라가고 있었다..

그래서 애니메이션 앞부분은 강사님이 어캐하신지 모름..

= 나 혼자 알잘딱깔센으로 한 거라 강사님이랑 다를 수 있음 주의 ^-^

🥕 예행 작업
1. Scene 생성 (DoorAnimation)
2. Script 생성 (DoorAnimation)
3. Asset 다운로드
 

Sci Fi Doors | 3D Sci-Fi | Unity Asset Store

Elevate your workflow with the Sci Fi Doors asset from MASH Virtual. Find this & other Sci-Fi options on the Unity Asset Store.

assetstore.unity.com

 

1. 오브젝트

1.1. 오브젝트 배치

 

다운로드 받은 오브젝트 중에 Gate_Small 오브젝트를 씬에 배치해 준다.

 

우리는 문 열리는 걸 구현하려는데

이 오브젝트는 프리팹이 적용된 오브젝트라 문을 회전시키면 원하는 위치에서 회전되지 않는다.

피봇 위치 때문에 그런데, 이럴 경우에는 빈 오브젝트를 생성해 주고 원하는 위치에 피봇 설정을 해주면 된다.

 

근데 프리팹은 새로운 오브젝트의 추가나 삭제 등 수정이 불가하다!

그래서 우리는 이 프리팹을 해제해서 사용하기로 한다.

 

1.2. 프리팹 수정

 

1.3. 피봇 재설정

 

Door Anchor이라는 빈 오브젝트를 생성하고 위치를 문 오브젝트 구석에 배치해 주었다.

 

2. 애니메이션 적용

2.1. 애니메이션 생성

 

Gate_Small 오브젝트를 클릭한 상태에서 Ctrl + 6 키를 누르면 애니메이션 창이 나타난다.

Create 버튼을 눌러서 새로운 애니메이션을 생성해 주면 녹화 버튼이 활성화된다.

 

녹화 버튼을 누른다!

 

2.2. Add Key

 

  • 첫 애니메이션 위치는 오브젝트 자체의 위치이기 때문에 Add Key를 눌러 해당 좌표값을 애니메이션에 삽입되도록 해준다.
  • 애니메이션 창에서 시간(프레임) 위치를 변경시켜 준 후
  • 문의 회전값을 설정해 준다.
  • 녹화를 종료한다.

2.3. 애니메이터 설정

애니메이션을 설정하면 계속 무한반복되고, 캐릭터가 앞으로 가야 문이 열리는데 무슨 귀신 자동문 마냥 계속 열린다.

이 부분을 보완해 주자!

우선 인스펙터 창에서 루프타임을 꺼준다.

이걸 끄면 무한 반복을 하지 않는다.

 

그다음 애니메이터 창에서 빈 곳에 오른쪽 클릭 하면 Empty를 생성한다.

(F키를 누르면 empty들 위치에 맞게 내 화면이 조절됨!)

 

[저것들이 뭔데?]

Entry 애니메이터 시작점
Any State 어떤 상태든 즉시 전이
Exit 애니메이터

 

지금 엔트리가 도어 오픈이라는 애니메이션을 바라보고 있기 때문에

우리가 의도하지 않은 상황에서도 문이 자꾸 열리는 거다.

 

그래서 새로 생성한 스테이트를 디폴트 값으로 바꾸어준다.

그러면 Entry가 이 스테이트를 바라볼 것이다! (= 만든 애니메이션 실행 안시킴)

 

우리가 원할 때 도어 오픈이 실행되어야 하니까 Any State를 Door Open에 연결해준다.

 

2.4 애니메이션 파라미터 생성

 

다시 애니메이션 창으로 돌아가서 파라미터를 생성해 주자

여기서 사용하는 Trigger는 기존에 배운 is트리거가 아니라 닿으면 반응하는(총의 방아쇠 같은) 역할을 한다.

 

이 파라미터를 인스펙터에 적용한다 해서 바로 문이 닫히고 열리고 구현되지 않음!!

이 파라미터를 활용해서 코드를 구현하자.

 

2.5. DoorEvent 코드 구현

using UnityEngine;

public class DoorEvent : MonoBehaviour
{
    private Animator animator;

    private void Start()
    {
        animator = GetComponent<Animator>();
    }

    private void OnTriggerEnter(Collider other)
    {
        animator.SetTrigger("Open");
    }

    private void OnTriggerExit(Collider other)
    {
        animator.SetTrigger("Close");
    }
}

 

아까 우리가 생성한 파라미터를 OnTrigger 메소드를 통해서 활용해 주면 우리가 원할 때 문이 열리고 닫힐 수 있다.

 

문이 닫히는 거는 스피드를 -1(역재생)로 설정해주어야 한다!

 

3. 콜라이더 설정

3.1. 콜라이더 설정

이제 캐릭터가 문 쪽으로 다가가면 문이 열리고, 닫혀야 하니까 문 오브젝트에 콜라이더를 추가해 주자.

 

Edit Collier를 클릭하면 우리가 원하는 모양으로 수정할 수 있다.

 

3.2. 캐릭터 넘어짐 해결

 

근데 문에 닿으면 자꾸 캐릭터가 넘어지니 Freeze Rotation 옵션을 건드려주자.

(활성화하면 X, Z축은 고정하겠다는 의미임!)

 

3.3. 결과

 

캐릭터에 콜라이더가 많아서..? 문이 약간 주춤거릴 수 있다 하셨다.

이 부분은 나중에 다 구현할 거라 하셨다!

 

 


 

 

내가 조퇴한 날.. 깃허브 레포를 프라이빗으로 바꾸는 작업을 하신 것 같다..

호호 나도 옮겨야 하는데 너무 귀찮다..... 나중에 더 후회하기 전에 옮길까..?

하지만 강사님이 리소스파일들 ignore 파일에 적용시켜서 계속 퍼블릭으로 해도 된다 하셨으니까.. 걍 그대로 살기로

나중에 나의 귀차니즘이 후회가 되면 뭐 쩔수지 ㅋㅎㅎ