unity tipps

 

Siehe auch den zweiten Teil meiner Tipps zum Thema Unity Scripts

UnityScripts


Neues Projekt

Unity, new Project, wähle einen Ordner. Alle Unterordner und Objekte sieht man im Project Pane.

Schaue im "Layers" drop down Menü (rechts oben), dass "Default" aktiviert ist. Böse Falle !!!!!!!

User Interface

Scene View zeigt alle Objekte und Elemente

Hierachy View- zeigt alle Elemente in einer Liste

Project View zeigt Datei Struktur aller Dateien, die involviert sind

Inspector View zeigt die Details des ausgewählten Elementes

Game View ist eine Spielansicht mit Editor

Man kann die Fenster am Tab anfassen beliebig verschieben.

Unter Layout kann man sich verschiedene voreingestellte Fensteranordnungen auswählen.

SceneView

Object

Hat man ein Objekt erstellt und ausgewählt, kann man verschiedene Pfeil Anfasser für die Transformation (Position, Rotation, Skalierung) benutzen. Das ausgewählte Objekt zeigt die entsprechenden Anfasser über die man es veschieben, transformieren und rotieren kann. Außerdem kann man im Inspector die Position und Größe bestimmen. siehe auch Object

Durch Taste F wird das ausgewählte Object herangezoomt, sofern sich die Maus über Scene befindet.

Navigation

Alt-linke Maus- Ansicht drehen

mittlere Maustaste Ansicht verschieben

Alt- rechte Maus oder Mausrad - Zoom in and out

Anfasser-Gizmo oben rechts in der Scene View ermöglicht das Ausrichten der Ansicht auf die Himmelsrichtungen sowie Draufsicht und Ansicht von unten. Ein Klick in die Mitte bringt die perspektivische Ansicht zurück.

Inspector

Im Inspector werden die Einstellungen für das ausgewählte Objekt vorgenommen. Anstatt eine Zahleneingabe per Tastatur vorzunehmen, kann man auch auf der Optionsbezeichnung die Maus ziehen, um den Wert wie mit einem Schieber/ Slider zu definieren.

Bei einigen Optionen kann man mit rechter Maustaste Reset wählen (zurück auf Standard).

Project

Im Project befinden sich alle Objekte, Scripte, Materialien, die eventuell für das Spiel gebraucht werden. Man erzeugt diese Objekte einmal über Menübefehle, man kann aber auch in der Windows Explorer Ansicht, Ordner anlegen und Bilder, 3D Objekte etc. auf diese Art einfügen.

Object

Einfache Objekte erzeugen

Verschiebe und skaliere sie mit den Anfassern unter Scene oder im Inspektor per Zahleneingabe

Wähle in der "Hierachie" ein Objekt, bewege Maus über Szene Taste F, zoomt auf das Object

Object duplizieren mit Strg D klicken

Parenting / Gruppieren

Erzeuge ein paar Objekte beispielsweise 2 Räder und ein Autoteil.
Game Object / Create Other/...Cube/ ...Cylinder
Wähle beide Räder in der Hierachie-View aus und schiebe sie auf das Autoteil. Somit sind die Räder Kinder des Elternobjekts Autoteil.

Prefab

Ein Prefab ist so etwas wie eine Objekt Klasse, von der man Instanzen auf die Bühne schiebt. Ändert man das Prefab ändern sich auch alle Instanzen. Im Prinzip ein ähnliches Konzept wie in Movieclip in Flash.

Erzeuge ein Object beispielsweise eine Kugel. Game Object, Create Other, Sphere
Erzeuge ein Prefab mit Assets Create Prefab
schiebe die Sphere aus Hierachie Pane auf Prefab im Project Pane
Lösche die Sphere aus Hierachie und schiebe stattdessen Instanzen des Prefabs auf die Bühne.

siehe auch Instantiate per Code

Physikalische Eigenschaften

Erzeuge einen weiteren Cube, umbenenne ihn PhysicCube, wähle ihn aus, Components , Physics, Rigid Body, der Cube hat nun physikalische Eigenschaften und fällt runter

Klicke auf den Play Button, um in der Game Ansicht das Verhalten zu sehen

Character / Spielfigur erzeugen

In "Project View" öffne "Standard Assets" Ordner, öffne "Character Controllers", wähle "First Person Controller" und ziehe ihn in die Scene View, In der Game Ansicht ändert sich die Ansicht, da die Spielfigur eine eigene Kamera hat. Lösche die "Main Camera" aus der "Hierachie". Achte darauf, dass "First Person Controller" nicht im Boden steckt.

Starte das Spiel mit dem Play Button, stoppe durch erneutes Klicken auf den Play Button, steuere die Figur mit den Pfeiltasten und der Maus.

Siehe auch Player / Shooter

siehe auch Codeverweis auf GameObject

Physic

Rigidbody

Füge ein Rigidbody zu einem Objekt hinzu, damit es sich physikalisch verhält. Das heißt, es kann mit anderen Objekten kollidieren den Gesetzen der Schwerkraft unterliegen. Dazu muss auch ein Collider hinzugefügt werden. Wenn 2 Rigidbodies aufeinanderstoßen und physikalisches Kollisionsverhalten aufweisen sollen, müssen beide einen Collider haben.

Man bewegt Rigidbodies nicht per Frame oder Zeit, sondern übt Kräfte und Drehmonente darauf aus. Man kann Verbindungen und Gelenke (Joints) hinzufügen, wie bei einer Tür oder einem Kran mit schwingender Kette.

