You are on page 1of 12

HIS

How to make a Sound


Ljud- och musikimplementation i spelmotorer
Hofsten Jakobsen Anders, b14andja@his.student.se

Innehllsfrteckning
1

Introduktion ................................................................................................................ 1

Bakgrund ..................................................................................................................... 2

Genomfrande ............................................................................................................ 3
3.1

Problem ........................................................................................................................... 7

Slutsats ........................................................................................................................ 9
4.1
4.2

Resultatsammanfattning .................................................................................................. 9
Diskussion ........................................................................................................................ 9

1 Introduktion
I kursen Ljud- och musikimplementation i spelmotorer fick vi som studenter i uppdrag att
ljuddesigna en spelprototyp. I fljande text tnker jag beskriva denna arbetsprocess, dels ur en
design-synpunkt men ocks hur den praktiska implementationen gick till och diskutera kring
frdelar och nackdelar med mina lsningar.

2 Bakgrund
Att ljuddesigna ett datorspel kan vara svrt. ven om spelet innehller mycket lite ljud s
finns en del saker som en ljuddesigner mste tnka p nr det gller ljud fr interaktiv media.
Skillnaden mellan att designa ljud fr interaktiva medier och linjr media ssom film r stor
och kan ibland vara svr att frst utan direkt riktlinjer att luta sig tillbaka mot. ven om det
har utvecklats en hel del olika ramverk fr och underltta, som IEZA (R. van Tol och S.
Huiberts, 2016) s r dessa ramverk enbart ett hjlpmedel och inga direkta regler att flja.
Ett annat problem r att mediet datorspel utvecklas i en enorm takt, och ven de trender som
fljer med. Att applicera IEZA-ramverket p Dead Space-serien (Schofield och Robbins,
2008) skulle till exempel vara krngligt d Dead Spaces anvndargrnssnitt sker direkt i
spelet och att placera interface-ljuden i interface-delen av IEZA ramverket gr egentligen inte.
Datorspel och dess trender utvecklas i s snabb takt att de ramverk och guidelinjer som
industrin gemensamt har satt upp redan r utdaterade. Liknande s suddas linjen mellan
interaktiv och dynamiskt ljud ut, och statiskt linjra ljud r ingenting som r nskvrt.
I boken The Essential Guide to Game Audio beskrivs skillnaden mellan en linjr produktion
och en ickelinjr produktion p ett ganska enkelt stt:
Now imagine watching this same film, only each time you watch it, the character goes
into the house at different times. This is a prime example of the unpredictability and
indeterminacy inherent in games. How could you successfully create sounds for a
medium in which you dont know when in time a particular action is going to happen?
How can you create a way to trigger them reliably? (Horowitz and Looney, s 36: 2014)

Detta r en av de stora utmaningarna med att designa ljud fr interaktiv media, och i fljande
text hoppas jag kunna ge lite information om min process fr och underska samt lsa detta
problem. Vi har anvnt oss av en spel-motor som heter Unity 3d (Unity 3d, 2016) samt ett

