2010-12-14 GameMaker AG-Protokoll: Unterschied zwischen den Versionen

Aus Fachschaft_Informatik
Zur Navigation springen Zur Suche springen
(Die Seite wurde neu angelegt: Protokoll der GameMaker AG-Sitzung am 14.12.2010 Anwesende Personen: ~11 Beginn: 13:05 Uhr == Ablauf == * Wir erweitern PlayerMovement, sodass man bremsen und mehrfa...)
 
K (Bot: Kosmetische Änderungen)
 
(Eine dazwischenliegende Version von einem anderen Benutzer wird nicht angezeigt)
Zeile 43: Zeile 43:
}</pre>
}</pre>
* Außerdem kann durch Aufruf von "GameEnded()" die Bewegung deaktiviert werden.
* Außerdem kann durch Aufruf von "GameEnded()" die Bewegung deaktiviert werden.
* Interessante Dinge: [[http://unity3d.com/support/documentation/ScriptReference/Physics.Raycast.html Physics.Raycast()]], [[http://unity3d.com/support/documentation/ScriptReference/Input.GetButtonDown.html Input.GetButtonDown()]] und [[http://unity3d.com/support/documentation/ScriptReference/Rigidbody-angularDrag.html Rigidbody.angularDrag]].
* Interessante Dinge: [http://unity3d.com/support/documentation/ScriptReference/Physics.Raycast.html Physics.Raycast()], [http://unity3d.com/support/documentation/ScriptReference/Input.GetButtonDown.html Input.GetButtonDown()] und [http://unity3d.com/support/documentation/ScriptReference/Rigidbody-angularDrag.html Rigidbody.angularDrag].


* Wir erstellen des Weiteren ein Skript mit GUI.
* Wir erstellen des Weiteren ein Skript mit GUI.
** function OnGUI() definieren
** function OnGUI() definieren
** GUI.xx oder GUILayout.xx im Rumpf aufrufen
** GUI.xx oder GUILayout.xx im Rumpf aufrufen
** Offizielles Tutorial hierzu: [[http://unity3d.com/support/documentation/Components/GUI%20Scripting%20Guide.html klick]]
** Offizielles Tutorial hierzu: [http://unity3d.com/support/documentation/Components/GUI%20Scripting%20Guide.html klick]
** Klasse GUI in der Scripting-Referenz: [[http://unity3d.com/support/documentation/ScriptReference/GUI.html GUI]]
** Klasse GUI in der Scripting-Referenz: [http://unity3d.com/support/documentation/ScriptReference/GUI.html GUI]


* Unser Script "PlayerGUI", der dem Spieler nzeigt, ob er noch spielt, gewonnen oder verloren hat, und dem entsprechend einen Knopf für Neustart oder das nächste Level anzeigt:
* Unser Script "PlayerGUI", der dem Spieler nzeigt, ob er noch spielt, gewonnen oder verloren hat, und dem entsprechend einen Knopf für Neustart oder das nächste Level anzeigt:
Zeile 96: Zeile 96:
  GUI.Box(Rect(10,10,200,24), message);
  GUI.Box(Rect(10,10,200,24), message);
}</pre>
}</pre>
* Hierbei interessant: [[http://unity3d.com/support/documentation/ScriptReference/Application.LoadLevel.html Application.LoadLevel]] und [[http://unity3d.com/support/documentation/ScriptReference/Application-loadedLevel.html Application.loadedLevel]].
* Hierbei interessant: [http://unity3d.com/support/documentation/ScriptReference/Application.LoadLevel.html Application.LoadLevel] und [http://unity3d.com/support/documentation/ScriptReference/Application-loadedLevel.html Application.loadedLevel].


* Jetzt muss man nur noch unseren WinTrigger so anpassen, dass er in PlayerMovement und PlayerGUI (beide unserer Kugel als Komponente gegeben) jeweils GameEnded() aufruft, bei PlayerGUI mit einem boolean-Parameter (win), der angibt, ob der Trigger das Ziel oder ein "verloren"-Bereich ist:
* Jetzt muss man nur noch unseren WinTrigger so anpassen, dass er in PlayerMovement und PlayerGUI (beide unserer Kugel als Komponente gegeben) jeweils GameEnded() aufruft, bei PlayerGUI mit einem boolean-Parameter (win), der angibt, ob der Trigger das Ziel oder ein "verloren"-Bereich ist:
Zeile 113: Zeile 113:
* Fügt man nun mehrere Level zu den Build Settings hinzu, erhält man ein Spiel mit mehreren Leveln.
* Fügt man nun mehrere Level zu den Build Settings hinzu, erhält man ein Spiel mit mehreren Leveln.
Mit der GUI und einer Scene, in der einfach kein steuerbarer Spieler ist, ließe sich z.B. ein Hauptmenü erstellen.
Mit der GUI und einer Scene, in der einfach kein steuerbarer Spieler ist, ließe sich z.B. ein Hauptmenü erstellen.
* Ich habe Prefabs vergessen. Shame on me. Wer mag, darf sich bis zum nächsten Treffen (welches ja eine Weile hin ist) über Prefabs schlau machen: [[http://unity3d.com/support/documentation/Manual/Prefabs.html Prefabs]]. Mit Prefabs kann man GameObjects (ggf. samt Children) als Vorlagen speichern, z.B. den Spieler, und dann in jedem Level einfach nur noch einfügen. Genauso das Ziel oder auch einen sich wiederholenden Baustein. Auf Wunsch wird eine Änderung an einem Prefabs auf alle seine Instanzen angewendet. Sehr praktisch und wichtig!
* Ich habe Prefabs vergessen. Shame on me. Wer mag, darf sich bis zum nächsten Treffen (welches ja eine Weile hin ist) über Prefabs schlau machen: [http://unity3d.com/support/documentation/Manual/Prefabs.html Prefabs]. Mit Prefabs kann man GameObjects (ggf. samt Children) als Vorlagen speichern, z.B. den Spieler, und dann in jedem Level einfach nur noch einfügen. Genauso das Ziel oder auch einen sich wiederholenden Baustein. Auf Wunsch wird eine Änderung an einem Prefabs auf alle seine Instanzen angewendet. Sehr praktisch und wichtig!


== Sonstiges ==
== Sonstiges ==
Zeile 119: Zeile 119:
* Wir sehen uns am ersten Dienstag nach der vorlesungsfreien Zeit wieder!
* Wir sehen uns am ersten Dienstag nach der vorlesungsfreien Zeit wieder!


[[Kategorie: GameMaker AG-Protokolle]]
[[Kategorie:GameMaker AG-Protokolle]]

Aktuelle Version vom 8. Juni 2012, 17:01 Uhr

Protokoll der GameMaker AG-Sitzung am 14.12.2010

Anwesende Personen: ~11

Beginn: 13:05 Uhr

Ablauf[Bearbeiten]

  • Wir erweitern PlayerMovement, sodass man bremsen und mehrfach springen kann:
var speed : float;
var brake : float;
var jumpPower : float;
var jumpCount : int = 3;
var pivot :Transform;

private var alive : boolean = true;
private var jumpCounter : int = 3;

function GameEnded()
{
 alive = false;
}

function FixedUpdate () 
{
 if(alive)
 {
  rigidbody.AddForce(pivot.forward * Mathf.Clamp(Input.GetAxis("Vertical"), 0, 1) * speed * Time.deltaTime);
  rigidbody.angularDrag = Mathf.Clamp(Input.GetAxis("Vertical"), -1, 0)* -brake;

  //Sieh unter Dir nach, ob da Boden ist
  if(Physics.Raycast(transform.position, -Vector3.up, 0.25+0.05))
  {
   jumpCounter = jumpCount;
  }
  //Wenn wir Space drücken und wir noch Sprünge übrig haben
  if(Input.GetButtonDown("Jump") && jumpCounter > 0)
  {			
   rigidbody.AddForce(Vector3.up * jumpPower, ForceMode.Impulse);
   jumpCounter--;
  }
 }	
}
  • Wir erstellen des Weiteren ein Skript mit GUI.
    • function OnGUI() definieren
    • GUI.xx oder GUILayout.xx im Rumpf aufrufen
    • Offizielles Tutorial hierzu: klick
    • Klasse GUI in der Scripting-Referenz: GUI
  • Unser Script "PlayerGUI", der dem Spieler nzeigt, ob er noch spielt, gewonnen oder verloren hat, und dem entsprechend einen Knopf für Neustart oder das nächste Level anzeigt:
enum PlayerState
{
 playing,won,lost
}

private var state : PlayerState = PlayerState.playing;

function GameEnded(won : boolean)
{
 if(won)
 {
  state = PlayerState.won;
 }
 else
 {
  state = PlayerState.lost;
 }
}

function OnGUI()
{
 var message : String;
 switch(state)
 {
  case PlayerState.won:
   message = "Du bist der King";	
   if(GUI.Button(Rect(10,44,200,24), "Weiter..."))
   {
    Application.LoadLevel(Application.loadedLevel+1);
   }
  break;
  case PlayerState.lost:
   message ="Du Idiot!";
   if(GUI.Button(Rect(10,44,200,24), "Neustart..."))
   {
    Application.LoadLevel(Application.loadedLevel);
   }
  break;
  default:
   message = "Macht hinne!";				
  break;
 }
 GUI.Box(Rect(10,10,200,24), message);
}
  • Jetzt muss man nur noch unseren WinTrigger so anpassen, dass er in PlayerMovement und PlayerGUI (beide unserer Kugel als Komponente gegeben) jeweils GameEnded() aufruft, bei PlayerGUI mit einem boolean-Parameter (win), der angibt, ob der Trigger das Ziel oder ein "verloren"-Bereich ist:
var win : boolean = false; 

function OnTriggerEnter(other : Collider)
{
 if(other.CompareTag("Player"))
 {
  other.BroadcastMessage("GameEnded", win);
 }
}
  • Muss einem Objekt mit Collider mit isTrigger gegeben werden (haben wir schon erstellt).

Ergebnis[Bearbeiten]

  • Fügt man nun mehrere Level zu den Build Settings hinzu, erhält man ein Spiel mit mehreren Leveln.

Mit der GUI und einer Scene, in der einfach kein steuerbarer Spieler ist, ließe sich z.B. ein Hauptmenü erstellen.

  • Ich habe Prefabs vergessen. Shame on me. Wer mag, darf sich bis zum nächsten Treffen (welches ja eine Weile hin ist) über Prefabs schlau machen: Prefabs. Mit Prefabs kann man GameObjects (ggf. samt Children) als Vorlagen speichern, z.B. den Spieler, und dann in jedem Level einfach nur noch einfügen. Genauso das Ziel oder auch einen sich wiederholenden Baustein. Auf Wunsch wird eine Änderung an einem Prefabs auf alle seine Instanzen angewendet. Sehr praktisch und wichtig!

Sonstiges[Bearbeiten]

  • Vielen Dank an Ina für die Binärkekse!
  • Wir sehen uns am ersten Dienstag nach der vorlesungsfreien Zeit wieder!