Mit WheelColliders kann man per User-Input das Fahrverhalten von Autos steuern.

Achtung!!

Benutze nie ein Child und Parent Rigidbody zusammen.
Man sollte nie den Parent eines Rigidbody skalieren.

Benutze auch die richtige Größe. Scale 1 entspricht 1 Meter. Eine menschliche Figur sollte also eine Höhe von 2 haben.

Die relative Mass wirkt sich nicht auf die Fallgeschwindigkeit. Zu diesem Zweck sollte man lieber die Option Drag benutzen. (Luftwiderstand) Standardwerte sind .001 für Metal und 10 für eine Feder.

 

Kinematic Rigidbody

Ein Rigidbody, dessen "isKinematik" Opition aktiviert ist wird nicht von Kräften und Schwerkkraft beeinflusst, sondern über transform gesteuert. Andere Objekte, deren Option "isKinematic" deaktiviert ist werden von diesen kinematicRigidbodies beeinflusst. Sie interagieren mit ihnen sobald sie durch Kollision "geweckt" werden.

Static Collider

Ein Gameobjekt mit einem Collider, jedoch ohne Rigidbody. Sie werden für Objekte genutzt, die nicht bewegt werden. Colliders, die Frame mäßig bewegt werden, sollten immer kinematic Rigidbodies sein.

Character Controllers

CharacterControllers werden für Figuren eingesetzt: main character, third person, FPS shooter, enemy

Sie folgen den Gesätzmäßigkeiten der Physik nur, wenn es Sinn macht. Sie können mit anderen Objekten kollidieren oder Treppen und Berge hochlaufen. Ansonsten kann man sie mit transfrom per Frame bewegen.

Ein CharacterController mit einem Rigidbody bekommt ein joint-artiges Verhalten.

 

Scripting / Javascript

In meinem Tutorial geht es um Javascript, man kann in Unity auch C# oder Boo Script nutzen. Siehe auch den 2ten Teil meiner Tipps: Unity Scripts

Script in Unity funktioniert auf folgende Weise:

Man erstellt Javascripts und weist diese Objekten zu.

Es erscheint in der Project View und Inspector, dort kann man durch Edit das Script verändern, beispielsweise:

function Update () {
transform.Rotate(0, 5*Time.deltaTime, 0);
}
        

Man kann das Script im MonoEditor öffnen. Durch open im Inspector View oder auf das Optionen Symbol (oben, rechts, Zahnrad), Edit.

Ziehe das Script aus dem Project Fenster auf das Object im Hierachie Fenster, um es einem Object zuzuweisen.

Variablen

var someVar:String;

Variablen die außerhalb von Funktionen definiert werden, erscheinen im Inspector View und können dort Wertzuweisungen bekommen.

Statische Variablen können von anderen Scripten aus angesprochen werden.

static var someVar:String;

ansprechen über Name des Javascripts meinScript.someVar

Es gibt verschiedene Events beispielsweise:

Update:
Wird ausgeführt, bevor ein Frame gerendert wird, außer physics code. Die häufigste Funktion.
 
FixedUpdate:
Wird ausgeführt bei jeder physics Zeiteinheit. Hier wird also physics- Verhalten eingefügt.
Start:
Wird beim Start ausgeführt. Hat man Variablenwerte im Inspector View vergeben und außerdem innerhalb der Startfunktion, so haben die Wertzuweisungen der Startfunktion Vorrang.
 
 
 
Code außerhalb von Funktionen:
Der Code wird ausgeführt, wenn ein Objekt geladen wird.
 

Man kann auch Event Handler definieren. Diese starten namentlich mit On (z.B.: OnCollisionEnter). Die Liste der events, kann man in der Dokumentation von MonoBehaviour nachlesen.

Bewegungscript

hier ein Script welches ein Objekt hoch und runter bewegt.

  1. Erzeuge ein Javascript mit Assets / Create / Javascript
  2. Füge den unten stehenden Code hinzu.
  3. Erzeuge ein Objekt beispielweise einen Cube und ziehe das Script auf das Objekt.
  4. Wähle das Objekt aus. Im Inspektor kann man das Script sehen und die Parameter für Höhe (height) Geschwindigkeit (speed) und Zeitverzögerung (timingOffset) individuell für jede Instanz getrennt eintragen.
var height = 3.2;
var speed = 2.0;
var timingOffset = 0.0;

private var originalPosition : Vector3;

function Start ()
{
originalPosition = transform.position;
}
function Update () {
var offset = (1 + Mathf.Sin(Time.time * speed + timingOffset)) * height / 2;
transform.position = originalPosition + Vector3(0, offset, 0);
}

3rd Person Controller Script

var speed = 3.0;
var rotateSpeed = 3.0;

function Update()

{
var controller : CharacterController = GetComponent(CharacterController);

//Rotate around y axis
transform.Rotate(0, InputGetAxis("Horizontal") * rotateSpeed, 0);

// Move forward / backward
var forward = transform.TransformDirection(Vector3.forward);
var curSpeed = speed * Input.GetAxis ("Vertical");
controller.SimpleMove(forward * curSpeed);

}

@script RequireComponent(CharacterController)

Tutorial Scripting

In der Einsteigerhilfe gibt es das "Scripting" Tutorial von Author: Graham McAllister. Hier die einzelnen Schritte.

Erzeuge ein Project mit einer Fläche in Form eines flachen Cubes, Ausmaße 5, 0.1, 5, erezuge einen weiteren Cube und ein Point Light,
Create / Game Object / Other / ....

Das erste Script

im Project Fenster umbenennen in "Move1"

