스스로 논리와 전개 방식을 이해했는지 알아보기 위해 정리해보았습니다.
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 |