[공부] 2D 유니런(유니티+런) 게임 제작 - player 총합 (4)

2025. 8. 17. 22:05·✏️ 취미/코딩

스스로 논리와 전개 방식을 이해했는지 알아보기 위해 정리해보았습니다.

 

1. 발판

1) object에서 hierachy에 추가

 

2) 캐릭터가 아래로 떨어지지 않고 올라 타 있어야 함 

>> Box Collider 2D 추가

 

3) 단순한 벽은 코딩 필요하지 않음

2. 기본 셋팅

1) 필요한 클래스는 모두 미리 선언함

>> 사망 시 재생할 오디오 선언 / AudioClip 클래스 / Inspector에서 사운드 지정할 수 있게 public으로

(선언 만으로는 실제 사운드와 연결되지 않음. Inspector에서 실제 사운드를 지정해주어야 함)

(점프 시 사운드는 기본 Inspector에 적용할거라 별도로 선언하지 않음)

>> 점프 횟수를 통제하기 위해 jumpCount 선언 / int 클래스 / 2회 이상 점프할 수 없게 해야 함

>> 바닥에 닿았는지 여부 판단을 위해 / bool 클래스 / 바닥에서 떨어지면 애니메이션 실행 / 바닥에 닿으면 점프 횟수 초기화 

>> 죽었는지 여부 판단을 위해 / bool 클래스 / 죽으면 애니메이션 실행 / 죽지 않는 상태에서만 죽을 수 있게 설정(반복 죽는것 방지)

>> 플레이어에 적용될 물리엔진, 애니메이션, 오디오을 위해 별도의 Rigidbody, Animator, AudioSource 선언 

 

2) 선언한 클래스들이 바로 Inspector에 적용될 수 있게 private void Start 안에 GetComponent로 만들어 둠

굳이 외부에서 함수를 건들 이유가 없기에 public이 아닌 private 이용

    public AudioClip deathClip; // 사망시 재생할 오디오 클립
    public float jumpForce = 700f; // 점프 힘

    private int jumpCount = 0; // 누적 점프 횟수
    private bool isGrounded = false; // 바닥에 닿았는지 나타냄
    private bool isDead = false; // 사망 상태

    private Rigidbody2D playerRigidbody; // 사용할 리지드바디 컴포넌트
    private Animator animator; // 사용할 애니메이터 컴포넌트
    private AudioSource playerAudio; // 사용할 오디오 소스 컴포넌트


    private void Start()
    {
        playerRigidbody = GetComponent<Rigidbody2D>();
        animator = GetComponent<Animator>();
        playerAudio = GetComponent<AudioSource>();
    }
 

3. 데드 존

1) object에서 Create Empty로 추가함

 

2) 사이즈는 Scene 전체를 커버할 수 있게 길이 조정함

 

3) 캐릭터가 데드 존에 닿으면 죽게 해야 함

>> Box Collider 2D 추가함

>> 충돌하면 안되기에 Is Trigger 체크함

 

4) Tag에 Dead 추가함

>> 추후 코딩으로 Tag가 Dead인 것과 충돌하면 Die 함수 실행되게 처리

>> Die 함수 만들어야 함 (사망 시 보일 애니메이션, 사운드, 속도 등)

이 때 Die 함수가 실행되면, isDead = true;(죽은 상태)가 되게 바꿔야 함.

그렇지 않으면 한번만 죽어야 하는데, die 함수가 계속 반복하여 실행되는 문제 발생

 private void Die()
 {     
     animator.SetTrigger("Die");
     playerAudio.clip = deathClip;
     playerAudio.Play();
     playerRigidbody.linearVelocity = Vector2.zero;
     isDead = true;
 }

 

>> Die 함수가 실행될 조건 만들어야 함 (Tag가 Dead인 것과 충돌 && 죽지 않은 상태일 것)

InTrigger 상태인 데드 존과 닿아야 하기에, OnTriggerEnter2D 사용

 private void OnTriggerEnter2D(Collider2D other)
 {
     if (other.tag == "Dead" && !isDead)
     {
         Die();
     }
 }

4. 플레이어 애니메이션

1) Run, Jump, Die 각각의 방향을 설정함

>> Jump는 자주 쓰이기에 bool로 설정(발판에 발이 닿아있을 때를 기준으로 true/false로 판별)

