| In ein normales Fenster verwandeln  | close  
> gametheory.ch - swiss gamedesign (elearning & knowhow at gamedesign.zhdk.ch [zürcher hochschule der künste])> GAMEDESIGN: Programmierung & GameEngines> Game-Development (3D-Gameengines)> Unity3D

Unity3D

Mac(Entwicklungsumgebung)/PC, Single User, Standalone & Browser, Physik Shaderengine (Preise: free / 500$ edu / 1400$ ) Version 3.o
Trial: 30 Tage für Pro
 
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen


< http://unity3d.com/
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

< Unity3d-iPhone findet man hier >
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

1. Software Unity3d (Editor)
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

Programm-GUI
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen
Wichtigste Elemente: Scene, Game, Hierachy, Project & Inspector
Wichtigste Elemente: Scene, Game, Hierachy, Project & Inspector
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

Bedienung (ohne Maus mit Scrollrad nicht bedienbar!)

- Maus & Scrollrad: rein & rauszoomen
- Maus & Apfel-Taste: drehen im Raum

- Space: vergrössern des aktuellen Bereichs
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

2. Unity Aufbau (Technik)
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

Wichtigste Unterscheidungen in Unity3D

- Assets (Anlagen, Templates)
- GameObjects (Objekte im Game - Grundklasse
- Components (Shaders, Scripts) (An GameObjects attachbare Componenten)
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

Erstellen eines Objektes (GameObjektes):

1. GameObjects
2. Auswählen des Objektes
3. Erstellen
4. Components hinzufügen
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen
GameObjekte
GameObjekte
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen
Komponenten (zusätzliche Funktionalität attributiert)
Komponenten (zusätzliche Funktionalität attributiert)
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen
Assets (wiederverwendbar in verschiedenen Projekten)
Assets (wiederverwendbar in verschiedenen Projekten)
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

( 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)
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

< http://unity3d.com/support/documentation/Manual/Prefabs.html
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen
Create Prefabs
Create Prefabs
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen
Prefab leer - ohne GameObject
Prefab leer - ohne GameObject
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen
Neues Prefab mit Kapsel-GameObjekt
Neues Prefab mit Kapsel-GameObjekt
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

Objekte von Unity3D
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

Würfel (fallendes Objekt)

Component RidigBody hinzufügen
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen
Pysikalisch fallender Würfel
Pysikalisch fallender Würfel
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen
Material im Inspector eingestellt
Material im Inspector eingestellt
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

Terrain
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen
Create Terrain
Create Terrain
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen
Terrain anheben, senken, texturieren (angewählt), trees (hinzufügen zuerst), foliage
Terrain anheben, senken, texturieren (angewählt), trees (hinzufügen zuerst), foliage
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen
Texture hinzufügen
Texture hinzufügen
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

Kamera

Kameras haben wie üblich brennweite etc und in diesem Fall lässt sich die Hintergrundfarbe auch hier einstellen.
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen
Defaults Componenten (Members)
Defaults Componenten (Members)
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen
Ein Script das einem Objekt folgt (in diesem Fall dem Cubus von oben)
Ein Script das einem Objekt folgt (in diesem Fall dem Cubus von oben)
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

Verschiedene Kameraskripts findet man unter

/Project/Standard Assets/Camera Scripts/
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

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")
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen
Erste Kamera für Splitscreen (auch x-Screen sind möglich!)
Erste Kamera für Splitscreen (auch x-Screen sind möglich!)
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

Rendering verändern

- Nur gewisse Dinge Rendern
- Minimaps ohne bewegliche Objekte
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen
Layer fürs Rendern angeben (oder neuen Renderer erstellen)
Layer fürs Rendern angeben (oder neuen Renderer erstellen)
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen
Pro Camera angeben welche Layers gerendert werden sollen
Pro Camera angeben welche Layers gerendert werden sollen
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

Einfachstes Debug

1. Window > Console
2. print("xyz"); ermöglicht einfache Ausgabe auf die Konsole
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

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");
}

Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

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
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

Skybox
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

< http://unity3d.com/support/documentation/Manual/HOWTO-UseSkybox.html
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen
Anwenden: Edit > RenderSettings (erscheint rechts im Inspector!!!!)
Anwenden: Edit > RenderSettings (erscheint rechts im Inspector!!!!)
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

