|
|
|
|  Unity3D Mac(Entwicklungsumgebung)/PC, Single User, Standalone & Browser, Physik Shaderengine (Preise: free / 500$ edu / 1400$ ) Version 3.o Trial: 30 Tage für Pro | | | |
 ![Einen Kommentar (einer Stelle[markiert]) hinzufügen](imgs/iconaddobject.gif)
|  1. Software Unity3d (Editor) |  | |  Programm-GUI |  | | Wichtigste Elemente: Scene, Game, Hierachy, Project & Inspector
 | | | | |  Bedienung (ohne Maus mit Scrollrad nicht bedienbar!) - Maus & Scrollrad: rein & rauszoomen - Maus & Apfel-Taste: drehen im Raum
- Space: vergrössern des aktuellen Bereichs | | | |
| | |
| | |
|  2. Unity Aufbau (Technik) |  | |  Wichtigste Unterscheidungen in Unity3D - Assets (Anlagen, Templates) - GameObjects (Objekte im Game - Grundklasse - Components (Shaders, Scripts) (An GameObjects attachbare Componenten) |  | |  Erstellen eines Objektes (GameObjektes): 1. GameObjects 2. Auswählen des Objektes 3. Erstellen 4. Components hinzufügen | | | | |  |  | ![Einen Kommentar (einer Stelle[markiert]) hinzufügen](imgs/iconaddobject.gif) | GameObjekte
 | | | | | Komponenten (zusätzliche Funktionalität attributiert)
 | | | | | Assets (wiederverwendbar in verschiedenen Projekten)
 | | | | |  ( Pref(abricated)bs: wiederverwendbare Objekte) Abgespeichert in der ProjectView sind sie "quasi"-Klassen, die zur Laufzeit dann "instanziert" werden. Prefabsänderungen werden dadurch auf alle Objekte übertragen.
Neue Prefabs: Leer, es muss zusätzlich ein GameObject eingefügt werden damit instanziert werden kann. Das GameObjekt muss in der Szene instanziert werden und anschliessend dem Preftab zugewiesen werden)
1. Assets>Create>Prefab 2. Neuer Name 3. Drag & Drop (das davor erstelle) GameObjekt auf das Preftab (Project-Ansicht).
Instanzierung: Projektansicht in die Szene oder Hierarchieansicht ziehen. (Überschreiben kann überschrieben werden) |  | | Create Prefabs
 | | | | | Prefab leer - ohne GameObject
 | | | | | Neues Prefab mit Kapsel-GameObjekt
 | | | |
| | |
| | | |  Objekte von Unity3D |  | |  Würfel (fallendes Objekt) Component RidigBody hinzufügen |  | | Pysikalisch fallender Würfel
 |  | ![Einen Kommentar (einer Stelle[markiert]) hinzufügen](imgs/iconaddobject.gif) | Material im Inspector eingestellt
 | | | |
| | |
| | | |  Terrain |  | | Create Terrain
 |  | ![Einen Kommentar (einer Stelle[markiert]) hinzufügen](imgs/iconaddobject.gif) | Terrain anheben, senken, texturieren (angewählt), trees (hinzufügen zuerst), foliage
 | | | | | Texture hinzufügen
 | | | |
| | |
| | | |  Kamera Kameras haben wie üblich brennweite etc und in diesem Fall lässt sich die Hintergrundfarbe auch hier einstellen. |  | | Defaults Componenten (Members)
 | | | | | Ein Script das einem Objekt folgt (in diesem Fall dem Cubus von oben)
 |  | ![Einen Kommentar (einer Stelle[markiert]) hinzufügen](imgs/iconaddobject.gif) |  Verschiedene Kameraskripts findet man unter /Project/Standard Assets/Camera Scripts/ | | | |
| | | |  Splitscreen oder 4-Screen etc Via Zuteilung der Kamera zu einem Ausschnitt des Bildschirms (Anzahl konfigurierbar)
Jeder Ausschnitt wird pro Kamera festgelegt auf dem virtuellen Monitor von X (0-1) und Y (0-1)
Etwa horizontal:
# Kamera 1 Pos: 0/0 Width/Height: 0.5/1 # Kamera 2 Pos: 0.5/0 Width/Height: 0.5/1
siehe auch die Möglichkeit Kameras als Texturen zu Rendern und anschliessend auf Objekte zu legen ("RenderTexturen")
|  | | Erste Kamera für Splitscreen (auch x-Screen sind möglich!)
 | | | | |  Rendering verändern - Nur gewisse Dinge Rendern - Minimaps ohne bewegliche Objekte |  | | Layer fürs Rendern angeben (oder neuen Renderer erstellen)
 | | | | | Pro Camera angeben welche Layers gerendert werden sollen
 | | | |
| | |
| | |
| | |
| | | |  Einfachstes Debug 1. Window > Console 2. print("xyz"); ermöglicht einfache Ausgabe auf die Konsole |  | |  Gizmo zusätzlich im Editor zeichnen/zeigen
/* nur im Editor anzeigen */ // für den Editor function OnDrawGizmos() { // Gizmos.DrawIcon(transform.position, "Picturex.png"); }
// selektiert? function OnDrawGizmosSelected() { Gizmos.color = Color.green; Gizmos.DrawSphere (transform.position, 2); Gizmos.DrawWireCube (transform.position, Vector3 (1,1,1)); // Gizmos.DrawIcon(transform.position, "Picturey.png"); }
|  | |  Möglichkeiten DrawRay Draws a ray starting at from to from + direction. DrawLine Draws a line starting at from towards to. DrawWireSphere Draws a wireframe sphere with center and radius. DrawSphere Draws a solid sphere with center and radius. DrawWireCube Draw a wireframe box with center and size. DrawCube Draw a solid box with center and size. DrawIcon Draw an icon at world position center. DrawGUITexture Draw a texture in screen coordinates. Useful for GUI backg | | | |
| | |
| | | |  Skybox |  | | Anwenden: Edit > RenderSettings (erscheint rechts im Inspector!!!!)
 | | | |