>> Die는 한번만 쓰이기에 Trigger로 설정

 

2) Die는 어떤 상태에서라도 갈 수 있게 Any State >> Die

 

3) Run에서 Jump를 누르면 Jump 애니메이션이 실행되고 종료되면 다시 Run으로 돌아와야 하기에 서로 화살표

 

4) 바로바로 전환되어야 하기에 Has Exit Time은 설정하지 않음

 

5) Run >> Jump로 가는 진로에 Inspector - Conditions - Grounded - False 설정함. 반대의 경우엔 Grounded - True

>> 코딩으로 Jump할 때 Grounded가 False가 되게 해야 함

 private void Update()
 {
     if (isDead)
     {
         return;
     }

     if (Input.GetMouseButtonDown(0) && jumpCount < 2)
     {
         jumpCount++;
         playerRigidbody.linearVelocity = Vector2.zero;
         playerRigidbody.AddForce(new Vector2(0, jumpForce));
         playerAudio.Play();
     }

     else if (Input.GetMouseButtonUp(0) && playerRigidbody.linearVelocity.y > 0)
     {
         playerRigidbody.linearVelocity = playerRigidbody.linearVelocity * 0.5f;
     }

     animator.SetBool("Grounded", isGrounded);

 }

 

* 땅에 닿았는지를 판단하는 isGrounded 함수가 있고, Inspector - Conditions에 Groudned에 설정해두었더라도

Animator에는 별도로 입력을 해주어야 애니메이션이 작동된다.

따라서  animator.SetBool("Grounded", isGrounded); 가 필요함

 

**  private void Update() 안에 animator.SetBool("Grounded", isGrounded); 넣어서 

매 프레임마다 isGrounded를 판단해서 Jump 애니메이션 실행 여부를 판단

   private void OnCollisionEnter2D(Collision2D collision)
   {
       if (collision.contacts[0].normal.y > 0.7f)
       {
           isGrounded = true;
           jumpCount = 0;
       }
   }

   private void OnCollisionExit2D(Collision2D collision)
   {
       isGrounded = false;
   }

5. 플레이어 사운드 

1) 기본 달리는 상태에서는 아무 sound가 나지 않기에, 기본 사운드를 jump로 설정해둠

>> 코딩으로 jump가 실행될 때 별도의 AudioClip 없이 단순히 playerAudio.Play();로 실행 가능

(위위 박스의 빨간 글씨 참고)

 

2) 사망 시 나오는 sound는 코딩을 통해 AudioClip을 만들어서 별도로 추가함
>> Audioclip 클래스로 deadClip;을 선언(맨 위 참고)

>> playerAudio.clip = deathClip;으로 deathclip;이라는 빈 음악테이프를 가져옴
>> playerAudio.Play(); 로 deathclip;을 재생함. 그러나 deathclip;은 빈 음악테이프이기에 실제 음악을 넣어 주어야 함

>> Inspector의 player Controller에서 deathclip에 음악을 넣어줌

6. 플레이어 점프

1) 사망 상태면 점프할 수 없게 해야 함

>> if문으로 사망 시(isDead = false) 돌아가서(Return) 아무 일도 일어나지 않도록

 

2) 마우스 왼쪽 클릭 시 점프하지만,  2번 이상 하지 않게 해야 함

>> if문으로 GetMouseButtonDown(0)으로 마우스 왼쪽 클릭(Input) + 점프가 2번 미만일 때 

점프 횟수를 1번 늘려서 2번 이상 점프하지 못하게 하고(0 >> 1)

Rigidbody(물리)에 linearVelocity(속력)을 Vector2.zero;(정지 상태)로 설정해서 일단 가속도나 변동을 없애고

Rigidbody(물리)에 AddForce(힘)을 주어 Vector2(0, jumpforce)만큼 움직이게 함. jumpforce는 최초에 선언해두었음

그리고 마지막으로 점프 오디오를 재생하게 함

 if (Input.GetMouseButtonDown(0) && jumpCount < 2)
     {
         jumpCount++;
         playerRigidbody.linearVelocity = Vector2.zero;
         playerRigidbody.AddForce(new Vector2(0, jumpForce));
         playerAudio.Play();
     }

 

3) 마우스를 오래 누르고 있을 수록 점프력을 유지하고, 마우스를 때면 점프력이 감소하게 해야 함