Im Inspector auf "open" klicken, es öffnet sich der Editor MonoDevelop von Unity. Hier kann man die Änderungen vornehmen und speichern.

Das erste Script soll die MainCamera mit den CursorTasten bewegen. Das wird erreicht durch folgende Funktion:

function Update () {
transform.Translate(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical"));
}
       

function Update() führt die Aktionen per Frame aus.

Script einem Objekt zuweisen

Dieses Script kann der MainCamera auf 2 Arten zugewiesen werden:

  1. Objekt in diesem Fall MainCamera in Hierachie auswählen, Components / Scripts / Move1
  2. andere Möglichkeit: Script aus Project View auf das Objekt in der Scene View schieben

Delta Time

Die Kamera ist ein bisschen schnell. Da die Update Funktion die Position in Meter per Frame ändert. Das soll durch ein zeitliches Intervall ersetzt werden: Meter per Second schreibt man Time.deltaTime * 10;

var speed = 5.0;
function Update () {
var x = Input.GetAxis("Horizontal") * Time.deltaTime * speed;
var z = Input.GetAxis("Vertical") * Time.deltaTime * speed;
transform.Translate(x, 0, z);
}

Variablen mit Objekten verbinden

Im folgenden geht es darum, dass ein Spotlight der MainCamera folgt. Hierzu wird eine Variable erzeugt, die mit der MainCamera verbunden wird.

Erzeuge ein Spotlight
Game Object / Create Other / Spotlight

Erzeuge ein neues Script mit Assets / Create / Javascript

im Project Fenster umbennen in "Follow"

var target : Transform;
function Update () {
transform.LookAt(target);
}

        

Weise das Script Follow dem Spotlight zu:
per drag and drop, oder Spotlight auswählen und Components / Scripts / Follow

Die Variable namens "target" vom Typ Transform, muss nun der MainCamera zugewiesen werden:

Das Spotlight ist ausgewählt. Ziehe die MainCamera aus Projector View auf die "target" Variable in Inspector View.

Wenn man die Variable "target" einem anderen Objekt vom Typ "Transform" zuweisen will, zieht man dieses Objekt auf gleiche Weise darauf.

Zugriff auf Komponenten

Einem Game Object kann man verschiedene Scripte oder Komponenten zuweisen. Dieses wird durch die GetComponent() Funktion erreicht.

Wir wollen nun das vorige Script in der Form verändern, dass das Spotlight auf den "Cube" verweist, wenn man die Leertaste drückt. Die Leertaste ist die "Jump" Taste. Edit / Project Settings / Input zeigt die einzelnen Keys und Aktionen an

Wir haben die target Variable und weisen dieser einen neuen Wert zu, wenn die "Jump" Taste gedrückt wird.

Erzeuge ein neues Javascript namens "Switch", Assets / Create / Javascript

var switchToTarget : Transform;
function Update () {
if (Input.GetButtonDown("Jump"))
GetComponent(Follow).target = switchToTarget;
}

        

Weise das Script dem "spotlight" zu und weise "Cube" der Variablen "switchToTarget" zu.

Dieser Verweis kann auch durch Code erzeugt werden:

Verweis per Code

siehe auch mein Script Tutorial zum Thema Components

function Update () {
if (Input.GetButtonDown("Jump"))
{
var newTarget = GameObject.Find("Cube").transform;
GetComponent(Follow).target = newTarget;
}
}

Es gibt 2 Arten per Code auf ein Object zu verweisen:

Benutze den name eines GameObjects
GameObject.Find("Cube").transform;

Benutze den tag eines GameObjects
GameObject.FindWithTag("Cube").transform;

Wähle den tag Button in inspector view. Hier kann man auch einen eigenen Tag erzeugen, indem "addTag" wählt und dann einen leeren Tag umbenennt. Klicke dazu hinter den Namen des Tags. Achte darauf, dass man tag und nicht layer wählt.

Instantiate

Im folgenden Beispiel wird durch klicken auf den linken Maus-Button Instanzen von Objekten erzeugt. Dazu muss das Objekt zuerst ein prefab Objekt sein. Bennen den Cube um in "Cube1"

Erzeuge ein prefab durch:
Assets / Create / Prefab
nenne es Cube

Ziehe "Cube1" aus der Hierachie View auf "Cube" in Project View.

Erzeuge ein neues Javascript und nenne es "Create"
Assets / Create / Javascript

var newObject : Transform;
function Update () {
if (Input.GetButtonDown("Fire1")) {
Instantiate(newObject, transform.position, transform.rotation);
}
}

Weise das Script durch ein der folgenden Methoden der MainCamera zu
a) MainCamera auswählen, Components / Scripts / Create
b) Script "Create" auf MainCamera ziehen

Weise Cube der Variablen "newObject" zu
MainCamera ist ausgewählt

Cube aus ProjectView auf die Variable "newObject" im Inspector View ziehen.

Teste im Game Modus

Debugging

Innerhalb de If Blocks füge folgende Zeile hinzu

Debug.Log("Cube created");

Im Game Modus sieht man am unteren Rand den Hinweis, wenn man die linke Maustaste drückt. Man kann auf diesen Hinweis klicken um das Debug Fenster zu öffnen.

Erweitere das Script folgendermaßen

var newObject : Transform;
private var cubeCount = 0;

function Update () {
if (Input.GetButtonDown("Fire1")) {
Instantiate(newObject, transform.position, transform.rotation);

cubeCount++;
Debug.Log(cubeCount);
}
}

Nun werden alle neuen Instanzen gezählt.