mitten-program fr ljuduppspelning som heter FMOD ((FMOD, 2016), och texten kommer
mestadels att belysa hur FMOD-eventen r uppbyggda samt lite om hur koden r
strukturerad.

3 Genomfrande
Det absolut frsta som gjordes infr planeringen av projektet var att spela spelet (mnga
gnger) och skriva ner p en lista ver vilka event som finns. Efter detta var gjort s
versattes dessa till ett xml-ark dr bde prioritering, parametrar och funktion av eventet var
nerskrivet. Detta gjordes medvetet i planeringsstadiet fr och underltta vid sjlva
ljuddesigna-fasen av projektet, d funktionen av eventet pverkar hur designen utfrs.
Ett exempel-event var AI-karaktrens vokaliseringar nr det blev aktivt. Jag visste att AIkaraktren springer mot spelaren hela tiden, och drav kunde jag direkt veta att en
avstndsparameter kunde vara ngonting att anvnda sig av. Jag visste att jag kunde anvnda
samma event fr och trigga ngonting nr AI-karaktren dr, eftersom min planeringslista
hade eventet AI med funktionerna spawn och die, och eventet fick d en parameter som hette
die som fungerade som en trigger fr nr AI-karaktren dr. Distansparametern ndrade
ljudets pitch och dess omslutning kring spelaren. Sjlva ljudfilerna bestr av 13 st
vokaliseringar som spelar upp i en slumpartad ordning, och nr monstret dr spelas tre st lager
upp samtidigt dr ett lager har en slumpad pitch-variation och ett lager har en slumpad
startposition (Fig. 1a).

Fig. 1a
Liknande struktur anvndes vid sjlva koden, dr jag skrev ett script som hanterade ljuden
som resten av koden kunde prata med och stta/f vrden ifrn. Exempel p detta r hur
musiken blir mer och mer intensiv baserat p hur mnga pickups som spelaren har tagit.
Det frsta som grs i koden r att lta koden veta vad som r vad:
public void Awake( )
{
Music = GameObject.FindGameObjectWithTag ("Music").GetComponent<EventPlayer> ( );
pickMan = GameObject.Find ("Logic").GetComponent<PickupManager> ( );
MusicIntensity = pickMan.numberOfPickups;
GameObject Character = GameObject.FindGameObjectWithTag ("Character");

jump = Character.GetComponent<Jump> ( );
Footstep = Character.GetComponent<Footsteps> ( );
}

Efter detta s kan programmet dynamiskt stta musiken till dess olika lgen via en funktion
som krs varje frame:

public void SetMusic( )


{
switch (pickMan.numberOfPickups)
{
case 0:
Debug.Log ("No pickups. Soft music");
Music.ChangeParameter ("Intensity", 0);
Music.ChangeParameter ("Win", 0);
break;
case 1:
Debug.Log ("Enemy spawned.");
Music.ChangeParameter ("Intensity", 1);
break;
case 2:
Debug.Log ("Enemy spawned.");
Music.ChangeParameter ("Intensity", 2);
break;
case 3:
Debug.Log ("Enemy spawned.");
Music.ChangeParameter ("Intensity",
break;
case 4:
Debug.Log ("Enemy spawned.");
Music.ChangeParameter ("Intensity",
break;
case 5:
Debug.Log ("Enemy spawned.");
Music.ChangeParameter ("Intensity",
break;
case 6:
Debug.Log ("Enemy spawned.");
Music.ChangeParameter ("Intensity",
break;
case 7:
Debug.Log ("Enemy spawned.");
Music.ChangeParameter ("Intensity",
break;
case 8:
Debug.Log ("Enemy spawned.");
Music.ChangeParameter ("Intensity",
break;
case 9:
Debug.Log ("Enemy spawned.");
Music.ChangeParameter ("Intensity",
break;
case 10:
Debug.Log ("Enemy spawned.");
Music.ChangeParameter ("Intensity",
Music.ChangeParameter ("Win", 1);
break;

3);

4);

5);

6);

7);

8);

9);

10);

Nr spelaren tar en pickup (eller ddar ett AI, vilket ocks rknas som en pickup) s stts
numberOfPickups via ett script som hanterar logiken fr detta, och funktionen SetMusic() kollar
vrdet p numberOfPickups i scriptet som hanterar pickups. Musiken i sin tur r skriven dynamiskt
och melodin av musiken r uppdelad s att varje ton r ett eget ljudspr och varje gng eventet
loopar s spelar den upp en slumpat utvald ton. Vissa lager r baserade p regler s att de bara
spelar om en viss parameter r stlld p ett visst stt (Fig. 1b).

Fig. 1b
De olika musikaliska lagren ndrar intensitet med hjlp av en parameter som heter Intensity
som bde justerar volym och lgger p eller drar av effekter beroende p intensitet.
Resterade delar av projektet fungerade p samma stt och r antingen designat med detta i
tanke frn brjan eller designat s att det blir dynamiskt via programvaran som skter ljuden
(Fig. 2a).
ven fotsteg fungerar liknande, och stts i koden via en enkel switch:
public void SetSurface( )
{
switch (SurfaceType) // Surfacetypes
{
case 0:
Footstep.ChangeParameter ("Surface", 0);
Debug.Log ("SurfaceType 0: None.");
break;

case 1:
Footstep.ChangeParameter ("Surface", 1);
Debug.Log ("SurfaceType 1: Sand.");
break;
case 2:
Footstep.ChangeParameter ("Surface", 2);
Debug.Log ("SurfaceType 2: Dirt.");
break;
case 3:
Footstep.ChangeParameter ("Surface", 3);
Debug.Log ("SurfaceType 3: Leaves.");
break;
case 4:
Footstep.ChangeParameter ("Surface", 4);
Debug.Log ("SurfaceType 4: Mud.");
break;

case 5:
Footstep.ChangeParameter ("Surface", 5);
Debug.Log ("SurfaceType 5: Water.");
break;
}

Denna switch r i sin tur satt via en trigger i vrlden som bestmmer vilken slags yta
karaktren gr p. Detta r ett direkt resultat av att projektet inte har ngra texturer, annars
skulle jag valt att lsa det via en raycast (en linje som skjuts ut frn en vektorposition i vrlden
(i det hr fallet skulle vektorpositionen vara foten p spelaren) och returnerar data om det linjen
trffar) fr och ta reda p vilket material karaktren str p.

Fig. 2a

Sjlva ljuddesignen fr spelet var mestadels gjord med slumpad ordning i tanke, d det flesta
ljud r gjorde s att var komponent av ljuden har flera olika lager som mjukvaran fr
ljuduppselning kan slumpa emellan. Detta r ett enkelt stt att f ordnad randomisering utan
att behva ge sig p interna effekter ver huvud taget fr och spara resurser. Det r ocks ett
enkelt stt att f mer variation av samma ljud, bde via interna effekter, och slumpad ordning.
Ett exempel r fotstegen i spelet som bestr av tv lager per fotstegs-yta dr det ena lagret
innehller fyra st. ljud och det andra lagret innehller minst sex stycken ljud. Den slumpade
ordningen p detta gr att vi kan f ut 4*6 olika kombinationer exklusive interna effekter.
Med interna effekter kan vi f ut 4*6 olika kombinationer med slumpad pitch, slumpad start
position och slumpad volym vilket resulterar i en nst intill ondlig mngd av subtila varianter
av ett fotsteg. Dessutom s kan vi vga sannolikheten fr att ett lager ska spelas vilket kan
frndra ljuden ytterligare.
Eftersom ljudet skulle gras till ett spel s r det flesta event gjorda som en slags
tillstndsmaskin dr eventet antingen r p eller av, och fasen eventet r i r antingen start, i
mitten eller i slutet, tex. Jump-eventet som har tv faser: Jump och Land, dr sannolikheten
att ljudet fr jump eller land ska spelas upp (samt hur de ska spelas) ndras beroende vilken
fas eventet befinner sig i. Eventet har ocks ett lager som alltid har en chans (ca. 70%) att
spelas.
Eventet fr rotationen p kanontornen har en start, itererande mitten, och en slut fas; eventet
startas, gr automatiskt in i delen som itererar och stannar dr tills fasen blir satt via ett
programmatiskt vrde att g in i fasen stop (Fig. 3a).

Fig. 3a

3.1 Problem
Det fanns sklart vissa problem som skulle lsas med denna uppgift. Ett av de svrare
problemen var hur kanontornen fungerade och hur de skulle meddela resten av koden nr och

var de olika eventen skulle spelas. I slutndan s lste jag problemet genom att lgga till
booleaner och driva logiken frn dem, eftersom original koden hade liknande checkar fr
Unitys egna ljudkllor:
if (rotationAudio == null)
return;
else
if (Mathf.Abs (rotationRefVelocity) < rotationThreshold)
rotationAudio.Play ( );

Eftersom jag grna ville ndra s lite som mjligt p original-koden tycktes detta vara den mest
optimala lsningen, och jag ersatte original-checkarna med egna checkar fr mina booleaner,
och ersatte Unitys egna ljudkllor med mina FMOD-event:
if (rotationAudioBool == false)
return;

//

else
{
if (Mathf.Abs (rotationRefVelocity) < rotationThreshold)
RotatorEvent.PlayEvent ( );

Jag funderade ocks p hur kulorna skulle fungera frn kanontornen fr jag ville ha ett event
som spelas nr kulorna studsade mot vggen och liknande. ven om det blev med i projektet
(baserat p en kollisions-check) s ville jag ta reda p vinkeln och trigga olika p grund av det.
Det var ett problem jag hade men som jag bedmde att jag inte hade tid till att ta reda p.
Andra problem jag sttte p under projektet var mestadels under frproduktionen som handlade
om hur event ska designas, vilka komponenter de kommer behva och hur de komponenterna
ska fungera. Mycket av problemen var egentligen vilket slags snapshot som en tunnel ska ha,
eller hur mycket explosion som ska vara i en explosion.

4 Slutsats
4.1 Resultatsammanfattning
Jag skulle vilja pst att resultatet inte blev som jag hade hoppats p, eftersom programvaran
som skter ljuden inte kunde hantera att jag laddade s mycket data direkt och en del ljud inte
kunde spelas frens efter 1-2 minuters gameplay. D detta gr att fixa genom att optimera
koden/eventen s r det inget stort problem fr kursen i sig, men ett strande moment fr mig
personligen oavsett.

4.2 Diskussion
D kursen var speciellt utformad fr spel-utveckling kan det vara enkelt att tro att den mittenprogramvara som anvndes fr och skta uppspelningen av ljud (och ocks den programvara
som spelet var gjord med) enbart r gjorda fr just spel men de bda kan anvndas till annan
interaktiv media. Unity kan bygga projekt till nstan varenda platform som finns och det finns
ppna API:er till nstan varenda sensor som existerar. Det r inte svrare att fr Unity att
prata med ett Kinect fr och spra folks rrelser i ett rum n vad det r att gra ett spel i
Unity. Eftersom Unity redan har en API samt plugin fr FMOD s r det enkelt att gra en
interaktiv installation med Unity som driver logiken (och det grafiska) och FMOD som driver
ljuden.
Det som var intressant var hur projektet var ppet fr tolkning eftersom det inte hade ngra
texturer alls och var verkligen en prototyp. Att arbeta med en prototyp utan art-direction gr
att du som ljuddesigner har helt fria tyglar, ngonting som i sin tur gr att du mste hitta en
estetik att g efter. ven om arbetsprocessen r den samma som i en prototyp med artdirection och frdiga texturer, s blir fokus enbart p ljudet eftersom det knappt finns ngot
annat, och det var egentligen den strsta utmaningen med hela projektet; att f till en
ljuddesign som hll sig inom en viss estetik och som lt som att det hrde hemma inom
universumet.

Referenser
FMOD. (2016). Melbourne, Australia: Firelight Technologies.
Horowitz, S. and Looney, S. (2014). The Essential Guide to Game Audio. New York: Focal
Press, Taylor & Francis Group.
Schofield, G. and Robbins, B. (2008). Dead Space. Visceral Games, EA Redwood Shores.
Unity 3d. (2016). San Francisco, California, USA: Unity Technologies.
van Tol, R. and Huiberts, S. (2016). IEZA: A Framework For Game Audio. [online]
Gamasutra.com.
Available
at:
http://www.gamasutra.com/view/feature/131915/ieza_a_framework_for_game_audio.php
[Accessed 19 Jun. 2016].

10

You might also like