ebSkola

6.3 Audio sistēma

Stundas uzdevums: Pievienot mūziku, skaņas efektus un audio buses spēlei.

SR 2.4.7. UI SR 2.4.15. Modulāras programmas

80 min plāns: Teorija un paraugs (~10 min) · 1. uzdevums (~20 min) - atskaņo pirmo skaņu · 2. uzdevums (~25 min) - pievieno fona mūziku ar pāreju · 3. uzdevums (~20 min) - sakārto skaļumu ar audio bus · Iesniegšana (~5 min).

Pirms sāc: atver savu spēli. Sagatavo divus audio failus: vienu īsu efektu un vienu garāku mūziku. Ja tādu nav, lejupielādē bezmaksas skaņas no freesound.org vai opengameart.org.

Teorija: Godot audio

Godot audio sistēma izmanto AudioStreamPlayer nodes ar audio bus arhitektūru.

using Godot;

// Atskaņot SFX
AudioStreamPlayer sfx = GetNode<AudioStreamPlayer>("SFX");
sfx.Stream = ResourceLoader.Load<AudioStream>("res://sounds/jump.ogg");
sfx.Play();

// Mūzika ar fade-in
private void PlayMusicFadeIn(string path)
{
    musicPlayer.Stream = ResourceLoader.Load<AudioStream>(path);
    musicPlayer.VolumeDb = -30;
    musicPlayer.Play();
    CreateTween().TweenProperty(musicPlayer, "volume_db", -10.0, 2.0);  // fade up
}

Audio buses: Master → Music, SFX, Voice. Lietotājs var pielāgot katru atsevišķi.

Kā šo izmantot projektā

Atceries: ar redzamu efektu editorā nepietiek. Paskaidro, kura C# klase glabā stāvokli, kura metode to maina un kā Godot node struktūra izmanto šo kodu.

Pārbaudi: UI signāli, audio darbības, debug izvade un publicēšanas sagatave ir sasaistīta ar C# spēles stāvokli.

public class PolishCheckpoint
{
    public string Lesson = "6.3 Audio sistēma";
    public bool UsesCSharp = true;
    public bool ConnectsUiSignals = true;
    public bool RoutesAudioEvents = true;
    public bool VerifiesExportBuild = true;
}

Praktiskie uzdevumi

1. uzdevums -

Atskaņo pirmo skaņu

Beigās spēle noskanēs, kad kaut kas notiek.

  1. Ievelc audio failu projekta mapē, piemēram res://sounds/jump.ogg.
  2. Pievieno scēnai AudioStreamPlayer mezglu ar nosaukumu SFX.
  3. Pārliecinies, ka faila sākumā ir using Godot;.
  4. Paņem mezglu ar AudioStreamPlayer sfx = GetNode<AudioStreamPlayer>("SFX");.
  5. Izsauc sfx.Play(); lēciena vai savākšanas brīdī.
  6. Būvē un pārbaudi skaņu.
  7. Izsauc notikumu ļoti ātri vairākas reizes un pieraksti, kas notiek ar skaņu.

Gatavs, kad: notikuma brīdī atskan skaņa, un tu esi pierakstījis, kas notiek, atkārtojot to ļoti ātri.

2. uzdevums -

Pievieno fona mūziku ar pāreju

Beigās mūzika sāksies mīksti, nevis uzreiz pilnā skaļumā.

  1. Pievieno otru AudioStreamPlayer ar nosaukumu Music.
  2. Iestati tā audio failu un ieslēdz atkārtošanos importa iestatījumos.
  3. Iestati sākumā skaļumu uz music.VolumeDb = -40;.
  4. Izveido Tween, kas vienā sekundē paceļ skaļumu līdz 0 dB.
  5. Palaid un ieklausies, vai mūzika ienāk pakāpeniski.
  6. Pievieno arī izejošu pāreju, kad spēle beidzas.
  7. Pieraksti, kāpēc skaļumu mēra decibelos, nevis procentos.

Gatavs, kad: mūzika ienāk pakāpeniski, atkārtojas bez pauzes un beigās izgaist.

3. uzdevums -

Sakārto skaļumu ar audio bus