Ein paar Script Beispiele

 

Update()

Die Aktionen werden vor dem Rendern jedes Frames ausgeführt. Außer die physikalischen Verhaltensweisen.

FixedUpdate()

Die Aktionen werden in regelmäßigen Intervallen ausgefürt. Einsatz überlicherweise für Rigidbodys, da hier physics Zeitintervalle genutzt werden.

// Apply a upwards force to the rigid body every frame
function FixedUpdate () {
rigidbody.AddForce (Vector3.up);
}

Awake()

Wenn ein Script initialisiert wird, vor dem ersten Update() Langsame Scripts sollten besser in Awake() als in Update() aufgerufen werden. Langsame Scripts sind beispielsweise: GameObject.Find() oder GetComponent()

Start()

Vor einer Update() Funktion aber nach Awake() Der Unterschied zwischen Start() und Awake() ist, dass Start() aufgerufen wird, wenn die checkbox in Inspector View aktiviert ist.

OnCollisionEnter()

Kollision mit anderen Game Objects

OnMouseDown()

Wenn der User die Maus über ein Game Object, welches ein GUI Element oder einen Collider enthält, zieht und klickt.

// Loads the level named "SomeLevel" as a response
// to the user clicking on the object
function OnMouseDown () {
Application.LoadLevel ("SomeLevel");
} 

OnMouseOver()

Wenn der User die Maus über ein Game Object, welches ein GUI Element oder einen Collider enthält, zieht.

// Fades the red component of the material to zero
// while the mouse is over the mesh
function OnMouseOver () {
renderer.material.color.r -= 0.1 * Time.deltaTime;
}

mehr dazu in der Unity API

Spielfigur von Blender in Unity importieren

Infos auch in meinen Blender Tipps.

Erzeuge eine Spielfigur in Blender
Erzeuge einzelne Animationen mit dem Action Editor und benenne sie, walk, run, idle (Leerlauf), jump_pose Speichere die Figur mit den Animationen in einem Unterordner deines Unity Projektes als FBX Datei ab, siehe dazu die Infos in Blender.

In Unity ziehe einen Third Person Controller auf die Bühne, ziehe die importierte Blender Figur auf den Third Person Controller und lösche die standardmäßig vorhandene Figur. Achte auf Größe, Rotation und Größe der Figur.

Daz3D / Poser

Es ist auch möglich Figuren aus Daz Studio zu importieren, dazu gibt es irgendwo ein Youtube Video.
Mit der Daz Funktion Pupeteer hat man ein tolles Animationswerkzeug.
Auch im Poser gibt es Werkzeuge zur Animation, wie den Walk- und Talkdesigner.
Der Export einer Animation von Poser in Daz geht folgendermaßen. Exportiere die Animation als bvh Datei und aktiviere die Option "Automatisch Skalieren". Der Import in Daz, wähle die Figur aus, wähle Import, wähle die bvh Datei. Hier hat man dann sogar die Möglichkeit die Bonesverbindungen zu überprüfen und zu korrigieren.
Das interne Abspeichern einer Animtion in Daz geht über das Diskettensymbol oben in der Pose und Animate Ansicht.

 

Animation

Unity Manual Animation View Guide

Eine importierte Figur mit Animationen zeigt diese Animationen namentlich im Inspector, Animation an.

Als erstes erscheint die Standardanimation, welche abgespielt wird, wenn die Option "play automatic" aktiviert ist.
Klicke auf den kleinen Kreis ganz rechts um eine andere Standardanimation festzulegen.
animation.Play();
spielt die Standardanimation ab.

Jede Animation hat einen Namen, über den man sie programmatisch ansprechen kann.
Im folgenden, durch Drücken der Taste "e" wird die Animation namens walk abgespielt.

function Update()
{
if(Input.GetKey("e"))
{
animation.Play("walk");
}else
{
animation.Play("idle");
}
}

Unter Windows, Animation hat man die Möglichkeit alle Animationen eines Objektes auszuwählen, abzuspielen und weitere Optionen zu bestimmen.

Animation abspielen

Hier die Referenzen hier ein Beispiel:

if (Input.GetButtonDown("Jump")) {
animation.CrossFade("Spring", 0.2);
}

Oder hier ein Wechsel zwischen Warten und Laufen durch Drücken der Pfeiltasten vor oder zurück wird die Animation namens "laufen" eingeblendet. Mittels Crossfade werden Überblendungen zwischen 2 Animationen erzeugt. Der zweite Parameter bestimmt die Übergangszeit in Sekunden.

WrapMode bestimmt die Art der Wiederholung, Once, Loop, PingPong

animation["laufen"].wrapMode = WrapMode.Loop;

function Update () {

if (Mathf.Abs(Input.GetAxis("Vertical")) > 0.1)
animation.CrossFade("laufen", 0.2);
else
animation.CrossFade("warten", 0.2);
} 

Animation Script



animation["walk"].wrapMode = WrapMode.Loop;

animation["run"].wrapMode = WrapMode.Loop;

animation["jump_pose"].wrapMode = WrapMode.Once;

var running = false;

 

function Update () {

if(Input.GetKey("left shift") )

running=true;

else running=false;

if (Mathf.Abs(Input.GetAxis("Vertical")) > 0.1 || Mathf.Abs(Input.GetAxis("Horizontal")) > 0.1)

{

if(running)

animation.CrossFade("run", 0.1);

else

animation.CrossFade("walk", 0.1);

}

else if (Input.GetButton("Jump"))

animation.CrossFade("jump_pose", 0.0);

else

animation.CrossFade("idle", 0.2);

}

