Audio

GT 3 Audiodriven Game

Realtime Interactive Audio-Driven Unity Game

Unity Game Native Plugin License MIT

Einleitung

Anforderungen

  • Mac OSX: da das FFT Plugin in kompilierter Form lediglich für OSX im Repository ist. Zum Kompilieren des Plugins für andere Systeme ist unter Native Plugin eine Anleitung
  • Unity: wir haben die folgende Version verwendet: 2017.3.0f3

Wie starten

  • Zum Starten ist jeweils die neuste Version der Scene zu öffnen. Die aktuellste Scene hat den höchsten Zähler als Postfix angefügt. Zum Beispiel Scene14.unity
  • Danach kann das Spiel ohne weitere Einstellungen gestartet werden

Andere Musik Titel nutzen

Natürlich lässt sich das Spiel auch mit anderen Musikstücken starten dafür sind folgende Schritte nötig

  • MP3 Datei in den Ordner Assets/Sounds/ ablegen
  • Das Gameobjekt “AudioController” auswählen und die MP3 Datei via Drag and Drop in die Komponente “Audio Source” in das Feld “AudioClip” ziehen
  • Das Gameobjekt “Level” (Kindobjekt unter “World”) ebenfalls mit dem MP3 versehen
  • Nun kann das Spiel gestartet werden
  • Ggf. können im Script “Assets/Scripts/WorldController.cs” in der Methode Awake() die Trigger-Werte zum Erzeugen der Objekte angepasst werden

Computerspiel

1. Allgemein

Ein interaktives, zwei dimentionales echtzeit Jump and Run Spiel basierend auf dem Computerspiele Framework Unity. Die Gestaltung der Spielwelt basiert auf Charakteristiken eines Audiosignals. Um die Performanz zu steigern, wurden komplexe Audioverarbeitungsalgorithmen in ein Natives Plugin ausgelagert.

2. Gliederung des Projekts

Das Unity Spiel stützt sich auf drei essentiellen Controllern:

  • GameController (Spielzustände, Punkestände, User Interface)
  • WorldController (Generierung der Level Inhalte)
  • AudioController (Communication mit Nativem Plugin, Frequenzaufteilung)

3. Screenshot

Screenshot

Native Plugin

1. Einbindung nativer Plugins in Unity

Der C++ Code muss je nach Betriebssystem individuell compiliert werden. Den Source Code dazu finden Sie in dem Plugins Subfolder in dem Unity Scripts Verzeichnis. Stellen Sie sicher, dass sich die compilierte AudioAnalyser.bundle Datei in einem Unterordner der Unity Scripts befindet.

Wrapper methoden aus dem Nativen Plugin können wie folgt in c# importiert werden.

[DllImport ("AudioAnalyser", CharSet = CharSet.Unicode)]
static extern IntPtr createAudioAnalyser(int channelSize, int bufferSize);
	
[DllImport ("AudioAnalyser", CharSet = CharSet.Unicode)]
static extern void  deleteAudioAnalyser(IntPtr audioAnalyser);

[DllImport ("AudioAnalyser", CharSet = CharSet.Unicode)]
static extern IntPtr getBufferPointer(IntPtr audioAnalyser);

[DllImport ("AudioAnalyser", CharSet = CharSet.Unicode)]
static extern void  applyFFT(IntPtr audioAnalyser);

Stellen Sie sicher, dass sie die createAudioAnalyser sowie die getBufferPointer Methode nur einmals in ihrer Unity Start() Methode aufrufen. In der OnDestroy() Methode sollten Sie den Audio Analyser dann wieder löschen um so den zugewisenen Speicher wieder freizustellen. Zum besseren Verständnis hier ein vereinfachtes Beispiel, wie man mithilfe des Plugins Audio-Sample Daten die FFT anwenden kann.

IntPtr audioAnalyser;
IntPtr apiBufferPointer;
public static int channelSize = 2;
public static int bufferSize = 512;

void Awake () {
	audioAnalyser = createAudioAnalyser(channelSize, bufferSize);
	apiBufferPointer = getBufferPointer(audioAnalyser);
}

void FixedUpdate () {
	unsafe{
		float** arrayPtr = (float**) apiBufferPointer.ToPointer();
		for(int i = 0; i < channelSize; i++){
			for(int j = 0; j < bufferSize; j++){
				// Füllen des Plugin Sample-Buffer Arrays mit Audio Samples
				arrayPtr[i][j] = 0;
			}
		}
	}
	
	// FFT anwenden
	applyFFT(audioAnalyser);
	
	unsafe{
		float** arrayPtr = (float**) apiBufferPointer.ToPointer();
		for(int i = 0; i < channelSize; i++){
			for(int j = 0; j < bufferSize; j++){
				// Lesen der FFT Resulate
				float sample = arrayPtr[i][j];
			}
		}
	}
	
}

void OnDestroy(){
	deleteAudioAnalyser(audioAnalyser);
}