3. Erstellen von Objekten
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

Erstellen eines Objektes

1. Menu: GameObject > Create Other > Cube  
2. Inspector: ändern der Daten (Material Änderung unter Mesh Renderer)
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen
Objekt im Editor und Gameansicht
Objekt im Editor und Gameansicht
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

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
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

1. Material: Farben
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen
Create Material
Create Material
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen
Anfügen des Materials, ändern der Main-Color
Anfügen des Materials, ändern der Main-Color
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

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));

Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

2. Texture
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

Texture direkt auf das Objekt ziehen
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

Objekt aktiveren und deaktiveren per Skript


gameObject.active=false;
gameObject.active=true;

// recursive
gameObject.SetActiveRecursively(false);
gameObject.SetActiveRecursively(true);

Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

3d-Objekte

angeblich erstellbar in fast allen Programmen ohne spezielles Konvertieren etc.
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

< http://unity3d.com/unity/features/asset-importing
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

Maya

.ma  (nicht exportierbar mit PersonalLimtedE oder?)
.mb (nicht exportierbar mit PersonalLimtedE oder?)
.mp (! funktioniert nicht)

Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

Import aller gängigen Formate

- 3ds
- fbx
- jas
etc
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen
Objekte werden in GameObjekte verwandelt mit der Componente Mesh
Objekte werden in GameObjekte verwandelt mit der Componente Mesh
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

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));
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen
1. Create an Empty GameObject
1. Create an Empty GameObject
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen
2. Zusatz: der Linerenderer
2. Zusatz: der Linerenderer
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen
3. Constrution mit Script
3. Constrution mit Script
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

LineRenderAnimated



Hierarchien erstellen

Nachfolgende Knoten "erben" die Koordinaten / Rotation (Nutzbar für Lichter, Partikel etc)
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

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.
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

var GameObjectText=GameObject.Find("StatusText");
var TextMeshObj=GameObjectText.GetComponent("TextMesh");
TextMeshObj.text="Loading Text (Status)";
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen




4. Skripting: Allgemein
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

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.
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

TimeManager kontrolliert auch die physikalische Abfrage der Objekte (Intervall)

>> Siehe interne Referenz
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen
Edit > Settings > ProjectsSettings > Time (TimeManager)
Edit > Settings > ProjectsSettings > Time (TimeManager)
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

Zeit auslesen seit Start

// Simulationtime
print(Time.time);
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

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)
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

Javascript

// 1. Find Object
var objt=GameObject.Find("GameControllerObject");
// 2. Do Methode: getObj();
objt.GetComponent("GameController").getObj();
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

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();

Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

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" )
}
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

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
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

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.
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

die Update-Methode


function Update () {

transform.Rotate(0, 5 * Time.deltaTime, 0);
transform.Translate(0, 0, 2 * Time.deltaTime);
       print("rotateAndTransform.udpate()");
}
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

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);
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

// velocity (geschwindigkeit - rigidbody)
rigidbody.velocity

// forward (looking)
transform.forward
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen
Komponente beim Objekt einfügen
Komponente beim Objekt einfügen
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen
Let's play
Let
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

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 ..
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen
Im Editior parameterisierbar
Im Editior parameterisierbar
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

5. Skripting: Input
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

Input: Keyboard/Mouse - Objekt auf Tastatur-Input verschieben
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

< Referenz zu den Input Möglichkeiten von Unity3D
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

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);
   }


}
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

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;
}
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

WiiRemote Integration

Bis zu 16 verschiedene WiiMotes möglich!!
Siehe Integration.
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

6. Scripting: Objekte finden (Find, Raycast)
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

Objekte finden (hierarchieabhängig oder rekursiv durch das Projekt)
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

< Unity3D Referenz
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen


// über alles
// By name
   var go = GameObject.FindSearch in deep (mittels eines Baumes)("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;
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen  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);
}
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

Tags erstellen
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen
ein Extra taggen
ein Extra taggen
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen
Einfügen eines Elements rechts!
Einfügen eines Elements rechts!
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

Hierarchie-Up - Root-Element

// Root-GameObject
var obj=transform.root.gameObject
print(obj.name);