GUI Label

Youtube Videos von Daniel 24 :
GUI 1 / GUI 2 / GUI 3 / GUI 4 / GUI 5 / GUI 6 / GUI 7 / GUI 8 / GUI 9 / GUI 10 / GUI 11 / GUI 12 / GUI 13

Unity Manual Gui Text

Graphical User Interface oder Infoanzeige auf der Oberfläche.

Erzeuge ein Javascript (Assets, Create, Javascript ) und ziehe es auf ein Objekt der Bühne, beispielsweise die Kamera.

function OnGUI () {
GUI.Label(Rect(100,100,100,20),"Hallo Welt");
}

OnGui wird mit der Bildlaufrate aktualisiert.

Die Parameter von Rect sind x-Position, y-Position, Breite, Höhe. Der zweite Parameter von GUI.Label ist die Anzeige.

Die Anzeige kann sein:

String, Number, Texture2D

Lade ein Bild ins Project. Erzeuge folgendes Script und ziehe im Inspector des Javascripts, das Bild aus dem Project View auf die Variable namens Bild. Die Größe des Bildes wird auf Breite und Höhe von Rect heruntergerechnet. Alternativ kann man folgendermaßen auf die Bildmaße zugreifen. Bild.width, Bild.height

var Bild:Texture2D;

function OnGUI () {
GUI.Label(Rect(100,100,100,20),Bild);
}

youtube videos Basics

Basics 1, Basics 2, Basics 3,Youtube Videos von Daniel 24

Player

Player 1, Player 2, Player 3, Player 4, Player 5, Player 6, Player 7, Youtube Videos von Daniel 24

Erzeuge eine Figur oder importiere eine Figur. Wenn Teile der Figur mit den Primitives von Unity erzeugt wurden, müssen im Inspector die Collider entfernt werden. Wenn dein Player nur aus einer importierten Figur bestehen soll, erzeuge zuerst ein "Empty" mit Game Object, Create Empty vergebe einen Namen nachfolgend actor genannt und ziehe deine importierte Figur aus dem Projects Folder auf actor.

Wähle actor aus und klicke Component, Physics, Character Controller. Der Character Controller ist eine Collisionshülle, welche in der Scene zu sehen sein sollte. Sie erscheint auch im Inspector. Stelle dort Größe und Position ein.

MainCamera folgt Figur

Project View, Standard Assets, Scripts, Camera Scripts, Smooth Follow ziehe das Script auf die MainCamera in Hierachie View. Wähle die MainCamera aus und öffne SmoothFollow Script im Inspector und ziehe actor aus Hierachie auf target.

Alternativ könnte man auch folgendermaßen vorgehen, man zieht die MainCamera auf actor und zieht dann das SmoothFollow Script aus Project View auf actor.

Blob Shadow

Da eine eher realistische Schattenprogrammierung sehr rechenintensiv ist, wird ein Blob Shadow erzeugt, der eine Art Schatten durch eine Grafik simuliert.

Wähle dazu aus Project View, Standard Assets, Projectors, Blob Shadow Projector und ziehe in auf actor
Vergebe dem Blob Shadow folgende Rotationswerte im Inspector. 90 , 180, 0
Wähle im Scene View die verschiedenen Seitenansichten und platziere den Blob Shadow über dem Kopf der Figur. Passe die Höhe an, um eine gewünschte Größe zu erstellen.

Damit der Schatten nicht auf die Figur fällt, wird die Figur auf eine Layer gesetzt und der Blob Shadow bekommt die Anweisung nicht auf den Layer zu fallen.

Öffne Player GameObject actor.
Öffne Layer drop-­down im Inspector.
Wähle Add layer
Wähle den ersten leeren User Layer und vergebe den Namen noShadow. Der Name wird in der zweiten Spalte vergeben. So könnte da beispielsweise dann stehen, UserLayer 8 / noShadow
Wähle actor im Hierachie Pane,
Wähle im Inspector Pane das Layer Drop Down Menü und wähle den Layernamen noShadow
Die Anfrage, wird mit Change Children Layers beantwortet.
Wähle Blob Shadow Projector im Hierachie Pane und vergebe im Inspector bei Ignore Layers den Wert noShadow

Player Script erstellen

Erzeuge ein neues Javascript Assets, Create, Javascript benenne es beispielsweise PlayerControl und ziehe es auf actor.

Folgendes Script erzeugt eine Laufbewegung vor und zurück durch drücken der Pfeiltasten rauf und runter.
Input.GetAxis("Vertical"); und Input.GetAxis("Horizontal"); gibt jeweils die beiden Werte -1 und 1 zurück, je nachdem welche der Pfeiltasten gerade gedrückt sind.

var walkSpeed = 6.0;

function Update () {

var speed = Input.GetAxis("Vertical") * walkSpeed;

var CharControl : CharacterController = GetComponent(CharacterController);
var dirForward = transform.TransformDirection(Vector3.forward);
CharControl.SimpleMove(dirForward * speed);

}

Das Script wird folgendermaßen erweitert. Durch drücken der Pfeiltasten links und rechts wird eine Drehung des Objektes erzeugt. transform.Rotate() benötigt die 3 Parameter für die 3 Drehrichtungen / Achsen. Durch drücken der Shift Taste wird die Geschwindigkeit erhöht.

var walkSpeed = 6.0;
var runSpeed = 2;
var rotationSpeed = 200;

