오늘 한 일
추가로 구현할 부분 (선택)
- SFX 적용
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class SoundManager : MonoBehaviour
{
public static SoundManager Instance;
[Header("Player")]
public AudioClip eatFood;
public AudioClip levelUp;
public AudioClip meleeSwing;
public AudioClip magicShot;
public AudioClip fireMagic;
public AudioClip expGain;
[Header("Monster")]
public AudioClip enemyLongAttack;
public AudioClip expDrop;
[Header("BGM")]
public AudioClip moonlightForest;
public AudioSource sfxSource;
public AudioSource bgmSource;
private Dictionary<AudioClip, float> sfxCooldown = new Dictionary<AudioClip, float>();
[SerializeField] private float defaultSfxInterval = 0.2f;
private void Awake()
{
if (Instance == null)
{
Instance = this;
}
else Destroy(gameObject);
}
** 몬스터가 많이 나오는 게임이라서, 시간초를 두지 않고 사운드가 중첩된다면 크게 민감해질 수 있습니다. 그래서 쿨타임을 1초로 둬서
중첩이 되지 않게 해주었습니다.**
public void PlaySFX(AudioClip clip, float interval = -1f)
{
if (clip == null) return;
// interval을 지정 안 하면 기본값 사용
if (interval <= 0) interval = defaultSfxInterval;
// 이미 사운드가 등록되어 있고, 아직 재생 쿨타임이 안 지났으면 스킵
if (sfxCooldown.ContainsKey(clip))
{
if (Time.time < sfxCooldown[clip])
return;
}
// 플레이
sfxSource.PlayOneShot(clip);
// 다음 재생 시간 갱신
sfxCooldown[clip] = Time.time + interval;
}
public void PlayBGM(AudioClip clip)
{
if (clip != null)
{
bgmSource.clip = clip;
bgmSource.loop = true;
bgmSource.Play();
}
}
}
//사용예시//
private void ShootProjectile()
{
// 원거리 몬스터 공격 사운드 추가
SoundManager.Instance.PlaySFX(SoundManager.Instance.enemyLongAttack, 1f);
}
//SFX사운드의 예시로 몬스터가 투사체를 날릴시에 공격 사운드를 추가해주었습니다.//

사운드매니저 오브젝트의 구조입니다.
사운드를 쓰려면 기본적으로 Sound Sources가 필요합니다.
Unity 오디오 구조는 이렇게 되어 있기 때문입니다.
AudioClip = 소리 파일 (데이터만 존재)
AudioSource = 소리를 “재생”하는 스피커 역할
AudioListener = 귀 역할 (카메라에 붙어 있음)
- 패시브 폭팔작용시 파티클 추가
private void DestroyProjectile(Vector3 position, bool createFx)
{
// TODO: createFx가 true일 때 파괴 이펙트(Particle)를 생성하는 코드를 여기에 추가할 수 있습니다.
if (createFx && explosionFxPrefab != null)
{
// 파티클 생성
Instantiate(explosionFxPrefab, position, Quaternion.identity);
}
Destroy(this.gameObject);
}
파티클 구현 부분입니다.
→ DestroyProjectile() 호출
→ explosionFxPrefab 파티클 Instantiate
→ 그 후 Destroy(gameObject) 로 투사체 삭제
순으로 진행이 됩니다.
트러블 슈팅

오늘의 트러블 슈팅은 파티클이 x,y,z축으로 직접 이동을 시켜봐야 파티클이 나온다는점입니다.
지금 코드로 파티클은 Instantiate 되어 생성되고 있다.
그런데 이펙트가 화면에서 전혀 보이지 않음.
→ 원인: Burst를 안 넣어서 파티클을 “생성하지 않음”.
즉,
파티클 오브젝트는 생기는데
내부 파티클이 0개라서 안 보이는 것.
Emission → Bursts (한 번에 확 터지는 이펙트) 이 구조인데
explosion Fx는 “폭발”인데 Bursts가 없음
→ 폭발처럼 “딱 한 번 팍 터지는 효과”는 절대 안 보임
→ Rate over Time이 0이면 화면에 아무것도 안 뜸
→ 그래서 파티클을 생성했는데도 "투명"처럼 안 보이는 것처럼 보임
이렇게 된 것입니다.
결론은
Explosion Fx → Emission → Bursts 추가 해주면 완성이 됩니다.
이상!