[1~4주: 구현력 확보] 1주차 - 1일, Enemy 마무리

2025. 12. 9. 05:00·기타/24주 게임 프로그래밍 챌린지

[1주차와 서론]

우선 구현력이 너무 안좋아서 미니게임 천국의 무찔무찔 게임을 비슷하게 구현하는 연습부터 시작하기로 했다.

직접 기획을 할 시간이 많지 않기도 하고 능력 문제도 있지만 무엇보다도

평소 좋아하는 게임이라 자연스럽게 먼저 만들고 싶어졌던 것 같다.

 

처음에는 맨땅에 해딩하듯 그냥 Gemini가 짜준 로드맵대로 만들려 했다.

진행할 수록 너무 모르는 게 많아서... 점차 AI의 코드에 의존하듯 질문없이 진행되는 것 같아서 위기감을 느꼈다.

하지만 직접 하려니 아무것도 손 댈 수 없어서 주변에 조언을 구했더니 기획 단계를 탄탄하게 해보라는 얘기를 듣게 되었다.

 

기획 내용과 과정은 아래 노션에 있다.

기획서: https://www.notion.so/2c3b1d07a04a806b8e37e4b6a441e82e?source=copy_link

 

1주차를 어영부영 보낸 지금, 2주차 부터는 본격적으로 게임 구성에 들어간다.

1주차에는 GetComponent의 사용과 변수 만들기 정도만 습득했다.

이제부터는 종이에 해딩하기다. (1주차 과정을 했으니 종이로 승격) 

 

[본문: 1일차 Enemy 마무리]

① Enemy HP 시스템 만들기 →

② 데미지 처리 만들기 →
③ 피격 리액션 만들기 →
④ 죽는 로직 만들기 →
⑤ Wave Spawner 전환

 

 

[1. Enemy HP 시스템 만들기]

[1번 질문]: 왜 선언부에서 GetComponent를 못 쓸까?

using UnityEngine;

public class Enemy : MonoBehaviour
{
    SpriteRenderer sr; //(1)번 위치
    private int maxHp = 30;
    private int currentHP;
 
    void Start()
    {
        sr = GetComponent //(2)번 위치
    }
}

 

(1)번 위치는 기본값이나 상수로 초기화하는 공간, 변수 선언 공간이다 
그리고 (1)번 위치에서 만약 한다면 컴포넌트, 오브젝트가 준비가 안된 시점에서 부름을 당하기 때문에 오류가 날 것이다!
이건 유니티 라이프사이클과 관련된 것 같아서 나중에 공부하기로 했다

뭐가 너무 많아!

[2번 질문]: 코루틴은 무엇인가?

    public void TakeDamage(int damage)
    {
        currentHP -= damage;

        StartCoroutine(HitFlash());
        
        if (currentHP <= 0)
        {
            Die();
        }
    }

함수가 띡. 하고 실행되고 끝나는 게 아니라 멈췄다가 다시 실행하는 걸 코루틴이라고 한다.

멈추는 시간은 yield return 으로 조정이 가능하다.

그리고 또한 "메인 스레드에서 실행되지만, 메인 스레드를 막지 않는다"

 

이건 무슨 말일까 싶어서 스레드에 대해서도 물어봤다.

스레드는 각각의 작업자이다.

모든 프로그램은 하나 이상의 스레드를 가지고 있다.

즉 그 이상의 스레드도 가질 수 있다. (멀티스레딩, 아주 효율적임)

 

그 중 메인스레드는 프로그램 실행 시 가장 먼저 생성되고 가장 핵심을 작업하는 스레드이다.

유니티는 대부분의 작업을 안정성을 위해 메인스레드에서 작업하는 걸 권장한다고 한다.

그렇다면 언제 멀티스레딩을 써야하는지도 다음에 알아봐야겠다.

 

이 코드에서 코루틴을 써야하는 이유는

몬스터가 플레이어에게 피격 시 깜빡이는 효과를 0.5초마다 넣기 위함이다.