// avatar
// \__
//      \____abc
// avatar=transform.root.gameObject

Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

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));
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

Raycast (3D-Finden)
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen
Spiel: Verberge ein Objekt dahinter
Spiel: Verberge ein Objekt dahinter
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

RaycastHit


RaycastHit.point
RaycastHit.distance
RaycastHit.normal


Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

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);
}
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

Siehe auch Umwandlung WorldToScreen - ScreenToWorld oder Viewport

var screenPosXXX = camera.WorldToScreenPoint (xxx.transform.position);
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

Linecast (etwas dazwischen?)

if (!Physics.Linecast (transform.position, target.position)) {
       // do stuff
   }
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

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;
      }
  }
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen  0  [...]Transparent[...]

Alpha
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

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);
}
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

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);
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

RaycastAll - Mouse to WorldPoint

var vecDirection=cameraPointOnScreen-cameraPoint;
if (debugThis)
{
Debug.DrawRay(cameraPoint, vecDirection.normalized*10.0, Color.red);
}
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

7. Skripting: Kollisionen
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

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
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

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

Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

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
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

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();
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

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;
}
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

Trigger

Trigger reagiert auf die Kollision eines Körpers mit RidigBody auf das TriggerObject.
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen
TriggerObject: Componenten(Collider & isTrigger) + TriggerScript
TriggerObject: Componenten(Collider & isTrigger) + TriggerScript
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

TriggerScript


function Update () {
}

function OnTriggerEnter(trigger : Collider)
{
  // Debug-draw all contact points and normals
  print("OnTriggerEnter");
 
}
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen
Objekt, das collidiert muss einen RigidBody besitzen
Objekt, das collidiert muss einen RigidBody besitzen
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

Kollision (zwei Objekte mit Collider und/oder Ridigbody)
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

8. Scripting: Physics
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

Physics - RidigBody (Starre Körper Physik)

Einstellungen über Physic wie etwa Gravitation

Edit > Settings > Physics (Manager)
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

< http://unity3d.com/support/documentation/ScriptReference/Rigidbody.html
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

Fallende Objekte - RigidBody anhängen

Component > Physics > RidgidBody

Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

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
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen
Wie aneinander gebunden - ein unsichtbares Band
Wie aneinander gebunden - ein unsichtbares Band
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

Constant Force

konstante bzw sich abschwächende Krafausübung anhängen
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen
direkt oder relativ?
direkt oder relativ?
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

Kräfte anwenden auf einen Körper


1. Rigid Body hinzufügen
2. Scripting

rigidbody.AddForce(10,0, 0);

// direkt setzen
rigidbody.velocityPhysik zurücksetzen.x=0;
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

< http://unity3d.com/support/documentation/ScriptReference/Rigidbody.AddForce.html
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen
 1  [...]velocity[...]

Physik zurücksetzen

rigidbody.velocity=new Vector3(0,0,0);
rigidbody.angularVelocity=new Vector3(0,0,0);
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

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
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

Rigid-Body anhängend aber isKynematic=true

// on Collision

transform.Find("ball").rigidbody.isKinematic=false;
transform.Find("ball").rigidbody.WakeUp();
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

9. Scripting: Objekte erstellen on the fly
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

Objekt zur Laufzeit erstellen (für Schüsse etc)

Erstellen von neuen Objekten nutzen Prefabs.


Prefabs: They are a collection of predefined GameObjects & Components that are re-usable throughout your game. Clones the object original and returns the clone.

: Any game object which you know you’ll need to instantiate at run-time should
generally be a prefab


Nähres siehe weiter oben .. Prefabs
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

< Grundlage
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

GameObjekte von Hand erzeugen und einbinden (Grundsätzlich ohne vorgefertigte Prefabs)

function Start () {
   for (var y = 0; y < 5; y++) {
       for (var x = 0; x < 5; x++) {
           var cube = GameObject.CreatePrimitive(PrimitiveType.Cube);
           cube.AddComponent(Rigidbody);
           cube.transform.position = Vector3 (x, y, 0);
       }
   }
}
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

Prefabs instanzieren (komplexere Objekte)
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

Kreation und Instanzierung eines Prefabs

