코딩의 신 43

김동관·2025년 12월 2일

오늘 한 일

  • Item 생성 (음식 드롭 → 충돌 시 HP 회복 적용)
  • 사운드 타격음 결정(공격, 적 사망, 레벨업)
  • 맵 사운드 적용
  • 경험치 추가수정
  • 맵 추가수정

오늘 한 일 입니다.
Item을 생성해서 음식이 hp를 회복하는지 체크를 하였습니다.
EXP를 만들어 경험치가 적용되는지 체크를 하였습니다.
몬스터가 죽을시에 드랍이 잘 되는지 확인 완료.
맵 사운드 Bgm, Sfx를 나눠 Bgm을 미리 넣었습니다.
맵 절벽쪽에 가면 캐릭터가 가려지는 현상 수정했습니다.

Sfx쪽 사운드 타격음은 아직 적용을 하지 못해서 추가로 수정을 해야 합니다.

  1. 아이템 및 경험치 추가
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ExpOrb : MonoBehaviour
{
    public int amount = 10;          // 경험치량
    public float moveSpeed = 5f;     // 경험치가 딸려오는 속도
    public float detectRange = 3f;   // 경험치가 빨려오기 시작하는 거리

    private Transform player;
    private SpriteRenderer sr;

    private float pulseSpeed = 3f;   // 반짝임 속도
    private float pulseAmount = 0.2f; // 반짝임 크기

    private Vector3 originalScale;

    private EnemyObjectPoolManager poolManager;
    private GameObject originalPrefab;

    // 공통 초기화 함수 (어디서든 호출)
    private void Init()
    {
        // 풀 매니저 자동 찾기 (없으면 null 그대로 둬도 됨)
        if (poolManager == null)
        {
            poolManager = EnemyObjectPoolManager.Instance;
        }

        // 플레이어 찾기
        if (player == null)
        {
            GameObject p = GameObject.FindWithTag("Player");
            if (p != null)
            {
                player = p.transform;
            }
        }

        // 스프라이트 렌더러, 스케일 초기화
        if (sr == null)
        {
            sr = GetComponent<SpriteRenderer>();
            originalScale = transform.localScale;
        }

        // 시각 효과 리셋
        if (sr != null)
        {
            Color c = sr.color;
            c.a = 1f;
            sr.color = c;
        }

        if (originalScale == Vector3.zero)
        {
            originalScale = transform.localScale;
        }
    }

    // 맵에 그냥 깔려있는 오브젝트나, 풀에서 꺼낸 오브젝트가 활성화될 때 호출
    private void OnEnable()
    {
        Init();
    }

    // (선택) 풀에서 꺼낼 때 추가 정보 설정할 수 있는 함수
    public void OnSpawned(EnemyObjectPoolManager pm, GameObject prefab)
    {
        poolManager = pm;
        originalPrefab = prefab;

        Init(); // 여기서도 공통 초기화 호출
    }

    private void Update()
    {
        // 혹시 모를 경우를 위해 매 프레임 보정
        if (player == null)
        {
            Init();
            if (player == null) return; // 아직도 못 찾았으면 그냥 나감
        }

        float distance = Vector2.Distance(transform.position, player.position);

        //플레이어가 detectRange 안에 들어와야 이동 시작
        if (distance <= detectRange)
        {
            Vector2 dir = (player.position - transform.position).normalized;
            transform.position += (Vector3)(dir * moveSpeed * Time.deltaTime);
        }

        // 경험치 흡수 거리
        if (distance < 0.5f)
        {
            var receiver = player.GetComponent<IExpReceiver>();
            if (receiver != null)
            {
                receiver.OnExpPickup(amount);
            }

            ReturnToPool();
            return;
        }

        // 반짝임(Pulse)
        float scale = 1 + Mathf.Sin(Time.time * pulseSpeed) * pulseAmount;
        transform.localScale = originalScale * scale;

        // 알파로 반짝임 추가
        if (sr != null)
        {
            Color c = sr.color;
            c.a = 0.5f + Mathf.Sin(Time.time * pulseSpeed) * 0.5f; // 0~1 범위로 투명도 변화
            sr.color = c;
        }
    }

    private void ReturnToPool()
    {
        if (poolManager != null && originalPrefab != null)
        {
            // 풀에 정상 반환
            poolManager.ReturnToPool(gameObject, originalPrefab);
        }
        else
        {
            // 풀 정보가 없으면 그냥 파괴 (맵에 미리 깔아둔 애들은 여기로 옴)
            Destroy(gameObject);
        }
    }
}
//ExpOrb.cs를 추가하고 프리팹으로 만들어주었습니다.

using UnityEngine;

public class FoodDrop : MonoBehaviour
{
    public FoodItem data;       // ScriptableObject 데이터 연결
    public float lifeTime = 10f;

    private void Start()
    {
        Destroy(gameObject, lifeTime);
    }

    private void OnTriggerEnter2D(Collider2D other)
    {
        var stat = other.GetComponent<StatHandler>();
        if (stat != null)
        {
            stat.Health += data.healAmount;  // HP 회복
            Debug.Log($"[FoodDrop] {data.itemName} 먹음 → HP: {stat.Health} (+{data.healAmount})");
            Destroy(gameObject);             // 먹으면 제거
        }
    }
}
//FoodDrop.cs를 만들어서 음식 회복이 적용되게 해주었습니다.

이제 곧 병합도 하고 준비할게 많아 이상으로 마치겠습니다.

profile
아이디어 뱅크

0개의 댓글