>>  if문으로 GetMouseButtonup(0)으로 마우스 왼쪽 클릭을 때어낸걸 인식했을 때(Input)  && 위로 점프 중일 때(y축이 0 이상)

Rigidbody(물리)에 기존 속도를 0.5배 곱하게 적용.

    else if (Input.GetMouseButtonUp(0) && playerRigidbody.linearVelocity.y > 0)
    {
        playerRigidbody.linearVelocity = playerRigidbody.linearVelocity * 0.5f;
    }

 

4) 발판에 닿으면 점프횟수를 0으로 초기화해줘야 함. 안그러면 jumpcount가 1이 되어 더 이상 점프를 할 수 없음

>> Box Collider 상태인 발판과 닿아야 하기에, OnCollisionEnter2D 함수 사용

>> isGrounded = true;로 만들어 jump >> Run으로 애니메이션이 돌아오게 만듦

( private void Update()  안에 animator.SetBool("Grounded", isGrounded);를 두어 매 프레임마다 판단토록 함)

>> jumpCount = 0;으로 만들어서 초기화

 private void OnCollisionEnter2D(Collision2D collision)
 {
     if (collision.contacts[0].normal.y > 0.7f)
     {
         isGrounded = true;
         jumpCount = 0;
     }
 }

 

5) 발판에서 발이 떨어지면 isGrounded = false;로 만들어 Run>>jump 애니메이션으로 바꿀 수 있게 함수 만들어야 함

>> Box Collider 상태인 발판과 닿지 않아야 하기에, OnCollisionExit2D 함수 사용

    private void OnCollisionExit2D(Collision2D collision)
    {
        isGrounded = false;
    }
}

 

저작자표시 비영리 변경금지 (새창열림)

'✏️ 취미 > 코딩' 카테고리의 다른 글

[C#] Text Rpg 예시  (0) 2025.09.03
[공부] 2D 유니런(유니티+런) 게임 제작 - 배경 (5)  (3) 2025.08.19
[공부] 2D 유니런(유니티+런) 게임 제작 - (3)  (2) 2025.08.17
[공부] 2D 유니런(유니티+런) 게임 제작 - (2)  (3) 2025.08.17
[공부] 2D 유니런(유니티+런) 게임 제작 - (1)  (3) 2025.08.16
'✏️ 취미/코딩' 카테고리의 다른 글
  • [C#] Text Rpg 예시
  • [공부] 2D 유니런(유니티+런) 게임 제작 - 배경 (5)
  • [공부] 2D 유니런(유니티+런) 게임 제작 - (3)
  • [공부] 2D 유니런(유니티+런) 게임 제작 - (2)
9년차 세무사 / 취미 기록
9년차 세무사 / 취미 기록
📌하이엔드 세무회계 조진혁 대표세무사 🏡 서울특별시 강남구 테헤란로70길 13, 7층(선릉) 📞 상담 문의 010-3463-7897 / 02-565-7897
  • 9년차 세무사 / 취미 기록
    스타트업 옆 세무사
    9년차 세무사 / 취미 기록
  • 전체
    오늘
    어제
  • 링크

    • 공식 홈페이지
    • 카카오톡 채널 상담
    • 네이버 지도
  • 공지사항

    • 📌 세무기장 후기 모음
    • 📌 조진혁 세무사 소개
    • 📌 세무사가 필요한 경우 / 수수료
    • 카테고리 (76)
      • 🌳 스타트업 칼럼 (38)
        • IT·앱·게임 개발사 (20)
        • 디자인·영상 제작사 (7)
        • 전문직 (4)
        • 다양한 스타트업 (7)
      • 📋 세무·회계·HR 칼럼 (15)
        • 법인 세무 (9)
        • 예규 판례 (5)
        • 회계 (0)
        • 인사 노무 근로기준법 (1)
      • 📂 자료·노션 템플릿 공유 (4)
      • ✏️ 취미 (19)
        • 코딩 (12)
        • 일본어 (6)
        • 농구 (1)
  • 최근 글

  • 04-02 15:46
  • hELLO· Designed By정상우.v4.10.4
9년차 세무사 / 취미 기록
[공부] 2D 유니런(유니티+런) 게임 제작 - player 총합 (4)
상단으로

티스토리툴바