게임 흐름을 방해하지 않으면서도 0.5초를 멈추려면 이 기능을 사용하면 좋다!

 

코루틴의 사용 방법은 다음과 같다

 

  • 반환 타입: 함수의 반환 타입을 **IEnumerator**로 지정합니다.
  • 실행 시작: **StartCoroutine(코루틴할 함수 이름)**을 통해 실행합니다.
  • 일시 정지: 함수 내부에서 yield return 키워드를 사용하여 일시 정지 지점을 지정합니다. (예: yield return new WaitForSeconds(0.5f);)

[3번 질문]: OnTriggerEnter2D란 무엇인가?

 private void OnTriggerEnter2D(Collider2D collision)
    {
        if (collision.CompareTag("Enemy"))
        {
            collision.GetComponent<Enemy>().TakeDamage(weaponDamage);
        }
    }

OnTriggerEnter2D는 유니티에서 제공하는 콜백 함수다
콜백함수는 개발자가 함수를 호출하는 게 아니라 특정 조건을 만족하면 자동으로 호출되는 함수를 말한다.
OnTriggerEnter2D는 두 개의 collider가 충돌했을 때가 조건이기 때문에
IsTrigger가 꼭 켜져있어야한다.

 

[추가 질문]: 유니티에서 멀티 스레딩을 사용하는 경우가 있는가?

Gemini: 📄 간단한 멀티스레딩 사용 예시
가장 간단하고 흔한 멀티스레딩 사용 예시는 '데이터 로딩' 입니다

1. 데이터 로딩 (가장 흔한 예)
문제: 게임 시작 시 대용량 파일 (예: 수백 개의 레벨 데이터, 고화질 텍스처 데이터 목록)을 메인 스레드에서 한 번에 읽어 들이면, 로딩이 끝날 때까지 게임 화면이 멈춥니다.

해결: 파일 읽기 작업을 보조 스레드로 옮깁니다.

보조 스레드: 파일 시스템 접근 및 데이터 읽기 작업을 담당합니다.
메인 스레드: 그동안 게임 화면(로딩 바, 애니메이션 등)을 계속 렌더링하고, 보조 스레드가 작업을 완료하기를 기다립니다.

 

[추가 파트]: 1주차 코드 보완

현재까지의 코드 목록이다

  1. Enemy.cs
  2. EnemyAI.cs
  3. EnemySpawner.cs
  4. PlayerAttack.cs
  5. PlayerMovement.cs
  6. WeaponController.cs

(1)은 오늘 작성했으니 넘어간다...

(2)는 간단하게 플레이어의 위치를 확인하고(FindGameObjectWithTag를 사용)

플레이어의 위치 방향으로 이동하는 코드다

(3)은 Instantiate을 이용해 프리펩을 원하는 위치에 소환시키는 것을 이용했다.

(4)를 조금 수정했는데 수정된 코드는 다음과 같다 (Coroutine이용)

using System.Collections;
using NUnit.Framework.Interfaces;
using UnityEngine;

public class PlayerAttack : MonoBehaviour
{   
    [SerializeField] private GameObject weaponPrefab;
    [SerializeField] private float attackCoolTime = 1f;
    [SerializeField] private float attackTimer = 0f;

    private readonly Vector3 playerOffset = new Vector3(1f, -0.2f, 0);
    private float delay = 1f;
    GameObject weapon;
    Vector3 playerRocation;

    void Start()
    {
        weapon = Instantiate(weaponPrefab, this.transform.position, Quaternion.identity); 
    
        // 2. 플레이어의 자식으로 설정하여 계층 구조를 만듭니다.
        weapon.transform.parent = this.transform; 
    
        // 3. 비활성화 상태를 유지합니다.
        weapon.SetActive(false);
    }


    void Update()
    {
        weapon.transform.localPosition = playerOffset;
        
        attackTimer += Time.deltaTime;
        

        if (attackTimer >= attackCoolTime)
        {
            Attack();
            attackTimer -= attackCoolTime;
        }

    }

    
    private void Attack()
    {
        weapon.SetActive(true);
        StartCoroutine(DisableWeaponAfterDelay());
    }

