오늘 한 일
오늘 한 일 입니다.
Item을 생성해서 음식이 hp를 회복하는지 체크를 하였습니다.
EXP를 만들어 경험치가 적용되는지 체크를 하였습니다.
몬스터가 죽을시에 드랍이 잘 되는지 확인 완료.
맵 사운드 Bgm, Sfx를 나눠 Bgm을 미리 넣었습니다.
맵 절벽쪽에 가면 캐릭터가 가려지는 현상 수정했습니다.
Sfx쪽 사운드 타격음은 아직 적용을 하지 못해서 추가로 수정을 해야 합니다.
- 아이템 및 경험치 추가
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를 만들어서 음식 회복이 적용되게 해주었습니다.
이제 곧 병합도 하고 준비할게 많아 이상으로 마치겠습니다.