function Update () {

var speed = Input.GetAxis("Vertical") * walkSpeed;
if(Input.GetKey("left shift")) speed *= runSpeed;

var CharControl : CharacterController = GetComponent(CharacterController);
var dirForward = transform.TransformDirection(Vector3.forward);
CharControl.SimpleMove(dirForward * speed);

var rotation = Input.GetAxis("Horizontal") * rotationSpeed;
transform.Rotate(0, rotation * Time.deltaTime, 0);

}

Hier noch ein alternatives Script, welches ich aus einem Unity Beispiel kopiert habe
Unity, Support, Recources Example Projects, Character Animation.
Dieses Script ist komplizierter, da es Physik und Umwelt simuliert.

var speed = 4.0;
var jumpSpeed = 20.0;
var gravity = 20.0;

var smoothSpeed = 10.0;
var smoothDirection = 10.0;

var canJump = true;

private var moveDirection = Vector3.zero;
private var verticalSpeed = 0.0;
private var moveSpeed = 0.0;

private var grounded : boolean = false;
private var jumping : boolean = false;

private var targetAngle = 0.0;

// Require a character controller to be attached to the same game object
@script RequireComponent(CharacterController)

function Awake ()
{
	moveDirection = transform.TransformDirection(Vector3.forward);
}

function UpdateSmoothedMovementDirection ()
{
	
	
	
	var cameraTransform = Camera.main.transform;
	
	// Forward vector relative to the camera along the x-z plane	
	var forward = cameraTransform.TransformDirection(Vector3.forward);
	forward.y = 0;
	forward = forward.normalized;
	// Right vector relative to the camera
	// Always orthogonal to the forward vector
	var right = Vector3(forward.z, 0, -forward.x);

	// Target direction relative to the camera
	var targetDirection = Input.GetAxis("Horizontal") * right + Input.GetAxis("Vertical") * forward;
	
	// We store speed and direction seperately,
	// so that when the character stands still we still have a valid forward direction
	// moveDirection is always normalized, and we only update it if there is user input.
	if (targetDirection != Vector3.zero)
	{
		moveDirection = Vector3.Lerp(moveDirection, targetDirection, smoothDirection * Time.deltaTime);
		moveDirection = moveDirection.normalized;
	}

	// Smooth the speed based on the current target direction
	var curSmooth = smoothSpeed * Time.deltaTime;
	// When in air we accelerate slower
	if (!grounded)
	{
		curSmooth *= 0.5;
	}

//ohne genau zu wissen, was ich hier mache, habe ich eine runSpeed funktion eingebaut

	if(Input.GetKey("left shift"))
		moveSpeed = Mathf.Lerp(moveSpeed, targetDirection.magnitude * speed *3, curSmooth);
	else
		moveSpeed = Mathf.Lerp(moveSpeed, targetDirection.magnitude * speed, curSmooth);
}

function Update() {

	UpdateSmoothedMovementDirection();

	if (grounded) {
		verticalSpeed = 0.0;
		
		// Jump		
		if (canJump && Input.GetButton ("Jump")) {
			verticalSpeed = jumpSpeed;
			jumping = true;
			SendMessage("DidJump", SendMessageOptions.DontRequireReceiver);
		}
	}
	// Apply gravity
	verticalSpeed -= gravity * Time.deltaTime;
	
	var movement = moveDirection * moveSpeed + Vector3 (0, verticalSpeed, 0);
	movement *= Time.deltaTime;
	
	// Move the controller
	var controller : CharacterController = GetComponent(CharacterController);
	var flags = controller.Move(movement);
	grounded = (flags & CollisionFlags.CollidedBelow) != 0;

	// Set rotation to the move direction	
	transform.rotation = Quaternion.LookRotation(moveDirection);
	
	// We are in jump mode but just became grounded
	if (grounded && jumping)
	{
		jumping = false;
		SendMessage("DidLand", SendMessageOptions.DontRequireReceiver);
	}
}

function GetSpeed () {

	return moveSpeed;
}

Shoot

Erstelle eine Waffe und weise diese deiner Figur zu (drag n drop).
Erzeuge ein Javascript nenne es shooter und weise es der Waffe zu (drag n drop). Im Script wird eine Instanz von bullet beim Drücken der Fire1 (linke Maus) Taste erzeugt.

Erklärung:

Die Instanz ist ein Prefab, welches in der IDE zugewiesen wird. Nach der Zuweisung fliegt die Kugel in Richtung der Waffenausrichtung. Die Variable amunition ist statisch, denn sie muss von einem anderen Script aus angesprochen werden. Später mehr dazu. Ganz unten wird die Anzeige der vorhandenen Munition erzeugt, siehe dazu das Thema GUI.

var bullet:Rigidbody;
static var amunition = 10;
var bulletSpeed = 20;

function shoot()
{
if(amunition > 0){
var currentBullet:Rigidbody = Instantiate(bullet, transform.position, transform.rotation);
currentBullet.velocity = transform.TransformDirection(Vector3(bulletSpeed*-1,0,0));
amunition --;

}
}

function Update () {
if(Input.GetButtonDown("Fire1") && amunition > 0)
{
shoot();
}
}

function OnGUI () {
GUI.Label(Rect(100,50,100,20),"Munition: "+amunition);
}

Bullet

Erzeuge eine Sphere, wähle sie aus und klicke auf Components, Physics, Rigidbody
Erzeuge ein Assets, Create, Prefab, nenne es bulletPrefab, und schiebe die Sphere aus der Hierachie auf das Prefab im Projects Panel.
Lösche die Sphere aus der Hierachie.
Wähle die Waffe im Hierachie Panel. Im Inspector erscheint das Script shooter und darin die Variable bullet, ziehe bulletPrefab darauf.