    private IEnumerator DisableWeaponAfterDelay()
    {
        yield return new WaitForSeconds(delay);
        weapon.SetActive(false);
    }

}

 

(5)는 클릭 시 좌우 방향을 바꿔 움직이는 코드다

(6)은 무기를 1초마다 켜고, 무기가 적과 충돌 시 Enemy의 TakeDamge 함수를 실행시키도록 한 코드다.

 

[후기]

1주 동안은 갈피를 못 잡아서 거의 AI가 짜준 코드 읽고 이해도 덜 한 상태로 어떻게든 만든 느낌이었는데

지금은 궁금한 게 계속 생기니 알아가는 재미가 느껴지는 것 같다.

오늘은 아주 피곤해서 빼먹은 부분이 있는지는 내일 확인해야겠다.

 

'기타 > 24주 게임 프로그래밍 챌린지' 카테고리의 다른 글

[1~4주: 구현력 확보] 1주차 - 4일, 스테이지 흐름 기본 구축  (0) 2025.12.14
[1~4주: 구현력 확보] 1주차 - 3일, Weapon 3종 실행 버전 만들기  (0) 2025.12.13
[1~4주: 구현력 확보] 1주차 - 2일, Player Combat 안정화  (0) 2025.12.11
🚀 24주 기술 성장 로드맵  (0) 2025.12.09
'기타/24주 게임 프로그래밍 챌린지' 카테고리의 다른 글
  • [1~4주: 구현력 확보] 1주차 - 4일, 스테이지 흐름 기본 구축
  • [1~4주: 구현력 확보] 1주차 - 3일, Weapon 3종 실행 버전 만들기
  • [1~4주: 구현력 확보] 1주차 - 2일, Player Combat 안정화
  • 🚀 24주 기술 성장 로드맵
피까츄
피까츄
프로그래밍 마스터가 될테야
  • 피까츄
    프로그래밍 마스터
    피까츄
  • 전체
    오늘
    어제
    • 분류 전체보기 (87)
      • 컴퓨터가 이상해요 모음집 (5)
      • 프로그래밍 (0)
      • 회고 (1)
      • 1학년 (21)
        • 명품 HTML+CSS+JS (10)
        • 쉽게 배우는 C언어 Express (2)
        • R언어 (9)
      • 2학년 (3)
        • C언어로 쉽게 풀어쓴 자료구조 (1)
        • 프로그래밍 언어론 (2)
      • 개인공부 (25)
        • 백준 (17)
        • 코드트리 JS (7)
        • 코테 공부 (1)
      • 챌린지 (1)
        • Do it C++ 코테 6주 챌린지 (1)
      • 교재 (14)
        • 이것이 C++이다 (3)
        • 이것이 JAVA다 (0)
        • 혼자 공부하는 컴퓨터구조 + 운영체제 (1)
        • 혼자 공부하는 데이터통신 (0)
        • 코어 자바스크립트 (8)
        • OpenGL로 배우는 3차원 컴퓨터 그래픽스 (2)
      • 유데미 (11)
        • 100일 코딩 챌린지 (3)
        • C# Unity 2D (8)
      • 기타 (0)
        • 24주 게임 프로그래밍 챌린지 (5)
  • 블로그 메뉴

    • 방명록
    • 그림블로그
    • 3D 블로그
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    the package javax.swing is not accessible
    작업표시줄클릭안됨
    우분투java
    0x80370102오류코드
    js #자바스크립트_기초
    우분투C
    우분투 설치 오류
    프로그래밍언어론
    HTML5+CSS3+Javascript 웹 프로그래밍 #연습문제 #이론문제 #실습문제 #풀이 #정답
    윈도우 기능 켜기
    vscode자동완성
    가상현실 설정
    복습
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
피까츄
[1~4주: 구현력 확보] 1주차 - 1일, Enemy 마무리
상단으로

티스토리툴바