1. Generiere ein Prefab bsp. CoolObject
   (siehe oben oder
1.1 generiere ein Prefab im Project, nenne es CoolObject
1.2 drage ein GameObject darauf CoolObject
1.3 Prefab CoolObject steht jetzt zur Verfügung

2. CoolObject kann jetzt instanziert werden
3. Angabe des Objects bei den Script referenzen
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

Script angehängt an den Player (oder sonstwas)

verschiesst RididBodies .. (könnte auch in ein Prefab-Objekt umgewandelt werden oder einfach GameObject)


// 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);
  }
}
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen
Angabe des zu schiessenden Objektes
Angabe des zu schiessenden Objektes
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

< http://unity3d.com/support/documentation/ScriptReference/Object.Instantiate.html
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

als Child hinzufügen

// children anhängen
cobj.transform.parent = transform;

Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

Kapseln werfen
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

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);
  }
}
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

10. Scripting: GUI erstellen
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

GUI - Interface Ingame etc

GUI kann soweit der Kenntnisstand in 2.o nur mittels Scripting einfügt und abgefragt werden. (= kein Editor!)
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

Einfach

hinzufügen von Text oder Bilder direkt bei der Kamera (GUIText, ...)
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

Komplex OnGUI <<<<< GROSS geschrieben!!

Erstellen von eigenen GUIs
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

< GuiTutorial
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

Ü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/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

< Tutorial / Referenz auf Unity3d
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

< Gruppierte Guis
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

Text-Aligment / Left, Center

GUIStyle style = new GUIStyle();
style.alignment = TextAnchor.UpperLeft;
GUI.Box(r,debugPinValueGlove0(),style);

Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

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);
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen
Beispiel GUI
Beispiel GUI
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

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);

}
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

GUI mit GUISkins

"CSS-Guis" können mit GUISkins (für das ganze Gui) und customized mit GuiStyle angepasst werden.
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

1. Skin Asset erstellen
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen
Skin Asset erstellen
Skin Asset erstellen
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen
2. Skin anpassen
2. Skin anpassen
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

3. Skin anwenden



Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

3.1 Einbinden und auswählen als Member


a) Im Kopf des Scripts
var customSkin : GUISkin;

b) Im Editor: Auswhählen des Skripts
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

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 ();

Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

< 4. Mehr dazu: http://unity3d.com/support/documentation/Components/gui-Customization.html
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

11. Scripting: Animation
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

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.
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

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.

Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

< Erstellen von Animationen im 3d-Modeller-Cheetah
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

Erstellen von Animationen direkt in Unity3D

Unity stellt die Möglichkeit zur Verfügung direkt im Programm Animationen zu erstellen.
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

< Character Animation import
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

