Siehe auch den zweiten Teil meiner Tipps zum Thema Unity Scripts
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 !!!!!!!
zeigt alle Objekte und Elemente
- zeigt alle Elemente in einer Liste
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.
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
wird das ausgewählte Object herangezoomt, sofern sich die Maus über Scene befindet.- Ansicht drehen
Ansicht verschieben
Alt- rechte Maus oder Mausrad - Zoom in and out
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.
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).
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.
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
, zoomt auf das ObjectObject duplizieren mit
klickenErzeuge ein paar Objekte beispielsweise 2 Räder und ein Autoteil.
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.
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.
Erzeuge ein Prefab mit
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
Erzeuge einen weiteren Cube, umbenenne ihn PhysicCube, wähle ihn aus,
, der Cube hat nun physikalische Eigenschaften und fällt runterKlicke auf den Play Button, um in der Game Ansicht das Verhalten zu sehen
In "
" öffne " " Ordner, öffne " ", wähle " r" und ziehe ihn in die Scene View, In der Game Ansicht ändert sich die Ansicht, da die Spielfigur eine eigene Kamera hat. 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
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
benutzen. (Luftwiderstand) Standardwerte sind .001 für Metal und 10 für eine Feder.
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.
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.
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.
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.
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:
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.
hier ein Script welches ein Objekt hoch und runter bewegt.
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); }
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)
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
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.
Dieses Script kann der MainCamera auf 2 Arten zugewiesen werden:
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); }
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
Erzeuge ein neues Script mit
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
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.
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.
zeigt die einzelnen Keys und Aktionen anWir haben die target Variable und weisen dieser einen neuen Wert zu, wenn die "Jump" Taste gedrückt wird.
Erzeuge ein neues Javascript namens "Switch",
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:
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.
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:
nenne es Cube
Ziehe "Cube1" aus der Hierachie View auf "Cube" in Project View.
Erzeuge ein neues Javascript und nenne es "Create"
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,
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
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.
Die Aktionen werden vor dem Rendern jedes Frames ausgeführt. Außer die physikalischen Verhaltensweisen.
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); }
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()
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.
Kollision mit anderen Game Objects
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"); }
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
Infos auch in meinen Blender Tipps.
Erzeuge eine Spielfigur in Blender
Erzeuge einzelne Animationen mit dem 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
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.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.
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
hat man die Möglichkeit alle Animationen eines Objektes auszuwählen, abzuspielen und weitere Optionen zu bestimmen.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["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); }
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 (
) 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); }
Basics 1, Basics 2, Basics 3,Youtube Videos von Daniel 24
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 importierte Figur aus dem Projects Folder auf actor.
vergebe einen Namen nachfolgend actor genannt und ziehe deineWähle actor aus und klicke
. 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.ziehe das Script auf die MainCamera in View. Wähle die MainCamera aus und öffne Script im und ziehe actor aus Hierachie auf .
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.
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
Vergebe dem Blob Shadow folgende Rotationswerte im Inspector.
Wähle im 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 .
Wähle …
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 ,
Wähle im Pane das Menü und wähle den Layernamen noShadow
Die Anfrage, wird mit Change Children Layers beantwortet.
Wähle Blob Shadow Projector im und vergebe im bei den Wert noShadow
Erzeuge ein neues 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; }
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); }
Erzeuge eine Sphere, wähle sie aus und klicke auf
Erzeuge ein , 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.
Erzeuge dir ein Objekt, welches die einsammelbare Munition darstellt. Erzeuge dir ein Prefab mit
(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,
. Aktiviere im Inspector von BoxCollider die Option isTriggerErzeuge 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.
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
im Inspector hinter Skybox Material auf das kleine Kreissymbol ganz rechts klicken und einen Himmel auswählen.
Wähle im
wähle es aus und klicke im auf
nun kann man 6 Bilder unter 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 1, Terrain 2, Terrain 3 Youtube Videos von Daniel 24
der Anfasser zum Verschieben des Terrain befindet sich im Nullpunkt,
die Größe bestimmt man über
Im Inspector gibt es verschiedene Werkzeuge zur Terraingestaltung.
Male mit gedrückter Maustaste auf dem Terrain.
Negative Höhen oder eindrücken der Oberfläche trägt man mit auf
zoomt auf Pinselposition
Schiebe dir Texturbilder in den Projects Ordner.
Wähle den Texturpinsel, , schiebe ein Bild aus deinem Projects Ordner in das sich öffnende Fenster auf , bestätige mit , . 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.
Wähle den Treepinsel,
Man kann nun mit dem Pinsel einen Wald malen, beachte die Optionen des Pinsels. Mit kann man die Bäume löschen.
Eigene Bäume
Es gibt einen Tree-Creator, mit dem man sich einen Baum erstellen kann. Hier ein Youtube Video /nicht von mir
Wähle den Plant-brush,
Male Gras, beachte die Optionen des Pinsels, löscht Pflanzen/ Gras
Mit
ist es auch möglich Felsen oder andere Prefabs zu laden.Hier stellt man generelle Optionen ein, wie Windstärke, Schatten, Rendering etc. Optionen bei Unity
Wähle im
und ziehe Daylight Water auf die . mit den Anfassern kannst du Größe und Position ändernDas Terrain Toolkit kann man sich bei Unity herunterladen.
n
Im Inspector gibt es die Optionen und 3 Hauptmenüpunkte Create, Erode Texture
Create
Preset / / es ist immer noch zu kantig, Erosion tut Not
Erode
, Preset , Iterations 15, Minimum Slope, 1, Falloff 0.5, Apply
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
bestimmt die Höhen der 3 anderen Texturen.
Mit Normalize kann man die Höhen (von-bis) generell verändern.
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.
Unity User Manual Particle System
Im Inspector kann man die Optionen einstellen.
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 Mehr dazu bei Unity
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.Youtube Videotutorials von bugzilla Unity Tipps
Michael
Albers
mail@pastorpixel.de