코딩의 신 44

김동관·2025년 12월 3일

오늘 한 일

  • sfx 적용 (Range 원거리 투사체, Exp 획득, Food 획득)
  • 사운드 싱크 조절
  • 패시브 폭팔작용시 파티클 추가
  • 전체 통합 빌드

추가로 구현할 부분 (선택)

  • 버튼 클릭시에 효과음
  • 타이틀 브금
  • 보스 브금
    프로토 타입이라 많이 기능은 넣지 않겠지만 제 기준 게임에서 중요한 건 저 부분들이 먼저 수정 되어야 된다 생각합니다.
  1. 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 = 귀 역할 (카메라에 붙어 있음)

  1. 패시브 폭팔작용시 파티클 추가
    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 추가 해주면 완성이 됩니다.
이상!

profile
아이디어 뱅크

0개의 댓글