Kontrolle von Animationen per Script
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen
Objekt-Hierarchie wird korrekt abgespielt (ansonsten springt die Animation beim Spielmodus in den Nullpunkt
Objekt-Hierarchie wird korrekt abgespielt (ansonsten springt die Animation beim Spielmodus in den Nullpunkt
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen
Animationskomponente
Animationskomponente
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

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();

Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen
das Objekt mit dem Animationsobjekt und den Animationen (AnimationStates)
das Objekt mit dem Animationsobjekt und den Animationen (AnimationStates)
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

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.
   
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

< > Dokumentation
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

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.
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

< Dokumentation
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

Animationen steuern
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

Beispiele
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

Walking
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

Ein Chetaah3d File direkt importierbar in Unity3d
[ download zip-file ]
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

Vorhandene Animationen

"walking"
"looking"
"jumping"
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen
Als Prefab importiert
Als Prefab importiert
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

Anwendung

animation.Play("walking");
animation.Play("looking");
animation.Play("jumping");

Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

InScene-Button zum Abspielen einer Animation

function OnMouseDown()
{
var object2=GameObject.Find("lebendevase");
object2.animation.Play("looking");
}
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

Animation stoppen und neue abspielen

function OnMouseDown()
{
var object2=GameObject.Find("lebendevase");

object2.animation.Stop();
object2.animation.Play("looking");
}
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

Überblend-Button

function OnMouseDown()
{
var object2=GameObject.Find("lebendevase");
object2.animation.CrossFade("jump", 0.2);
}
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

12. Scripting: Levels, Programm
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

Applikation starten / beenden / www

Application.Quit();
Application.CaptureScreenshot("Screenshot.png");
Application.OpenURL ("http://unity3d.com/");

Application.platform: RuntimePlatform.WindowsPlayer
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

< http://unity3d.com/support/documentation/ScriptReference/Application.html
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

SplashScreens, Logo, Levels ...

Unterteilen des Projektes in verschiedene Projektdateien
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen
/File/Builds Settings ...
/File/Builds Settings ...
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen
Hinzufügen der Projekte (Index-0: Start Projekt)
Hinzufügen der Projekte (Index-0: Start Projekt)
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

LoadLevel: Application.LoadLevel("Breakout");

if (Input.GetKey ("space"))
  {
  print("let's go to the game");
Application.LoadLevel("Breakout");
  }
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

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)
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

14. Scripting 3D-Meshes/Objekte erstellen
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen







15. Scripting: dynamische Texturen
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

RenderTexturen

Texturen, die in Echtzeit erstellt werden. Etwa um eine Übersicht zu generieren mit einer zweiten Kamera (Rückspiegel)
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

Rückspiegel oder Cameraeinstellung auf einer Texture
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen
Create Render Texture
Create Render Texture
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen
Camera erstellen, die die Daten für die Texture rendert
Camera erstellen, die die Daten für die Texture rendert
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen
Cameraeinstellung > Render to Texture
Cameraeinstellung > Render to Texture
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen
Zwei Camera Positionen - eine rendert auf die RenderTexture
Zwei Camera Positionen - eine rendert auf die RenderTexture
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen
RenderTexture ist auf zwei Wuerfel angewendet und als GuiTexture eingefügt (rot)
RenderTexture ist auf zwei Wuerfel angewendet und als GuiTexture eingefügt (rot)
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

Texturen modifizieren, generien, nachladen (zum Beispiel aus dem Netz)
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

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 WWWvon einem File laden(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);
   }
}
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen  0  [...]WWW[...]

von einem File laden

url="file:///Users/itz/Desktop/test.png";
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

Direkt in Texturen Pixel setzen und lesen
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

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( );


}
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

siehe Referenz > Möglichkeit die Texture einzufärben
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

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;
}
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

< file:///Applications/Unity/Unity.app/Contents/Documentation/Documentation/ScriptReference/Texture2D.ReadPixels.html
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

texture ändern

var obj:GameObject;
var tex:Texture2D;

function Start()
{
 obj.renderer.material.mainTexture=tex;
}
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

< LiveTexturen - Streaming Texturen (via Processing)
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

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;
*/
}
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

16. Scripting: Web
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

Webzugriff / Scores etc
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

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 ()
{

}
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

xx. Multithreading
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

Threads / Multithreading / Coroutines
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

Threads in C#/Mono

Threads erstellen in Mono und dort ausführen. Beispiele in UDP-Receive Thread.
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

Coroutinen in Unity3d (etwa Laden von Images etc)
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

Beispiele


// Momente Warten
yield new WaitForSeconds(5);



Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

XX. Editor als Leveleditor

- Gizmos
- eigene Menus
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

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));
}
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

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!
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen
Visualisierung und Interaktion: Gamerelevante Infos
Visualisierung und Interaktion: Gamerelevante Infos
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen
Gizmos-Icons in einem eigenen Folder-root
Gizmos-Icons in einem eigenen Folder-root
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

Einbinden (wenn es immer angzeigt werden soll)

function OnDrawGizmos()
{
Gizmos.DrawIcon(transform.position, "action.png");
}
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

Eigene Menus

Eigene Menus erstellen
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen
Eigenes Menu: Bsp: AdventureKit
Eigenes Menu: Bsp: AdventureKit
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen
Editormenuscripts müssen im Editor-Ordner sein (sonst seltsame Fehler)
Editormenuscripts müssen im Editor-Ordner sein (sonst seltsame Fehler)
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

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);
}
}

Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

xx. Scripting: Pluginprogramierung
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

Plugin Programmierung

Plugin können in C Programmiert werden und anschliessend eingebunden werden.
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

< http://unity3d.com/support/resources/example-projects/texture-plugins
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

Plugin Programmierung Macos X



Steueren und Kontrollieren von externen Kontrollern als Plugin