Beigās spēlētājs varēs atsevišķi regulēt mūziku un efektus.

  1. Atver apakšā cilni Audio.
  2. Izveido divus jaunus bus: Music un SFX.
  3. Piesaisti katru atskaņotāju savam bus Inspector panelī.
  4. Pievieno iestatījumu logam divus HSlider mezglus.
  5. Savieno tos ar AudioServer.SetBusVolumeDb(AudioServer.GetBusIndex("Music"), valueDb);.
  6. Pārbaudi, ka mūzikas slīdnis nemaina efektu skaļumu.
  7. Iestati mūziku uz nulli un pārbaudi, ka efekti joprojām skan.

Gatavs, kad: abi slīdņi darbojas neatkarīgi: izslēdzot mūziku, skaņas efekti joprojām atskan.

Papildu uzdevums - Saglabā skaļuma iestatījumus

Ja pamatdarbs ir gatavs, atceries spēlētāja izvēli.

  1. Saglabā abu bus skaļumu JSON failā ar 5.3 stundas SaveManager.
  2. Ielādē tos spēles startā.
  3. Iestati slīdņu pozīcijas pēc ielādētajām vērtībām.
  4. Aizver spēli un palaid no jauna.
  5. Pārbaudi, ka skaļums palicis tāds, kādu to atstāji.

Gatavs, kad: pēc spēles restarta skaļuma slīdņi ir tajā pašā vietā, kur tu tos atstāji.

Ko sagatavo

Stundas mērķis: Tavā spēlē skan skaņas efekti un fona mūzika ar mīkstām pārejām, un mūziku ar efektiem var regulēt atsevišķi caur diviem audio bus.

GitHub krātuvē jābūt:

  1. README.md ievietota video saite ar skaņu, kurā dzirdama mūzikas ienākšana un vismaz viens skaņas efekts.
  2. Ekrānuzņēmums ar Audio cilni, kurā redzami tavi divi bus.
  3. C# fails ar audio kodu.
  4. README.md: kāpēc skaļumu mēra decibelos un kāpēc mūziku un efektus tur atsevišķos bus.

Kā iesniedz: Veic commit un push. Skolotāja norādītajā vietā ievieto tikai GitHub krātuves saiti; visiem prasītajiem failiem, README.md pierakstiem un pierādījumiem jābūt pašā krātuvē.

Biežākās kļūdas

  • Skaņa nestrādā: stream nav ielādēts vai bus mute.
  • Lag music start: OGG fails liels - ielādē to ar ResourceLoader.Load jau līmeņa sākumā.
  • SFX cuts off: Lieto pool, lai daudzi vienlaikus.

Godot ekrānuzņēmumi

Project → Audio Bus editor: Master, Music, SFX, Voice ar volume sliders un mute pogām.
Project → Audio Bus editor: Master, Music, SFX, Voice ar volume sliders un mute pogām.
FileSystem panelis ar sounds/ mapē: jump.ogg, hit.ogg, coin.ogg, click.ogg, music_main.ogg.
FileSystem panelis ar sounds/ mapē: jump.ogg, hit.ogg, coin.ogg, click.ogg, music_main.ogg.

Koda piemērs (paplašināts)

using Godot;
using System.Collections.Generic;

public partial class AudioManager : Node
{
    private readonly List<AudioStreamPlayer> sfxPool = new();
    private AudioStreamPlayer musicPlayer;
    private const int PoolSize = 8;

    public override void _Ready()
    {
        for (int i = 0; i < PoolSize; i++)
        {
            AudioStreamPlayer player = new AudioStreamPlayer();
            player.Bus = "SFX";
            AddChild(player);
            sfxPool.Add(player);
        }

        musicPlayer = new AudioStreamPlayer();
        musicPlayer.Bus = "Music";
        AddChild(musicPlayer);
    }

    public void PlaySfx(string path)
    {
        foreach (AudioStreamPlayer player in sfxPool)
        {
            if (!player.Playing)
            {
                player.Stream = ResourceLoader.Load<AudioStream>(path);
                player.Play();
                return;
            }
        }
    }

    public void PlayMusic(string path)
    {
        musicPlayer.Stream = ResourceLoader.Load<AudioStream>(path);
        musicPlayer.Play();
    }
}
Spēlē fonā mūzika, klikšķis pogai dod 'click.ogg', lec dod 'jump.ogg', skaņas pārklājas bez problēmām.