2025년 1월 6일 월요일

1. 김치런 게임 Player .cs 소스코드

저처럼 코드 입력하기 싫고 실행을 해보고 싶은 분들,
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(); // 무적 상태 활성화
        }
    }
}

        

코드 구조 및 주요 기능

  1. 플레이어 점프 처리:

    • Update()에서 스페이스바 입력 감지 후, Rigidbody2D에 위쪽으로 힘을 가해 점프.
    • isGrounded를 이용해 플레이어가 땅에 닿아있을 때만 점프 가능.
  2. 애니메이션 제어:

    • PlayerAnimator를 사용해 점프(1) 및 착지(2) 상태에 따른 애니메이션 트리거.
  3. 충돌 처리:

    • OnCollisionEnter2D: "Platform"과 충돌 시 착지 처리.
    • OnTriggerEnter2D: 적, 음식, 황금과의 충돌을 처리하여 각각 목숨 감소, 회복, 무적 상태 부여.
  4. 게임 상태 관리:

    • Hit()Heal() 함수로 GameManagerlives 값을 조작.
    • 무적 상태(isInvincible)를 5초 동안 유지하도록 구현.
  5. 플레이어 사망 처리:

    • KillPlayer()로 충돌체와 애니메이션을 비활성화하고 마지막 점프 효과를 부여.

개선 가능성

  1. 애니메이션 상태 관리 개선:

    • 애니메이션 상태를 숫자가 아닌 열거형(Enum)으로 관리하면 가독성 향상.
  2. 코드 중복 제거:

    • OnTriggerEnter2D 내에서 Destroy()와 상태 변경 코드를 함수화하여 중복을 줄일 수 있음.
  3. 에러 처리:

    • GameManager.Instance가 null일 경우를 대비한 에러 처리 필요.
  4. 물리 기반 코드:

    • 점프 로직에서 PlayRigidbody.velocity를 직접 설정해 물리적 결과를 더 세밀히 제어 가능.

댓글 없음:

댓글 쓰기

-


Sidewinder


World


FishMusic


LaughingBaby