< Arduino-Board messen und steuern (via SerProxy auch mit der Indie-Lizenz)
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

Spielfiguren (NPC's oder Spezialfall Avatar)
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

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
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen
Reale Gegenstände, Steps, Jump
Reale Gegenstände, Steps, Jump
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

Reale Welt > Viele Gegenstände kollidierbar ohne Probleme (vs Shooter)

Verlagerung der GameMechanik auf NPCS etc
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

Einfacher Character Controller
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen
CharacterControllerProgrammierung
CharacterControllerProgrammierung
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

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)
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

Einfacher Character Controller  als Zip
[ download zip-file ]
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen
CharacterController im Einsatz (CharacterController wird automatisch gebildet)
CharacterController im Einsatz (CharacterController wird automatisch gebildet)
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

FirstPerson-Walker (Scripts>FirstPersonWalker)



CharacterController
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

< Einführung: http://unity3d.com/support/documentation/Components/class-CharacterController.html
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

< http://unity3d.com/support/documentation/ScriptReference/CharacterController.Move.html
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

< http://unity3d.com/support/documentation/ScriptReference/CharacterController.html
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

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

Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen
Aufbau
Aufbau
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen
In der UpdateFunktion die Logik
In der UpdateFunktion die Logik
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen
Aufbau NPC mit Character Controller
Aufbau NPC mit Character Controller
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

Einfacher NPC
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

Simpler NPC Anleitung (unity3d)



Simpler NPC (unity3d)



Simpler NPC Anleitung (unity3d)



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)
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

NPC.js (als Zip)
[ download zip-file ]
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

NPC Random Walker
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen
NPC Random ... alle Sekund ein Richtungswechsel (bei Kollision Richtungswechsel einschaltbar)
NPC Random ... alle Sekund ein Richtungswechsel (bei Kollision Richtungswechsel einschaltbar)
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

NCPRandom.js (als Zip)
[ download zip-file ]
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

NPCFollowers der einem GameObject folgt

Das verfolgte Object muss angegeben werden als Member!
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

NPCFollower - Verfolger (Unity3d)



NPCFollower.zip
[ download zip-file ]
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen
Angabe des zu Verfolgenden
Angabe des zu Verfolgenden
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen
Einige Verfolger
Einige Verfolger
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

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)
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

NPCFollowerDistance - Wartender

Einer der aufs abholen wartet und zurückfällt, wenn man sich zu weit von ihm fortbewegt.
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

NPCFollowerDistance.js
[ download zip-file ]
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

NPC mit LookAt



Erstellen einer FirstPersonPerspektive

übergordnetes Objekt (FirstPerson) an ihm hängt die Kamera und der "Body"
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

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)
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen
Der Player steht in der Luft (mit Kamera)
Der Player steht in der Luft (mit Kamera)
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

Spielwelten / Maschinen / Automaten
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

Kontrollerbasiertes Beispiel (in Unity)

Ein Objekt kontrolliert alle anderen
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

Objekte finden, bewegen, Distanz messen



Kontrollerbasiertes Beispiel (in Unity)



Lumines - einfacher Prototyp (Unity3d)



< ArcadeKit: arcadekit.origo.ethz.ch
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

Eventbasierte Programmierung
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

Eventbasierte Programmierung (Unity3D)



Eventorienterte Programmierung mit einem zentralen LevelObject für MetaInofs/Methoden



< Kleines Spiel mit zentraler Pause
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

Tilebased Leveldesign Unity3D



Tilesbasiertes Puzzlespiel (Eventbasierte Programmierung) Unity3d



Einfache Physik (Space Taxi, Thrust)



< ArcadeKit: arcadekit.origo.ethz.ch
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

Eigene kybernetische GameMaschinchen
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

JumpAndRun



Spielwelten extern (Tutorials etc)
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

Implementierte Gamekonzepte (& Tutorials)
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

< 2D-Plattformspiel (als Tutorial)
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

< 3D-Plattformspiel (mit Tutorials)
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

FPS (FirstPersonShooter)
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

< Tutorial 1: unity3d.com/support/resources/tutorials/fps-tutorial-part1
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

< Tutorial 2: unity3d.com/support/resources/tutorials/fps-tutorial-part2
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