Teste das Spiel, wenn die Kugeln in die falsche Richtung schießen, vertausche die Parameter von TransformDirection(). Die 3 Parameter beziehen sich auf die Achsen der Waffe.
Wenn die Kugeln nicht auf den Boden fallen sollen, deaktiviere im Inspector unter RigidBody die Option UseGravity.

Damit die Kugeln nicht bis zum Sankt Nimmerleinstag in der Gegend rumliegen, kann man ein Script erstellen, welches sie nach ein paar Sekunden löscht.

Erstelle dir ein Script mit Assets, Create, Javascript, nenne es bulletScript

function Start () {
Destroy(this.gameObject, 10);
}

Ziehe das Script auf das bulletPrefab. Mit der destroy() Funktion wird eine Instanz entfernt. Die beiden Parameter sind die Instanz und die Zeit in Sekunden.

Munition

Erzeuge dir ein Objekt, welches die einsammelbare Munition darstellt. Erzeuge dir ein Prefab mit Asstes, Create, Prefab (Name: munition) und ziehe die Kiste darauf (Inspector, Position, 0,0,0). Kiste in der Hierachie löschen.

Damit man die Munitionskiste auf Berührung reagiert, wähle das Prefab munition aus und klicke, Component, Physics, Box Collider. Aktiviere im Inspector von BoxCollider die Option isTrigger

Erzeuge ein Javascript benenne es munitionScript und ziehe es auf das Prefab munition

function OnTriggerStay()
{
shooter.amunition += 10;
Destroy(this.gameObject);
}

Wir erinnern uns: im Script namens shooter, welches der Waffe zugewiesen wurde, gibt es die statische Variable amunition. Diese kann, da sie statisch ist, auf diese Art angesprochen werden und bekommt somit neue Munition zugewiesen.

Opfer

Wir erstellen uns mal als Opfer eine einfache Kugel. Diese hat standardmäßig einen Sphere Collider. Mach daraus ein Prefab, welches wir hier mal den Namen "ball" geben. Lösche die Kugel aus der Hierachie und schiebe mehrere "ball"-Prefabs in die Scene.

Erweitere das Javascript welches den bulletPrefab zugewiesen wurde (siehe 2 Abschnitte zurück). Aktiviere die Option isTrigger des bulletPrefab.

var lifeTimeSec = 4;

function Start () {
	Destroy(this.gameObject, lifeTimeSec);
}

function OnTriggerEnter (other : Collider) {
	if(other.gameObject.name == "ball")
	{
	  Destroy(other.gameObject);    
	}	
}

Wenn das Opfer erst nach 5 Treffern zerstört werden soll, muss das Opfer noch ein Script erhalten. Nennen wir das Javascript ballOpfer und weisen es dem Prefab ball zu.

var punkte:int = 4;

function treffer ()
{
	this.punkte--;
	
	if(this.punkte < 1)
	{
		Destroy(this.gameObject, 0);
	}
}

Nun muss natürlich auch noch das Script des bulletPrefab dementsprechend angepasst werden. Mittels GetComponent kann man auf das Script ballOpfer zugreifen und die Funktion treffer() aufrufen.

var lifeTimeSec = 4;

function Start () {
	Destroy(this.gameObject, lifeTimeSec);
}

function OnTriggerEnter (other : Collider) {
	if(other.gameObject.name == "ball")
	{
	  other.gameObject.GetComponent("ballOpfer").treffer();    
	}	
}

Youtube Trigger via Collide Video 1 Video 2

Youtube Creating Heathbars Video von bugzilla

mehr hierzu, Feind verfolgt Player und schießt auf Player

Skybox / Himmel

Edit, Render Settings im Inspector hinter Skybox Material auf das kleine Kreissymbol ganz rechts klicken und einen Himmel auswählen.

Eigenen Himnmel erstellen.

Wähle im Project einen Ordner oder den Ordner Standard Assets / Skyboxes
Create, Material
wähle es aus und klicke im Inspector auf shader, Render FX, Skybox
nun kann man 6 Bilder unter select auswählen, die Bilder sollten zuvor in einem Ordner des Projects abgelegt werden

Die Optionen der Bilder ermöglichen ein kacheln und einfärben.

Youtube Skybox (von Daniel 24)

Terrain / Landschaft

Terrain 1, Terrain 2, Terrain 3 Youtube Videos von Daniel 24

Terrain, Create Terrain,
der Anfasser zum Verschieben des Terrain befindet sich im Nullpunkt,
die Größe bestimmt man über Terrain, Set Resolution

Im Inspector gibt es verschiedene Werkzeuge zur Terraingestaltung.

Höhenpinsel

Male mit gedrückter Maustaste auf dem Terrain.
Negative Höhen
oder eindrücken der Oberfläche trägt man mit Shift Taste auf
F Taste zoomt auf Pinselposition

Texturpinsel

Schiebe dir Texturbilder in den Projects Ordner.
Wähle den Texturpinsel, Edit Textures, add, schiebe ein Bild aus deinem Projects Ordner in das sich öffnende Fenster auf Splat, none, bestätige mit Add, Apply. Das gesamte Terrain wird mit dieser Textur versehen, Wiederhole den Vorgang, um weitere Texturen zu erstellen, diese kann man dann mit gedrückter Maustaste auf das Terrain aufmalen.

Trees

Wähle den Treepinsel, Edit Trees, Add Tree, Ziehe dir aus Project View, Standard Assets, Trees, den Big Tree auf die Option Tree , None im sich öffnenden Fenster.
Man kann nun mit dem Pinsel einen Wald malen, beachte die Optionen des Pinsels. Mit Shift Taste kann man die Bäume löschen.

