저처럼 코드 입력하기 싫고 실행을 해보고 싶은 분들,
Ctrl+C, Ctrl+V 복사 붙여넣기 해서 사용하세요.
한 번 실행해 보면 유니티 구조적 이해에 많은 도움됩니다.
김치런 튜토리얼 영상 링크
https://www.youtube.com/watch?v=A58_FWqiekI
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Player : MonoBehaviour
{
[Header("Settings")]
public float JumpForce; // 점프 시 적용될 힘의 크기
[Header("References")]
public Rigidbody2D PlayRigidbody; // 플레이어의 Rigidbody2D 컴포넌트
private bool isGrounded = true; // 플레이어가 땅에 닿아 있는지 여부
public Animator PlayerAnimator; // 플레이어 애니메이터
public bool isInvincible = false; // 무적 상태 여부
public BoxCollider2D PlayerCollider; // 플레이어의 충돌체
// Start is called before the first frame update
void Start()
{
// 초기화 코드 (현재는 비어 있음)
}
// Update is called once per frame
void Update()
{
// 스페이스바를 눌렀고, 플레이어가 땅에 닿아 있는 경우 점프
if (Input.GetKeyDown(KeyCode.Space) && isGrounded) {
//PlayRigidbody.linearVelocityX = 10;//실험용
//PlayRigidbody.linearVelocityY = 20;//실험용
//PlayRigidbody.velocity = new Vector2(3, 6);//실험용
//PlayRigidbody.AddForceY(JumpForce, ForceMode2d.Impulse );//유니티 6 용
// Rigidbody2D에 위쪽으로 힘을 가해 점프
PlayRigidbody.AddForce(new Vector2(0f, JumpForce), ForceMode2D.Impulse);
isGrounded = false; // 점프 후 땅에 닿아있지 않은 상태로 설정
PlayerAnimator.SetInteger("state", 1); // 점프 애니메이션 트리거
}
}
// 충돌이 감지되었을 때 호출
private void OnCollisionEnter2D(Collision2D other) {
// 플레이어가 "Platform"에 닿으면
if (other.gameObject.name == "Platform") {
if (!isGrounded) {
PlayerAnimator.SetInteger("state", 2); // 착지 애니메이션 트리거
}
isGrounded = true; // 땅에 닿아있음으로 설정
}
}
// 플레이어가 적과 충돌했을 때 호출 (목숨 감소)
void Hit() {
GameManager.Instance.lives -= 1; // 목숨 1 감소
}
// 플레이어가 음식을 먹었을 때 호출 (목숨 회복)
void Heal() {
// 목숨을 최대 3까지 회복
GameManager.Instance.lives = Mathf.Min(3, GameManager.Instance.lives + 1);
}
// 플레이어가 황금을 획득하면 무적 상태 활성화
void StartInvincible() {
isInvincible = true; // 무적 상태 활성화
Invoke("StoptInvincible", 5f); // 5초 후 무적 상태 해제
}
// 무적 상태 해제
void StoptInvincible() {
isInvincible = false;
}
// 플레이어가 죽었을 때 처리
public void KillPlayer() {
PlayerCollider.enabled = false; // 충돌체 비활성화
PlayerAnimator.enabled = false; // 애니메이터 비활성화
PlayRigidbody.AddForce(new Vector2(0f, JumpForce), ForceMode2D.Impulse); // 마지막 점프 효과
}
// 플레이어가 트리거 영역에 들어갔을 때 호출
private void OnTriggerEnter2D(Collider2D other) {
// 적과 충돌했을 때
if (other.gameObject.tag == "enemy") {
if (!isInvincible) {
Destroy(other.gameObject); // 적 객체 제거
Hit(); // 목숨 감소
}
}
// 음식과 충돌했을 때
else if (other.gameObject.tag == "food") {
Destroy(other.gameObject); // 음식 객체 제거
Heal(); // 목숨 회복
}
// 황금과 충돌했을 때
else if (other.gameObject.tag == "golden") {
Destroy(other.gameObject); // 황금 객체 제거
StartInvincible(); // 무적 상태 활성화
}
}
}
코드 구조 및 주요 기능
플레이어 점프 처리:
Update()
에서 스페이스바 입력 감지 후,Rigidbody2D
에 위쪽으로 힘을 가해 점프.isGrounded
를 이용해 플레이어가 땅에 닿아있을 때만 점프 가능.
애니메이션 제어:
PlayerAnimator
를 사용해 점프(1) 및 착지(2) 상태에 따른 애니메이션 트리거.
충돌 처리:
OnCollisionEnter2D
: "Platform"과 충돌 시 착지 처리.OnTriggerEnter2D
: 적, 음식, 황금과의 충돌을 처리하여 각각 목숨 감소, 회복, 무적 상태 부여.
게임 상태 관리:
Hit()
및Heal()
함수로GameManager
의lives
값을 조작.- 무적 상태(
isInvincible
)를 5초 동안 유지하도록 구현.
플레이어 사망 처리:
KillPlayer()
로 충돌체와 애니메이션을 비활성화하고 마지막 점프 효과를 부여.
개선 가능성
애니메이션 상태 관리 개선:
- 애니메이션 상태를 숫자가 아닌 열거형(Enum)으로 관리하면 가독성 향상.
코드 중복 제거:
OnTriggerEnter2D
내에서Destroy()
와 상태 변경 코드를 함수화하여 중복을 줄일 수 있음.
에러 처리:
GameManager.Instance
가 null일 경우를 대비한 에러 처리 필요.
물리 기반 코드:
- 점프 로직에서
PlayRigidbody.velocity
를 직접 설정해 물리적 결과를 더 세밀히 제어 가능.
- 점프 로직에서
댓글 없음:
댓글 쓰기