< Netzwerkbeispiele (Car-Race, 3rd-Person)
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

< ArcadeKit: http://arcadekit.origo.ethz.ch/download
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

Erstellen einer first Person Walk-Through-Welt
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

< First Person Shooter PDF Teil 1
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

First Person Shooter PDF Teil 2
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

< http://unity3d.com/support/resources/tutorials/fps-tutorial-part2
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

Jump&Run-Beispiel
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

< Tutorial für ein Jump&Run Spiel
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

Topics/Themen
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

Sich um einen Planeten/Kugel bewegen mit Quaterionen
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

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);
}
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

Code Snippets



Rotate-Winkel direkt angeben

transform.localEulerAngles.x=0.0;
transform.localEulerAngles.y=0.0;
transform.localEulerAngles.z=90;
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

Wegfindungssystem A*



xx. Scripting: Sound
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

GameObject mit einem angehängten Sound
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen
0. Add an empty Object
0. Add an empty Object
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen
1. AudioRessource anhängen
1. AudioRessource anhängen
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen
2. SoundObject ist eine Componente (hineindragen)
2. SoundObject ist eine Componente (hineindragen)
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

3. Sound abspielen (einmal oder in der udpateversion endlos)
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

function Update ()
{
audio.Play();
}
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

4. Abspielen, warten bis Sound gespielt ist
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

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.
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen


function Update ()
{

if (!audio.isPlaying)
{
audio.Play();
}
}
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

5. PitchUp


var pitchLevel=0.0;

function Start()
{

}

function Update ()
{
pitchLevel=pitchLevel+0.01;
audio.pitch = pitchLevel;

if (!audio.isPlaying)
{
audio.Play();
}
}
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

6. Volume setzen


var volumeLevel=0.0;

function Start()
{

}

function Update ()
{
volumeLevel=volumeLevel+0.01;
audio.volume = volumeLevel;

if (!audio.isPlaying)
{
audio.Play();
}
}
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

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 ()
{

}
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

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.
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

< Wikipedia FMOD
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

< Unity3d & Fmod: http://www.squaretangle.com/FMODUnity.html
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

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.
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

< http://www.fmod.org/index.php/products/designer
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

xy. SkyBox
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen
SkyBox aktivieren > RenderSettings rechte Seite
SkyBox aktivieren > RenderSettings rechte Seite
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen
Kopiere SkyBox 5 Ansichten
Kopiere SkyBox 5 Ansichten
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

Heightmap und Texturierung
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

Terrain
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

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)
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen
Terrain kreieren
Terrain kreieren
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

Terrain Bearbeitungsmöglichkeiten

- Terrain-Edit
- Terrain-Texturierung
- Terrain-Trees
- Terrain-Foliage
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen
Möglichkeiten (Angewählt Terrain anheben)
Möglichkeiten (Angewählt Terrain anheben)
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen
Terrain texturieren: Verschiedene Texturen in verschiedenen Grössen (Grösse kann beim HInzufügen auch variert werden!)
Terrain texturieren: Verschiedene Texturen in verschiedenen Grössen (Grösse kann beim HInzufügen auch variert werden!)
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen
Texturieren von Schatten ebenfalls mit Vorteil schon beim Terrain, Einzigartigkeiten erstellen!
Texturieren von Schatten ebenfalls mit Vorteil schon beim Terrain, Einzigartigkeiten erstellen!
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen
Bäume & Foliage
Bäume & Foliage
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

xy. Shaders / Transparenzen


Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

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;
       }
   }

Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

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.
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen
Lösung A: Etwas steht im Weg in der 3rsd Person View: Transparent machen der Objekte
Lösung A: Etwas steht im Weg in der 3rsd Person View: Transparent machen der Objekte
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

Lösung A


Ein Objekt verdeckt die Sicht auf den Avatar (3rd Person): Ein Algorithmus
Ein Objekt verdeckt die Sicht auf den Avatar (3rd Person): Ein Algorithmus
Text/Objekt verändernEinen Kommentar (einer Stelle[markiert]) hinzufügen

Lösung B(Orbitalcamera): Kamera vom Avatar bis zum verdeckten Objekt schieben in Richtung Kamera



Lösung B(beliebige Camera) - bei jeder Camera einsetzbar



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.)