| | |
| | |
| | |
|  3. Erstellen von Objekten |  | |  Erstellen eines Objektes 1. Menu: GameObject > Create Other > Cube 2. Inspector: ändern der Daten (Material Änderung unter Mesh Renderer) |  | | Objekt im Editor und Gameansicht
 |  | ![Einen Kommentar (einer Stelle[markiert]) hinzufügen](imgs/iconaddobject.gif) |  Material hinzufügen 1. Farbe: New Material, setzen der Farbe 2. Texture: Einfach in die Assets importieren und auf das Objekt ziehen (neue Komponente wird erstellt |  | |  1. Material: Farben |  | | Create Material
 | | | | | Anfügen des Materials, ändern der Main-Color
 | | | | |  Per Script ändern renderer.material.SetColor("_Color",Color.green); renderer.material.SetColor("_Color",Color.red); renderer.material.SetColor("_Color",new Color(1.0,1.0,1.0));
| | | |
| | | |  2. Texture |  | |  Texture direkt auf das Objekt ziehen | | | |
| | |
| | |
| | | |  Objekt aktiveren und deaktiveren per Skript
gameObject.active=false; gameObject.active=true;
// recursive gameObject.SetActiveRecursively(false); gameObject.SetActiveRecursively(true);
| | | |
| | | |  3d-Objekte angeblich erstellbar in fast allen Programmen ohne spezielles Konvertieren etc. |  | |  Import aller gängigen Formate - 3ds - fbx - jas etc | | | | | Objekte werden in GameObjekte verwandelt mit der Componente Mesh
 | | | | |  LineRender (Wireframe/Gewand) Line-Renderer ist die einfache Möglichkeit Linien/Wireframes mit Texturen zu erstellen.
// search the line renderer lineRenderObject=this.GetComponent("LineRenderer"); print(lineRenderObject);
// use world coordinates or local // lineRenderObject.useWorldSpace=false; // use local ..
// set vertices lineRenderObject.SetVertexCount(10); // set position // lineRenderObject.SetPosition(2,new Vector3(2,2,2)); |  | | 1. Create an Empty GameObject
 | | | | | 2. Zusatz: der Linerenderer
 | | | | | 3. Constrution mit Script
 | | | |
| | |
| | | |  Hierarchien erstellen Nachfolgende Knoten "erben" die Koordinaten / Rotation (Nutzbar für Lichter, Partikel etc) | | | | |  3D-Text Unity erlaubt es direkt 3D-Text zu rendern und zu verändern. 3D-Text ist dabei ein Gameobjekt mit der Componente TextMesh. Es kann deswegen nur über die Komponente auf den Text zugegriffen werden. |  | | var GameObjectText=GameObject.Find("StatusText"); var TextMeshObj=GameObjectText.GetComponent("TextMesh"); TextMeshObj.text="Loading Text (Status)"; | | | |
| | |
| | |
|  4. Skripting: Allgemein |  | |  Scripting - JavaScript - C-Sharp / C# - Boo (Python?)
Grundklasse ist eine GameObject-Klasse. In die Instanz einer solche Klasse werden dann Komponenten eingelagert. Die Scripts sind dabei eine eigene Klasse (in C# Monobehaviors). Das ganze funktioniert also als ein Objekt mit Slots. Erweiterungen am Grundcode können keine vorgenommen werden, einzig Plugins können erstellt werden (je spezifisch für jedes System) und dann kann darauf zugegriffen werden.
Wichtigste Elemente des Scripts sind die Methoden: - Start() - FixedUpdate() [Computerleistung unabhängig 50x sec] / Update() [Leistungsabhängig]
Die Geschwindigkeit der Ausführung des Scripts kann mit einer TimeLine-Compontente verändert werden. |  | |  |  | ![Einen Kommentar (einer Stelle[markiert]) hinzufügen](imgs/iconaddobject.gif) |  TimeManager kontrolliert auch die physikalische Abfrage der Objekte (Intervall) >> Siehe interne Referenz |  | | Edit > Settings > ProjectsSettings > Time (TimeManager)
 | | | |
| | | |  Zeit auslesen seit Start // Simulationtime print(Time.time);
| | | |
| | | |  Zugriff auf Remote-Script Zugriff auf ein anderes Objet und da auf das Skript.
1. Finde das Objekt per Name oder per Tag etc 2. Lese die entsprechende Komponente aus (Behavior) |  | |  Javascript // 1. Find Object var objt=GameObject.Find("GameControllerObject"); // 2. Do Methode: getObj(); objt.GetComponent("GameController").getObj(); | | | | |  C# // 1. Suche das Objekt GameObject GameControllerObjectTemp=GameObject.Find("GameControllerObject"); // 2. Suche Komponente mit dem Behavior-Class (hier Gamecontroller - mehrmaliges Convertieren!) GameController zob=(GameController)GameControllerObjectTemp.GetComponent(typeof(GameController)); // 3. Anwenden zob.getObj();
| | | |
| | | |  Einbinden von .Net/C# Bibliotheken In Javascript ma Beispiel von FileManipulationen // import import System.IO;
// example .. function Start() { File.Exists( "test.txt" ) File.Delete( "test.txt" ) } | | | |
| | | |  Rotierender/sich verschiebender Cube (mittels Scripting) 1. Erstellen eines Assets (Javascript-Komponente) (GameObject) 2. Umbennen im Project-Browser 3. Edit 4. als Componente hinzufügen und aktivieren 5. mit Play ausprobieren |  | |  Hier Javascript (aber auch C# möglich) Jedes Script ist eine Art Behavior-Klasse (siehe C#), das als Komponente auf das Objekt zugreifen kann.
update-methode hinterlegung der wichtigsten Änderungen
transform enthält beispielsweise das Transformationsobjekt des Cubes. |  | |  die Update-Methode
function Update () { transform.Rotate(0, 5 * Time.deltaTime, 0); transform.Translate(0, 0, 2 * Time.deltaTime); print("rotateAndTransform.udpate()"); } |  | |  Translate - Move local vs Move absolute // Move with local Direction (Rotation) - Default transform.Translate(Vector3.forward * Time.deltaTime);
// Move in global Coordinates (up is up / down is down) transform.Translate(0, Time.deltaTime, 0, Space.World); | | | |
| | | | // velocity (geschwindigkeit - rigidbody) rigidbody.velocity
// forward (looking) transform.forward
| | | |
| | | | Komponente beim Objekt einfügen
 | | | | | Let's play
 | | | |
| | | |  Script im Editor zugänglich machen? (Parameterisierung über den Unity3D-Editor) // am Anfang var generateObjectType : GameObject;
// im Editor erscheint eine Auswahl = alle GameObjekte werden zur Auswahl angezeigt .. |  | | Im Editior parameterisierbar
 | | | |
| | |
| | |
|  5. Skripting: Input |  | |  Input: Keyboard/Mouse - Objekt auf Tastatur-Input verschieben |  | |  Inputs in alle 4 Richtungen verarbeiten
function Update () {
// print("RotateAndTransform.update()"); if (Input.GetKey ("up")) { print ("rotateAndTransform.update(up)"); transform.Translate(0, 0, 2 * Time.deltaTime); } if (Input.GetKey ("down")) { print ("rotateAndTransform.update(down)"); transform.Translate(0, 0, -2 * Time.deltaTime); } if (Input.GetKey ("left")) { print ("rotateAndTransform.update(up)"); transform.Translate(2 * Time.deltaTime,0,0); } if (Input.GetKey ("right")) { print ("rotateAndTransform.update(down)"); transform.Translate(-2 * Time.deltaTime,0,0); }
} | | | | |  Objekt-Abhängig: OnMouseOver, OnMouseDown, onMouseClick // GameObjekt als Button - OnDrag
// Darken the material color while user holds down the mouse. function OnMouseDrag () { renderer.material.color -= Color.white * Time.deltaTime; }
| | | |
| | | |  WiiRemote Integration Bis zu 16 verschiedene WiiMotes möglich!! Siehe Integration. | | | |
| | |
|  6. Scripting: Objekte finden (Find, Raycast) |  | |  Objekte finden (hierarchieabhängig oder rekursiv durch das Projekt) |  | |
// über alles // By name var go = GameObject.Find ("SomeGuy"); go.transform.Translate(0, 1, 0);
// find hand transform.Find("Hand").rigidbody.AddForce(0, 10, 0);
// alle // Moves all transform children 10 units upwards! for (var child : Transform in transform) { child.Translate(0, 1, 0); }
// children anhängen cobj.transform.parent = transform;
// By tag (you can put more than one object to a tag of course) var player = GameObject.FindWithTag("Player"); player.transform.Translate(0, 1, 0);
// children transform.Find("Hand").Translate(0, 1, 0); transform.Find("Hand").GetComponent(OtherScript).foo = 2;
|  | 0 [...]Find[...] |  Search in deep (mittels eines Baumes) Search - Arm -- Hand ---- Finger
aFinger = transform.Find("LeftShoulder/Arm/Hand/Finger"); if (aFinger!=null) { aFinger.Rotate(Time.deltaTime*20, 0, 0); } | | | | |  Tags erstellen |  | | ein Extra taggen
 | | | | | Einfügen eines Elements rechts!
 | | | | | | | |  Hierarchie-Up - Root-Element // Root-GameObject var obj=transform.root.gameObject print(obj.name); // avatar // \__ // \____abc // avatar=transform.root.gameObject | | | |
| | |
| | | |  Screen & MouseControl # Position 2D : Control Input.mousePosition > {[0...1024][0..1024]} : Vector3
# Umrechnen in Range (Viewport) Camera.main.ScreenToViewportPoint (Input.mousePosition); {[0-1][0-1][0]} : Vector
# Position 3D
// Position in der Welt auf den Screen runterrechnen var screenPos = camera.WorldToScreenPoint (target.position);
// Position des Screens auf die Welt rechnen var p = camera.ScreenToWorldPoint (Vector3 (100,100,camera.nearClipPlane));
| | | | |  Raycast (3D-Finden) |  | | Spiel: Verberge ein Objekt dahinter
 |  | ![Einen Kommentar (einer Stelle[markiert]) hinzufügen](imgs/iconaddobject.gif) |  RaycastHit
RaycastHit.point RaycastHit.distance RaycastHit.normal
| | | |
| | | |  Raycast
// FixedUpdate function FixedUpdate () { // Draw Forward Vector var forward = transform.TransformDirection(Vector3.forward) * 10; Debug.DrawRay (transform.position, Vector3.forward * 10, Color.green); // raycasthit var hitObj : RaycastHit; var ray = Camera.main.ScreenPointToRay(Input.mousePosition); if (Physics.Raycast (ray, hitObj)) { // print objects print(hitObj.collider.name); hitObj.transform.Rotate(0.2,0.4,0);
} // ray cast //var rayObj = camera.ScreenPointToRay (Vector3(200,200,0)); // Debug.DrawRay (rayObj.origin, rayObj.direction * 10, Color.yellow); } |  | |  Siehe auch Umwandlung WorldToScreen - ScreenToWorld oder Viewport var screenPosXXX = camera.WorldToScreenPoint (xxx.transform.position); | | | |
| | | |  Linecast (etwas dazwischen?) if (!Physics.Linecast (transform.position, target.position)) { // do stuff } | | | | |  RayCastAll
RayCast All // raycast var hits : RaycastHit[]; hits = Physics.RaycastAll (transform.position, transform.forward, 100.0);
// Change the material of all hit colliders // to use a transparent Shader for (var i=0;i { var hitx : RaycastHit = hits[i]; var renderer = hitx.collider.renderer; if (renderer) { renderer.material.shader = Shader.Find("Transparent /Diffuse"); renderer.material.color.a = 0.3; } } |  | 0 [...]Transparent[...] |  RaycastAll - Array umgekehrt sortiert var hits : RaycastHit[]; hits = Physics.RaycastAll (vec, -diffvec, 100.0);
if (hits.length>0) for (var i=0;i{ var hit : RaycastHit = hits[hits.length-i-1]; print(hit.distance+" "+hit.gameObject.name); } |  | |  Debug RaycastArray // ... var str=""; for (var t=0;t { var hitCast : RaycastHit = hits[t]; str=str+t+" "+hitCast.transform.gameObject.name+"["+hitCast.distance+"]\n"; } // print("****\n"+str);
| | | |
| | | |  RaycastAll - Mouse to WorldPoint var vecDirection=cameraPointOnScreen-cameraPoint; if (debugThis) { Debug.DrawRay(cameraPoint, vecDirection.normalized*10.0, Color.red); }
| | | |
| | |
| | |
| | |
|  7. Skripting: Kollisionen |  | |  Kollisionen & Trigger - Kollisionen Kollisionen geschehen zwischen zwei festen Körpern. Beide Körper lösen Kollisionstrigger aus.
- Trigger Trigger sind Objekte ohne eigentlichen festen Körper (isTrigger). Das heisst andere Objekte können sie durchqueren. Der Event wird nur beim Trigger ausgelöst |  | |  Kollisionen (ohne Physik wie Gravitation) - "Sprite Kollisionsabfrage" 1.Rigidbody hinzufügen (Gravity deaktivieren und Kinematic aktivieren) 2.MeshCollider hinzufügen
> Kollidieren mit anderen Objekten mit Meshes ist möglich
>> Abfrage mit OnTriggerEnter
| | | | |  Objekte fällt auf die Oberfläche 1. Objekt erstellen wie Cube mit RidigBody 2. Script anhängen
// mit einem anderen objekt function OnCollisionEnter(collision : Collision) { // Debug-draw all contact points and normals print("OnCollisionEnter"); for (var contact : ContactPoint in collision.contacts) { Debug.DrawRay(contact.point, contact.normal, Color.white); audio.Play();
}
// mit einem collider (nur falls trigger/collider angewählt beim getroffenen objekt) function OnTriggerStay (other : Collider) { print("OnTriggerStay"); if (other.attachedRigidbody) { other.attachedRigidbody.AddForce(Vector3.up * 10); } audio.Play(); } 3. Terrain auf isCollider setzen
| | | | |  Sound aktivieren bei Collision 1. Sound hinzufügen (direkt ins Projekt ziehen - mp3 etc) - deaktivieren "automatisch abspielen" 2. Audio-Source zum GameObjekt hinzufügen 3. aktivieren im Skript mit audio.Play(); | | | | |  Collision - mit wem kollidiert das Object? // collision effect: function OnCollisionEnter(collision : Collision) { // collisions object print(collision.gameObject); print(collision.gameObject); print(collision.gameObject.name);
// check other name // if (collision.gameObject.name != "ground") { }
if (collision.gameObject.GetInstanceID()>GetInstanceID()) { // destroy one of the objects Destroy(collision.gameObject); // scale the other transform.localScale.x=2*transform.localScale.x; transform.localScale.y=2*transform.localScale.y; transform.localScale.z=2*transform.localScale.z; }
// generate a new object // var clone : GameObject; // clone = Instantiate (pshem, Vector3(0.0,15.0,0.0), Quaternion.identity);
}
return; } | | | | |  Trigger Trigger reagiert auf die Kollision eines Körpers mit RidigBody auf das TriggerObject. |  | | TriggerObject: Componenten(Collider & isTrigger) + TriggerScript
 |  | ![Einen Kommentar (einer Stelle[markiert]) hinzufügen](imgs/iconaddobject.gif) |  TriggerScript
function Update () { }
function OnTriggerEnter(trigger : Collider) { // Debug-draw all contact points and normals print("OnTriggerEnter"); } | | | |
| | | | Objekt, das collidiert muss einen RigidBody besitzen
 | | | |
| | | |  Kollision (zwei Objekte mit Collider und/oder Ridigbody) | | | |
| | |
| | |
|  8. Scripting: Physics |  | |  Physics - RidigBody (Starre Körper Physik) Einstellungen über Physic wie etwa Gravitation
Edit > Settings > Physics (Manager) |  | |  Fallende Objekte - RigidBody anhängen Component > Physics > RidgidBody
| | | | |  Zusammehängende Objekte generieren mit Joints Bei einem Objekt hinzufügen und dann weiteres Objekt auswählen: Component > Physics > - Hinge Joint - wie mit einem Seil etc |  | | Wie aneinander gebunden - ein unsichtbares Band
 | | | |
| | | |  Constant Force konstante bzw sich abschwächende Krafausübung anhängen | | | | |  Kräfte anwenden auf einen Körper
1. Rigid Body hinzufügen 2. Scripting
rigidbody.AddForce(10,0, 0);
// direkt setzen rigidbody.velocity .x=0; |  | 1 [...]velocity[...] |  Physik zurücksetzen rigidbody.velocity=new Vector3(0,0,0); rigidbody.angularVelocity=new Vector3(0,0,0);
| | | |
| | | |  RigidBody-Collisionen etc Rigidbody.IsSleeping / Is the rigidbody sleeping? Rigidbody.mass / The mass of the rigidbody. Rigidbody.maxAngularVelocity / The maximimum Rigidbody.MovePosition / Moves the rigidbody to position. Rigidbody.MoveRotation / Rotates the rigidbody to rotation. Rigidbody.OnCollisionEnter / OnCollisionEnter is called when this collider/rigidbody has begun touching another rigidbody/collider. Rigidbody.OnCollisionExit / OnCollisionEnter is called when this collider/rigidbody has stopped touching another rigidbody/collider. Rigidbody.OnCollisionStay /OnCollisionEnter is called once per frame for every collider/rigidbody that is touching rigidbody/collider. Rigidbody.position |  | |  Rigid-Body anhängend aber isKynematic=true // on Collision
transform.Find("ball").rigidbody.isKinematic=false; transform.Find("ball").rigidbody.WakeUp(); | | | |
| | |
| | |
| | |
|  9. Scripting: Objekte erstellen on the fly |  | |  Kapseln werfen |  | |  Script, das an die Person gehängt werden kann und dann in die entsprechende Richtung physik. Objekte wirft // Angabe des Objekte im Unity3D Editor
// generiert automatisch ein "member/attribute" var generateObjectType : Rigidbody;
function Update () { // schiesse if (Input.GetKey ("up")) { print ("newObject.generate"); var cobj : Rigidbody = Instantiate(generateObjectType, transform.position, transform.rotation);
// richtung angeben // falls in blickrichung an die kamera hängen & sonst einfach an den körper var speed=50; cobj.velocity = transform.TransformDirection(Vector3 (0,0,speed)); Physics.IgnoreCollision(cobj.collider, transform.root.collider); } } | | | |
| | |
| | |
|  10. Scripting: GUI erstellen |  | |  GUI - Interface Ingame etc GUI kann soweit der Kenntnisstand in 2.o nur mittels Scripting einfügt und abgefragt werden. (= kein Editor!) |  | |  Einfach hinzufügen von Text oder Bilder direkt bei der Kamera (GUIText, ...) | | | | |  Komplex OnGUI <<<<< GROSS geschrieben!! Erstellen von eigenen GUIs |  | |  Übersicht Möglichkeiten - einzelne Controls Das Gui kann in irgendeinem Skript erstellt werden und liegt auf der vordersten Ebene.
# Usage function OnGUI () { }
# Display per Tickcount Diese Funktion wird jedes Mal neu aufgerufen bei jedem Tickcount. Man muss oder darf die Objekte jedes Mal neu erstellen. Deswegen können blinkende Teile etwa so erstellt werden: if (Time.time % 2 < 1) { Objekt anzeigen }
# Relativ Darstellen Elemente relativ zum Bildschirm anzeigen mittels: - Screen.width - Screen.height
# Koordinaten (x,y,with,height)
# Text GUI.Label (Rect (0,0,100,50), "Text)
# TextArea - TextEingabe // Member var textAreaString = "text area"; // Script textAreaString = GUI.TextArea (Rect (25, 25, 100, 30), textAreaString);
# Box GUI.Box (Rect (10,10,200,250), "Discussion");
# Bild // Member var picture : Texture2D; GUI.Label (Rect (10,160,100,50), picture);
# Buttons if (GUI.Button (Rect (10,60,150,20), "Quit")) { print ("Ok I go home"); }
// Button mit Bild // Member var icon : Texture2D; // Script if (GUI.Button (Rect (10,10, 100, 50), icon)) { }
# Container (zusammengesetzte Objekte mit einem Rahmen) GUI.Box (Rect (10,10,100,50), GUIContent("This is text", picture));
# Windows (kleine Fensterchen) // Member private var windowRect : Rect = Rect (220 20, 120, 50); // script (onGui) windowRect = GUI.Window (0, windowRect, WindowFunction, "My Window"); // function for handling function WindowFunction (windowID : int) { // Draw any Controls inside the window here }
# Gruppierte Guis wie in Java oder so // direkt aus der Beschreibung GUI.BeginGroup (Rect (Screen.width / 2 - 50, Screen.height / 2 - 50, 100, 100)); // All rectangles are now adjusted to the group. (0,0) is the topleft corner of the group.
// We'll make a box so you can see where the group is on-screen. GUI.Box (Rect (0,0,100,100), "Group is here"); GUI.Button (Rect (10,40,80,30), "Click me");
// End the group we started above. This is very important to remember! GUI.EndGroup ();
|  | |  Text-Aligment / Left, Center GUIStyle style = new GUIStyle(); style.alignment = TextAnchor.UpperLeft; GUI.Box(r,debugPinValueGlove0(),style);
| | | | |  Box mit speziellem Style .. (font etc) // infos/settings Rect rectObj=new Rect(40,10,200,400); GUIStyle style = new GUIStyle(); style.alignment = TextAnchor.UpperLeft; GUI.Box(rectObj," bla blab alba ",style); | | | |
| | | | Beispiel GUI
 |  | ![Einen Kommentar (einer Stelle[markiert]) hinzufügen](imgs/iconaddobject.gif) |  Einige Beispiele
// picture-slot var picture : Texture2D;
// text var textAreaChangeIt = "Dieser Text ist lang und hilflos";
// windowRect var windowRect:Rect=Rect(250,180,200,200);
function OnGUI () { // Rahmenlinie GUI.Box (Rect (10,10,200,250), "Discussion");
// Picture GUI.Label (Rect (10,160,100,50), picture);
// Label .. GUI.Label (Rect (60,130,100,50), "Das ist ein Text (Label)"); // Text .. textAreaChangeIt = GUI.TextArea (Rect (250, 25, 100, 100), textAreaChangeIt);
// Gui Button und Abfrage if (GUI.Button (Rect (10,60,150,20), "Quit")) { print ("Ok I go home"); } // Zeitabhängige Anfrage if (Time.time % 2 < 1) { if (GUI.Button (Rect (10,80,150,20), "I am")) { print ("YES YOU ARE"); } } // Container mit Rahmen - Text & Bild GUI.Box (Rect (10,180,100,50), GUIContent("Text und Bild", picture)); // windowRect windowRect = GUI.Window (0, windowRect, WindowHandling, "Mein Window"); }
// window function .. function WindowHandling (windowID : int) { textAreaChangeIt = GUI.TextArea (Rect (0, 30, 100, 30), textAreaChangeIt); GUI.Label (Rect (10,60,100,50), picture);
} | | | |
| | |
| | |
| | | |  GUI mit GUISkins "CSS-Guis" können mit GUISkins (für das ganze Gui) und customized mit GuiStyle angepasst werden. |  | |  1. Skin Asset erstellen | | | | | 2. Skin anpassen
 | | | | |  3. Skin anwenden
|  | |  3.1 Einbinden und auswählen als Member
a) Im Kopf des Scripts var customSkin : GUISkin;
b) Im Editor: Auswhählen des Skripts
| | | | |  3.2 Skin im Skript einbauen und anwenden
// von hier an benutzen GUI.skin = customSkin;
// mittels Gruppen in ein freies Layout bringen GUI.BeginGroup (Rect (250,400,100,20));
if (new GUILayout.Button("next >")) {
}
GUI.EndGroup ();
| | | |
| | | | | |
| | |
|  11. Scripting: Animation |  | |  Animationen Animationen können direkt importiert werden etwa als .jas-File (Cheetah) oder gebräuchlicher als .fbx-File. Das importierte File wird dann per default abgespielt. Problem bei der Animation ist, dass die Animation immer beim 3dProgramm startet.
Das Problem kann behoben werden, indem man die Animation an ein anderes (beispielweise leeres Gameobjekt > Create Gameobject) hängt.
|  | |  Erstellen von Animationen in 3. Programmen Das importierte File wird dann per default abgespielt. Problem bei der Animation ist, dass die Animation immer beim 3dProgramm startet.
|  | |  Erstellen von Animationen direkt in Unity3D Unity stellt die Möglichkeit zur Verfügung direkt im Programm Animationen zu erstellen. | | | | | | | |  Kontrolle von Animationen per Script |  | | Objekt-Hierarchie wird korrekt abgespielt (ansonsten springt die Animation beim Spielmodus in den Nullpunkt
 | | | | | Animationskomponente
 | | | | |  Zugriff über die Componente animation animation.Play(); // animation.Play("take"); animation.Stop();
// Animation animation.GetClipCount() animation.Play("walking"); animation.Play("looking"); animation.Play("jumping");
// Art der Wiederholung animation.wrapMode = WrapMode.Loop; animation.wrapMode = WrapMode.Once: animation.wrapMode = WrapMode.Loop: animation.wrapMode = WrapMode.ClampForever:
// Stop animation.Stop();
// Blend / Change animation.Play("looking");
animation.CrossFade("jump", 0.2); animation.Blend("jump", 0.2);
// Animationen / Clips animation.GetClipCount() animation["jump"].speed=1.0; // slower < 1.0 normal - > 1.0 faster animation["jump"].normalizedTime=1.0; animation["jump"].length
// Animation Einzelbild zeigen // zwischen: 0-timeAnimation-animation["walking"].length animation.Play("walking"); animation.wrapMode = WrapMode.Loop; animation["walking"].normalizedTime=timeAnimation; animation["walking"].time=timeAnimation; animation.Sample();
|  | | das Objekt mit dem Animationsobjekt und den Animationen (AnimationStates)
 | | | | |  Animation API # Variables clip The default animation. playAutomatically Should the default animation clip (Animation.clip) automatically start playing on startup. wrapMode How should time beyond the playback range of the clip be treated? isPlaying Are we playing any animations? this [string name] Returns the animation state named name. animatePhysics When turned on, animations will be executed in the physics loop. This is only useful in conjunction with kinematic rigidbodies.
# Functions Stop Stops all playing animations that were started with this Animation. Rewind Rewinds the animation named name. Sample Samples animations at the current state. IsPlaying Is the animation named name playing? Play Plays the default animation. The animation will be played abruptly without any blending. CrossFade Fades the animation with name animation in over a period of time seconds and fades other animations out. Blend Blends the animation named animation towards targetWeight over the next time seconds. CrossFadeQueued Cross fades an animation after previous animations has finished playing. PlayQueued Plays an animation after previous animations has finished playing. AddClip Adds a clip to the animation with name newName. RemoveClip Remove clip from the animation list. GetClipCount Get the number of clips currently assigned to this animation SyncLayer Synchronizes playback speed of all animations in the layer. |  | |  Animationsstate # Variables enabled Enables / disables the animation. weight The weight of animation wrapMode Wrapping mode of the animation. time The current time of the animation normalizedTime The normalized time of the animation. speed The playback speed of the animation. 1 is normal playback speed. normalizedSpeed The normalized playback speed. length The length of the animation clip in seconds. layer The layer of the animation. When calculating the final blend weights, animations in higher layers will get their weights clip The clip that is being played by this animation state. name The name of the animation blendMode Which blend mode should be used? Functions AddMixingTransform Adds a transform which should be animated. This allows you to reduce the number of animations you have to create. | | | |
| | |
| | | |  Animationen steuern | | | | |  Beispiele |  | |  Walking |  | |  Vorhandene Animationen "walking" "looking" "jumping" | | | | | Als Prefab importiert
 | | | | |  Anwendung animation.Play("walking"); animation.Play("looking"); animation.Play("jumping");
| | | | |  InScene-Button zum Abspielen einer Animation function OnMouseDown() { var object2=GameObject.Find("lebendevase"); object2.animation.Play("looking"); } | | | | |  Animation stoppen und neue abspielen function OnMouseDown() { var object2=GameObject.Find("lebendevase"); object2.animation.Stop(); object2.animation.Play("looking"); } | | | | |  Überblend-Button function OnMouseDown() { var object2=GameObject.Find("lebendevase"); object2.animation.CrossFade("jump", 0.2); } | | | |
| | |
| | |
| | |
| | |
| | |
|  12. Scripting: Levels, Programm |  | |  Applikation starten / beenden / www Application.Quit(); Application.CaptureScreenshot("Screenshot.png"); Application.OpenURL ("http://unity3d.com/");
Application.platform: RuntimePlatform.WindowsPlayer | | | | |  SplashScreens, Logo, Levels ... Unterteilen des Projektes in verschiedene Projektdateien |  | | /File/Builds Settings ...
 | | | | | Hinzufügen der Projekte (Index-0: Start Projekt)
 | | | | |  LoadLevel: Application.LoadLevel("Breakout"); if (Input.GetKey ("space")) { print("let's go to the game"); Application.LoadLevel("Breakout"); } | | | | |  Variablen, Methoden über das Projekt in den nächsten Level ziehen DontDestroyOnLoad (this);
var cubeObj=GameObject.Find("Cube"); DontDestroyOnLoad(cubeObj);
(dabei wird das Objekt und alle angehängten Objekte nicht gelöscht) | | | |
| | |
| | |
|  14. Scripting 3D-Meshes/Objekte erstellen | | | |
|  15. Scripting: dynamische Texturen |  | |  RenderTexturen Texturen, die in Echtzeit erstellt werden. Etwa um eine Übersicht zu generieren mit einer zweiten Kamera (Rückspiegel) |  | |  Rückspiegel oder Cameraeinstellung auf einer Texture |  | | Create Render Texture
 | | | | | Camera erstellen, die die Daten für die Texture rendert
 | | | | | Cameraeinstellung > Render to Texture
 | | | | | Zwei Camera Positionen - eine rendert auf die RenderTexture
 | | | | | RenderTexture ist auf zwei Wuerfel angewendet und als GuiTexture eingefügt (rot)
 | | | |
| | |
| | | |  Texturen modifizieren, generien, nachladen (zum Beispiel aus dem Netz) |  | |  WWW.LoadImageIntoTexture
var url = "http://images.earthcam.com/ec_metros/ourcams/fridays.jpg";
function Start () { renderer.material.mainTexture = new Texture2D(512, 512); while(true) { // Start a download of the given URL var www = new WWW (url); // wait until the download is done yield www; // assign the downloaded image to the main texture of the object www.LoadImageIntoTexture(renderer.material.mainTexture); } } |  | 0 [...]WWW[...] |  von einem File laden url="file:///Users/itz/Desktop/test.png"; | | | |
| | | |  Direkt in Texturen Pixel setzen und lesen |  | |  TextureScript var texture : Texture2D;
function Start() { texture = Instantiate(renderer.material.mainTexture);
}
function Update () { // im fullscreen anschauen! renderer.material.mainTexture = texture;
var col= new Color( 1.0, 0.0, 0.0 ); for (var tt=0;tt<10;tt++) { for (var t=0;t<200;t++) { texture.SetPixel(t+80,tt,col); } } texture.Apply( );
} | | | | |  siehe Referenz > Möglichkeit die Texture einzufärben | | | |
| | | |  Aus Byte[] Array ein Bild generieren // Load a .jpg or .png file by adding .txt extensions to the file // and dragging it on the imageTextAsset
var imageTextAsset : TextAsset; function Start () { var tex = new Texture2D (4, 4); tex.LoadImage(imageTextAsset.bytes); renderer.material.mainTexture = tex; } | | | | |  texture ändern var obj:GameObject; var tex:Texture2D;
function Start() { obj.renderer.material.mainTexture=tex; } | | | | | | | |  Bilder aus dem Web(Webcamera) oder von einem File als Texture function Start () {
var url = "http://www.and-or.ch/imgs/and-or.jpg"; url="file://Volumes/RamDisk/test.png";
// url="file:///Users/itz/Desktop/test.tiff";
url="file:///Users/itz/Desktop/test.png";
// url="file:///Users/itz/Desktop/eco.jpg";
renderer.material.mainTexture = new Texture2D(320, 200); while(true) { // Start a download of the given URL var www = new WWW(url); // wait until the download is done yield www; // assign the downloaded image to the main texture of the object www.LoadImageIntoTexture(renderer.material.mainTexture); }
/* var tex = new Texture2D (5, 5); var col =Color.white; // new Color.Lerp(0.0,0.0,1.0); for (var t=0;t<3;t++) { tex.SetPixel( t, 1, col ); } tex.Apply(); renderer.material.mainTexture = tex; */ } | | | |
| | |
|  16. Scripting: Web |  | |  Webzugriff / Scores etc |  | | var highscore_url="http://www.la1n.ch";
function Start() { // Create a form object for sending high score data to the server var form = new WWWForm(); // Assuming the perl script manages high scores for different games form.AddField( "game", "MyGameName" ); // The name of the player submitting the scores form.AddField( "playerName", "GOD" ); // The score form.AddField( "score", 115 );
// Create a download object var download = new WWW( highscore_url, form );
// Wait until the download is done yield download; if(download.error) { print( "Error downloading: " + download.error ); } else { print("done");
// show the highscores print(download.data); // download.data; // http://unity3d.com/support/documentation/ScriptReference/WWW.html // Text is a mesh var GameObjectText=GameObject.Find("WebText"); var TextMeshObj=GameObjectText.GetComponent("TextMesh"); TextMeshObj.text=download.data;
} }
function Update () { } | | | |
| | |
| | |
|  xx. Multithreading |  | |  Threads / Multithreading / Coroutines |  | |  Threads in C#/Mono Threads erstellen in Mono und dort ausführen. Beispiele in UDP-Receive Thread. | | | | |  Coroutinen in Unity3d (etwa Laden von Images etc) |  | |  Beispiele
// Momente Warten yield new WaitForSeconds(5);
| | | |
| | |
| | |
| | |
|  XX. Editor als Leveleditor - Gizmos - eigene Menus |  | |  Gizmos function OnDrawGizmos() { Gizmos.DrawIcon(transform.position, "Picturex.png"); }
// selected function OnDrawGizmosSelected() { Gizmos.color = Color.green; Gizmos.DrawSphere (transform.position, 2); Gizmos.DrawWireCube (transform.position, Vector3 (1,1,1)); } | | | | |  Gizmos - Icons - Darstellen von Leveln - besser anwählbar machen
WICHTIG! # Icons müssen im Ordner /Gizmos/ in Assets abgelegt sein, sonst erscheint nur ein weisses Viereck! |  | | Visualisierung und Interaktion: Gamerelevante Infos
 | | | | | Gizmos-Icons in einem eigenen Folder-root
 | | | | |  Einbinden (wenn es immer angzeigt werden soll) function OnDrawGizmos() { Gizmos.DrawIcon(transform.position, "action.png"); } | | | |
| | | |  Eigene Menus Eigene Menus erstellen |  | | Eigenes Menu: Bsp: AdventureKit
 | | | | | Editormenuscripts müssen im Editor-Ordner sein (sonst seltsame Fehler)
 | | | | |  editormenu.js
@MenuItem ("AdventureKit/Adventure Kit is a simple kit for adventure", true) static function DoNothing() { return false;} @MenuItem ("AdventureKit/Generate a totale new level") static function GenerateLevel(){}
@MenuItem ("AdventureKit/ ") static function Nope(){}
// look for all all prefabs @MenuItem ("AdventureKit/AddOnClick") static function AddOnClick() { // selections .. // Selection.transforms
// add a prefab for (var transform in Selection.transforms) { // add a prefabtransform.gameObject.AddComponent(name); // transform.gameObject.AddComponent(name); } }
| | | |
| | |
| | |
|  xx. Scripting: Pluginprogramierung |  | |  Plugin Programmierung Plugin können in C Programmiert werden und anschliessend eingebunden werden. | | | |
| | |
|  Spielfiguren (NPC's oder Spezialfall Avatar) |  | |  Kontrollierte Figuren Eine gravitationsabhängige Figur in einer 3D-Engine erfüllt mehrere Funktionalitäten: - Bewegungsabfragen - "Realwelt-Physik": Bewegung wird gestoppt wenn man an ein Hindernis gerät (Bewegung vorberechnen und kollidieren oder nachträglich korrigieren) - Steps (Gehen über kleinere Hindernisse) - Status eines Objektes: In der Luft, stehend auf einem Objekt - Gravitationssimulationen (Sprünge) - Eigene Kollisionen |  | | Reale Gegenstände, Steps, Jump
 |  | ![Einen Kommentar (einer Stelle[markiert]) hinzufügen](imgs/iconaddobject.gif) |  Reale Welt > Viele Gegenstände kollidierbar ohne Probleme (vs Shooter) Verlagerung der GameMechanik auf NPCS etc | | | |
| | | |  |  | ![Einen Kommentar (einer Stelle[markiert]) hinzufügen](imgs/iconaddobject.gif) |  Einfacher Character Controller |  | | CharacterControllerProgrammierung
 | | | | |  SimpleCharacterAvatar.js /*
Simple Character Avatar
*/
var speed = 1; var jumpSpeed = 8.0; var gravity = 20.0;
private var moveDirection = Vector3.zero; private var grounded : boolean = false;
function OnControllerColliderHit (hit : ControllerColliderHit) { // CharacterController.OnControllerColliderHit.html /* controller The controller that hit the collider collider The collider that was hit by the controller rigidbody The rigidbody that was hit by the controller. gameObject The game object that was hit by the controller. transform The transform that was hit by the controller. point The impact point in world space normal The normal of the surface we collided with in world space moveDirection Approximately the direction from the center of the capsule to the point we touch. moveLength */ // hit? // print(hit); // hit from which direction? // print(hit.moveDirection);
// hitted object print(hit.gameObject.name);
}
function OnTriggerEnter (other : Collider) { // Destroy(other.gameObject); print("OnTriggerEnter "+other.gameObject); }
// house keeping functions function FixedUpdate() {
// grounded if (grounded) { moveDirection=new Vector3(0.0,0,0); // wasd / cursors if ((Input.GetKey("left"))||(Input.GetKey("a"))) { moveDirection.x=-speed; } if ((Input.GetKey("right"))||(Input.GetKey("d"))) { moveDirection.x= speed; } if ((Input.GetKey("up"))||(Input.GetKey("w"))) { moveDirection.z= speed; } if ((Input.GetKey("down"))||(Input.GetKey("s"))) { moveDirection.z=-speed; } // rotate q / e if (Input.GetKey("q")) { transform.Rotate(0.0,-3.0,0.0); } if (Input.GetKey("e")) { transform.Rotate(0.0, 3.0,0.0); } // jump if (Input.GetKey("space")) { if (grounded) { moveDirection.y = jumpSpeed; } } }
// Move direction moveDirection = transform.TransformDirection(moveDirection); moveDirection *= speed;
// Apply gravity moveDirection.y -= gravity * Time.deltaTime; // Move the controller var controller : CharacterController = GetComponent(CharacterController); var flags = controller.Move(moveDirection * Time.deltaTime); grounded = (flags & CollisionFlags.CollidedBelow) != 0; }
@script RequireComponent(CharacterController) | | | |
| | |
| | | | CharacterController im Einsatz (CharacterController wird automatisch gebildet)
 | | | |
|  CharacterController | | | |
| | | |  NPCs (mit Character Controller) Wie benutzt man NPC? NPCs für Adventures, Strategiespiele, FPS, Jump and Run?
CharacterController ist dabei der Ausgangspunkt. Eine Anwendung direkt vom Spieler gesteuert, zeigt /Scripts/FPSWalker.js
|  | | Aufbau
 |  | ![Einen Kommentar (einer Stelle[markiert]) hinzufügen](imgs/iconaddobject.gif) | In der UpdateFunktion die Logik
 | | | |
| | | | Aufbau NPC mit Character Controller
 | | | | |  Einfacher NPC |  | ![Einen Kommentar (einer Stelle[markiert]) hinzufügen](imgs/iconaddobject.gif)
|  Simplester NPC geht nach rechts /* NPC Simple runs in one direction */
var speed = 6.0; var jumpSpeed = 8.0; var gravity = 20.0;
private var moveDirection = Vector3.zero; private var grounded : boolean = false;
function OnControllerColliderHit (hit : ControllerColliderHit) {
}
function FixedUpdate() { if (grounded) { // move to (1,0,0) moveDirection=new Vector3(0.2,0,0); moveDirection = transform.TransformDirection(moveDirection); moveDirection *= speed;
// jump // moveDirection.y = jumpSpeed; }
// Apply gravity moveDirection.y -= gravity * Time.deltaTime; // Move the controller var controller : CharacterController = GetComponent(CharacterController); var flags = controller.Move(moveDirection * Time.deltaTime); grounded = (flags & CollisionFlags.CollidedBelow) != 0; }
@script RequireComponent(CharacterController) | | | |
| | | |  NPC Random Walker |  | | NPC Random ... alle Sekund ein Richtungswechsel (bei Kollision Richtungswechsel einschaltbar)
 | | | | | | | |  NPCFollowers der einem GameObject folgt Das verfolgte Object muss angegeben werden als Member! |  | ![Einen Kommentar (einer Stelle[markiert]) hinzufügen](imgs/iconaddobject.gif) | Angabe des zu Verfolgenden
 | | | | | Einige Verfolger
 | | | | |  NPCFollower.js /* Simple NPC that follows a person // class-CharacterController.html // CharacterController.html */ var speed = 6.0; var jumpSpeed = 8.0; var gravity = 20.0;
private var moveDirection = Vector3.zero; private var grounded : boolean = false;
// new var followThisObject:GameObject;
function Start() { jumpSpeed=Random.Range(6,12); }
// on controller function OnControllerColliderHit (hit : ControllerColliderHit) { // CharacterController.OnControllerColliderHit.html /* controller The controller that hit the collider collider The collider that was hit by the controller rigidbody The rigidbody that was hit by the controller. gameObject The game object that was hit by the controller. transform The transform that was hit by the controller. point The impact point in world space normal The normal of the surface we collided with in world space moveDirection Approximately the direction from the center of the capsule to the point we touch. moveLength */ }
// behavior function FixedUpdate() { // on the ground if (grounded) { // movedirection ? moveDirection=new Vector3(0.0,0.0,0); if (followThisObject!=null) { // print("search it .. "); moveDirection=this.transform.position-followThisObject.transform.position; moveDirection=moveDirection.Normalize(moveDirection); // distance var dist=Vector3.Distance(followThisObject.transform.position,this.transform.position); // dist? if (dist>0.1) { // go into this direction moveDirection=moveDirection*(-1); moveDirection = transform.TransformDirection(moveDirection); moveDirection *= speed;
// moveDirection.y = jumpSpeed; } // dist } } // on ground?
// Apply gravity moveDirection.y -= gravity * Time.deltaTime; // Move the controller var controller : CharacterController = GetComponent(CharacterController); var flags = controller.Move(moveDirection * Time.deltaTime); grounded = (flags & CollisionFlags.CollidedBelow) != 0;
}
@script RequireComponent(CharacterController) | | | |
| | | |  NPCFollowerDistance - Wartender Einer der aufs abholen wartet und zurückfällt, wenn man sich zu weit von ihm fortbewegt. | | | |
| | | |  Erstellen einer FirstPersonPerspektive übergordnetes Objekt (FirstPerson) an ihm hängt die Kamera und der "Body" |  | |  Einfügen 1. (falls nicht schon vorhanden) Import Package Standard 2. /Project/Standard Assets/Preftabs/FirstPersonController > in die Hierarchie ziehen 3. Terrain erstellen (sonst fällt der Player ewig) | | | | | Der Player steht in der Luft (mit Kamera)
 | | | |
| | |
| | |
|  Spielwelten / Maschinen / Automaten |  | |  Kontrollerbasiertes Beispiel (in Unity) Ein Objekt kontrolliert alle anderen | | | | |  Eventbasierte Programmierung | | | | |  Eigene kybernetische GameMaschinchen | | | |
| | |
|  Spielwelten extern (Tutorials etc) |  | |  Implementierte Gamekonzepte (& Tutorials) | | | | |  Erstellen einer first Person Walk-Through-Welt |  | |  First Person Shooter PDF Teil 2 | | | |
| | | |  Jump&Run-Beispiel | | | |
| | |
|  Topics/Themen |  | |  Sich um einen Planeten/Kugel bewegen mit Quaterionen |  | |  Objektscript für einen Satelitten oder Mond (Angehönt an einen Zentralkörper) var geo_laenge : float = 0.0; var geo_breite : float = 0.0;
function Update() { var dt : float = Time.deltaTime; FliegUmDieErde_Quaternion(dt); //FliegUmDieErde_Euler(dt); }
function FliegUmDieErde_Quaternion (dt : float) { var dx : float = Input.GetAxis("Horizontal") * 100.0 * dt; var dy : float = Input.GetAxis("Vertical") * 100.0 * dt; var dz : float = 0;
if (Input.GetKey(KeyCode.Y)) dz = -1;
if (Input.GetKey(KeyCode.X)) dz = 1;
transform.parent.Rotate(transform.right, dy, Space.World); transform.parent.Rotate(transform.up, -dx, Space.World); transform.parent.Rotate(transform.forward, -dz, Space.World); } | | | |
| | |
|  Rotate-Winkel direkt angeben transform.localEulerAngles.x=0.0; transform.localEulerAngles.y=0.0; transform.localEulerAngles.z=90;
| | | |
| | |
|  xx. Scripting: Sound |  | |  GameObject mit einem angehängten Sound |  | | 0. Add an empty Object
 | | | | | 1. AudioRessource anhängen
 | | | | | 2. SoundObject ist eine Componente (hineindragen)
 | | | | |  3. Sound abspielen (einmal oder in der udpateversion endlos) |  | | function Update () { audio.Play(); } | | | |
| | | |  4. Abspielen, warten bis Sound gespielt ist |  | |  AudioSource volume The volume of the audio source. pitch The pitch of the audio source. time Playback position in seconds. clip The default AudioClip to play isPlaying Is the clip playing right now (Read Only)? loop Is the audio clip looping? ignoreListenerVolume This makes the audio source not take into account the volume of the audio listener. playOnAwake If set to true, the audio source will automatically start playing on awake minVolume The minimal volume the audio source will play at. maxVolume The maximum volume the audio source will play at. rolloffFactor How fast the sound fades. velocityUpdateMode Whether the Audio Source should be updated in the fixed or dynamic update. Functions Play Plays the clip. Stop Stops playing the clip. Pause Pauses playing the clip. PlayOneShot Plays an AudioClip. | | | | |
function Update () { if (!audio.isPlaying) { audio.Play(); } } | | | |
| | | |  5. PitchUp
var pitchLevel=0.0;
function Start() { }
function Update () { pitchLevel=pitchLevel+0.01; audio.pitch = pitchLevel; if (!audio.isPlaying) { audio.Play(); } } | | | | |  6. Volume setzen
var volumeLevel=0.0;
function Start() { }
function Update () { volumeLevel=volumeLevel+0.01; audio.volume = volumeLevel; if (!audio.isPlaying) { audio.Play(); } } | | | | |  7. Abspielen und warten
var otherClip: AudioClip;
function Start() { // Play default sound audio.Play(); // Wait for the audio to have finished yield WaitForSeconds (audio.clip.length); // Assign the other clip and play it audio.clip = otherClip; audio.Play();
}
function Update () { } | | | |
| | | |  FMOD: Sound Extended FMOD is a commercial audio library made by Firelight Technologies that plays music files of diverse formats on many different platforms. It is used in games and software applications to provide audio functionality. FMOD supports a range of audio formats and numerous different operating system platforms. Prior to version 3.75, the library was named simply as FMOD. Since then, the FMOD sound system has been redesigned and now contains three main parts: FMOD Ex, the low-level sound engine FMOD Event System, more abstract, higher level application layer to simplify play back content created with FMOD Designer FMOD Designer, the sound designer tool used for authoring complex sound events and music for playback The FMOD sound system has an advanced plugin architecture, that can be used to extend the support of audio formats or to develop new output types, e.g. for streaming. |  | |  FMOD Sounddesigner Der Fmod Sounddesigner (frei downloadbar) ermöglicht es Soundscapes zu erstellen und direkt Sound zu platzieren und sich im 3d-Raum zu bewegen. | | | |
| | |
| | |
|  xy. SkyBox |  | | SkyBox aktivieren > RenderSettings rechte Seite
 | | | | | Kopiere SkyBox 5 Ansichten
 | | | |
| | |
|  Heightmap und Texturierung |  | |  Terrain |  | |  Logik (Logik des Geländes der Welt sollte stimmen!) Logik - ermöglicht es für den Spieler, dass er einfach lernt, wie die Welt funktioniert? Er muss nicht alles neu lernen! Logik übernehmen oder neu Gesetzte kreieren.
- Art der Berge (Spitzige Berge sind weich, flache Berge sind hartes Gestein - Matterhorn) - hartes Gestein wird nur schwer abgebaut und nicht schnell weggeschwemmt! - Einfluss des Gebirges, Verwerfungen: Alpen, Mittelland, Meer (immer Flächer, vgl. Jura)
- Vegetation (Bäume, Folliage) -- Abhängig vom Boden (Saurer Boden etc) -- Abhängig von der Exposition (Regeln: Südhänge so und so, Nordhänge so und so, Vegetation nur auf gewissen Höhen) -- Abhängig von der Kultur (Menschlich, Viehzucht, keine Bäume, nur an Randregionen)
- Orte kreieren: spitzige Berge (Regelmässige Wiederholungen deuten auf Technologie hin) | | | | | Terrain kreieren
 | | | | |  Terrain Bearbeitungsmöglichkeiten - Terrain-Edit - Terrain-Texturierung - Terrain-Trees - Terrain-Foliage |  | | Möglichkeiten (Angewählt Terrain anheben)
 | | | |
| | | | Terrain texturieren: Verschiedene Texturen in verschiedenen Grössen (Grösse kann beim HInzufügen auch variert werden!)
 |  | ![Einen Kommentar (einer Stelle[markiert]) hinzufügen](imgs/iconaddobject.gif) | Texturieren von Schatten ebenfalls mit Vorteil schon beim Terrain, Einzigartigkeiten erstellen!
 | | | |
| | | | Bäume & Foliage
 | | | |
| | |
| | |
|  xy. Shaders / Transparenzen
|  | |  Einfache Transparenzen / wo man hinsieht // raycast var hits : RaycastHit[]; hits = Physics.RaycastAll (transform.position, transform.forward, 100.0);
// Change the material of all hit colliders // to use a transparent Shader for (var i=0;i { var hitx : RaycastHit = hits[i]; var renderer = hitx.collider.renderer; if (renderer) { renderer.material.shader = Shader.Find("Transparent/Diffuse"); renderer.material.color.a = 0.3; } }
| | | |
| | |
|  yz. CameraProblem Im 3rdPerson-Mode kommt die Kamera in Objekte hinein oder Objekte verhindern die direkt Sicht auf den Avatar.
1. Lösung A: Transparentsetzen der Objekte 2. Lösung B: Kamera in Richtung Avatar schieben, bis die Kamera vor dem Objekt zu liegen kommt und nicht mehr ist zwischen Camera und Avatar. |  | | Lösung A: Etwas steht im Weg in der 3rsd Person View: Transparent machen der Objekte
 | | | |
| Ein Objekt verdeckt die Sicht auf den Avatar (3rd Person): Ein Algorithmus
 | | | |
| | |
|  9. Unity und Netzwerkspiele Unity ist nicht von Grund auf auf Netzwerkspiele konzipiert wie etwa Torque oder Unreal. In Unity3d ist es möglich autorative (Zentralserver mit Thumb-Clients) wie auch non-autorative Server (Zentralserver mit "intelligenten" Clients) zu erstellen. Wichtigste der Unity3d Netzwerkerweiterung sind dabei: (Ein Unity3d Game kann nur entweder Server oder Client.) |
|