Eigene Bäume Game Object, Create, Other, Tree
Es gibt einen Tree-Creator, mit dem man sich einen Baum erstellen kann. Hier ein Youtube Video /nicht von mir

Unity Manual Trees

Plants/ Gras / Meshes

Wähle den Plant-brush, EditDetails, Add Gras Texture, ziehe ein zuvor im Project Folder erzeugtes Png Grasbild in das sich öffnende Fenster auf Detail Texture, none
Male Gras, beachte die Optionen des Pinsels, Shift Taste löscht Pflanzen/ Gras

Mit Edit, Add Detail Meshes ist es auch möglich Felsen oder andere Prefabs zu laden.

Other Settings

Hier stellt man generelle Optionen ein, wie Windstärke, Schatten, Rendering etc. Optionen bei Unity

Wasser

Wähle im Project , Standard Assets, Water und ziehe Daylight Water auf die Scene View. mit den Anfassern kannst du Größe und Position ändern

Terrain Toolkit

Das Terrain Toolkit kann man sich bei Unity herunterladen.
Terrain, Create Terrain
Component, Terrain, Terrain Toolkit
Im Inspector gibt es die Optionen und 3 Hauptmenüpunkte Create, Erode Texture

Create

Create, Vornoi..., Feature Type... Cells... siehe Documentation Generate
Die so entstandenen Zipfelmützenberge müssen nun verfeinert werden, beispielsweise folgendermaßen:
Perlin Preset Rocky Mountains / Blend 0.6 / Generate es ist immer noch zu kantig, Erosion tut Not

Erode

Erode, Hydraulic, Filter Fast, Preset, Rainswept Earth, Iterations 25, Maximum Slope 70, Falloff 1, Apply
Erode, Thermal, Preset Gradual Weak Erosion, Iterations 15, Minimum Slope, 1, Falloff 0.5, Apply

Texture

Add texture 4 mal anklicken Cliff Texture und 3 durchnummerierte Texturen entstehen, die auf die verschiedenen Höhen der Landschaft angewendet werden. Ziehe dir Texturen aus dem Projects Ordner auf die Texturfelder.

Die Cliff Texture wird nur bei steilen Wänden angewendet unter Texture Slope , Cliffstart 20 Cliffend 70, wird der Winkel eingestellt.
Texture Height bestimmt die Höhen der 3 anderen Texturen.

Mit Normalize kann man die Höhen (von-bis) generell verändern.

Road Path Tool

Ein tool von sixtimesnothing.com ein Video erklärt die Funktionen

Wähle terrain in Hierachie und ziehe das "Path Script" unter "Terrain" im Inspector.
Klicke dort im Inspector auf "New Path". In der Hierachie ensteht ein Path, wähle ihn aus.
Folgende Schritte müssen mehrmal wiederholt werden.

Dadurch entstehen jedesmal neue Knotenpunkte, die mit dem Roadmesh verbunden werden.
Wenn man die Straße zur Zufriedenheit erstellt hat, kann man die Feineinstellungen vornehmen, man wählt zwischen eine Straße Road, oder einem Weg, indem man Road deaktiviert.

Weg
width, Breite, texturePrototype: der Wert von 0 bis... entspricht den Texturen, welche dem Terrain zugewiesen wurden. Man kann so, eine der Terraintexturen für den Pfad bestimmen. Nachdem man alle Einstellungen vorgenommen hat, wähle Finalize Path.

Road
Breite und Mesh bestimmen Finalize Path.
Smooth Path, macht die Straße glatt, Smooth Path Slope, macht die Landschaft glatt
Wichtig ist hier erstmal das Material, es befindet sich eine Textur im Unterordner vom "Road Path Tool".
Ein Material hab ich nicht gefunden.
Erzeuge ein Material mit Assets, Create, Material,
wähle den "Road Diffuse Offset" Shader
Ziehe die Road Textur aus dem Project auf das Textur Feld im Inspector
Wähle dann den Path und weise im Inspector, Mesh Renderer, Materials das Material zu (drag drop).
Sollte das Material nicht über der Landschaft Textur liegen kann man im Script des Materials, offset aktiviern:
Material im Project auswähle, im Inspector Edit, im Script vor Offset die Kommentarzeichen löschen falls vorhanden.

Particle

Unity User Manual Particle System

Game Object, Create Other, Particle System
Im Inspector kann man die Optionen einstellen.

Material

Assets Create Material, im Inspector stellt man die Optionen ein, ein fertiges Material zieht man auf das Objekt.
Unity Manual Material
Unity Manual,Asset components Material, Mesh Renderer
Unity FAQ How do I use normal Maps (Bump/ Relief) und Detail Textures und wie man sich mit Photoshop Alpha Textures erzeugt. Der dort aufgeführt Befehl Layer->Matting->Defringe heißt in deutsch Ebene > Basis > Rand entfernen

Selbstverständlich kann man auch Materialien, welche mit importierten Objekten eingefügt wurden verändern. Beispielsweise zu dunkle Sketchup Materialien, mit SelfIllum Diffuse und einer helleren Main Color. Es wäre hierbei möglich eine Textur anzubringen, die bestimmte Teile der Textur erleuchtet, beispielsweise die Fenster auf der Hauswand. Mehr dazu bei Unity

Links

Youtube Videotutorials von bugzilla Unity Tipps


 

Michael Albers
mail@pastorpixel.de