Jump to content
Unity Insider Forum

Was an meinem Unity-Projekt verursacht die Fehler?


UnityMaster

Recommended Posts

Hi,

mein erster Beitrag in diesem Forum und gleich zu Beginn eine solch wahrscheinlich schwer zu beantwortende Frage ...

 

Ich möchte ein Spiel programmieren und dazu die Game Engine Unity verwenden. Deshalb habe ich ein Unity-Tutorial begonnen, nachzuvollziehen, bzw. durchzugehen. Gleich nach den ersten Schritten, ist dabei ein Hindernis aufgetaucht.

Das Unity-Tutorial, von dem ich spreche, gibt es in der Zeitschrift „iX Developer“, in der ersten Ausgabe des Jahres 2015. Die Ausgabe ist übertitelt mit den Worten „Spiele entwickeln“ und das Tutorial ist in drei Teile aufgeteilt. Der erste Teil befasst sich mit „Ersten Schritten“ in Unity.

Ziel des gesamten Tutorials ist das Erschaffen eines einfachen Spiels in Form einer Art 3D-Jump’n’Run. Der Spieler soll in die Lage versetzt werden, mit einer Spielfigur von Plattform zu Plattform zu springen und dabei Münzen einzusammeln, bis er die Ziellinie erreicht.

 

Folgende Schritte habe ich unternommen:

  1. Installation von Unity (ohne „MonoDevelop“)
  2. Anlegen eines Projekt-Ordners (mit dem entsprechenden Unity-Dialog-Fenster)
  3. Anlegen des Projekts und Aufruf der Unity-Arbeitsumgebung
  4. Anlegen einer Plane (GameObject -> Create Other -> Plane) und Benennung in „Floor“
  5. Zurücksetzen aller Transformationen auf Standardwerte
  6. Aktivieren der Eigenschaft „Static“ über die Checkbox bei „Static“
  7. Skalieren der Plane in allen drei Richtungen (x, y und z) auf 1000.
  8. Anlegen eines Ordners „Materials“ innerhalb des Projekts (im Ordner „Assets“)
  9. Anlegen eines Materials innerhalb des Ordners „Materials“ (Rechtsklick auf den Ordner -> Create -> Material)
  10. Benennen des Materials in „Floor“ und Setzen der Farbe des Materials auf „grau“
  11. Zuweisen des Materials einem GameObject durch Drag and Drop auf die Plane
  12. Anlegen eines Ordners Namens „Scenes“ im Unterordner „Assets“ über den Dialog „Speichern unter“ und Speichern der Szene im Ordner „Scenes“
  13. Anlegen eines neuen GameObjects „Capsule“ im entsprechenden Menü (GameObject -> Create Other -> Capsule)
  14. Benennen des GameObject „Capsule“ in „Player“
  15. Setzen der Position von Player in Y-Richtung auf „1.01“
  16. Anlegen eines neuen Materials, Benennen in „Player“ und Zuweisen der Farbe „grün“ und Zuweisen des Materials dem Player in der Szene über Drag and Drop
  17. Erzeugen eines Character Controllers (Markieren des Players in der Szene, Klicken auf „Add Component“ im Inspector -> Physics -> Character Controller)
  18. Anlegen eines Neuen Ordners „Scripts“ im Ordner „Assets“
  19. Anlegen eines C#-Scripts „ThirdPersonController“ (Rechtsklick auf den Ordner -> Create -> C# Script)
  20. Zuweisen des Scripts mittels Drag and Drop dem Player
  21. Doppelklick auf das Script (an dieser Stelle öffnet sich im Tutorial der Editor „MonoDevelop“, ich verwende aber „Notepad++“)
  22. Implementierung einer Tastensteuerung über die Input-Klasse wie folgt:
    using UnityEngine;
    using System.Collections;
    
    public class ThirdPersonController : MonoBehaviour {
    
    	CharacterController characterController;
    	public float rotationSpeed = 60.0f;
    	public float walkingSpeed = 8.0f;
    
    	// Use this for initialization
    	void Start () {
    		characterController = this.GetComponent<CharacterController> ();
    	}
    
    	// Update is called once per frame
    	void Update () {
    		float forward = Input.GetAxis("Vertical");
    		float rotate = Input.GetAxis("Horizontal");
    		float strafe = Input.GetAxis("Strafe");
    	}
    }


  23. Öffnen des InputManagers (Edit -> Project Settings -> Input)
  24. Öffnen von „Axis“ im InputManager
  25. Duplizieren des Eintrags „Horizontal“ (Rechtklick auf Horizontal -> Duplicate)
  26. Umbenennen des Duplikats in „Strafe“ und Ändern des negativen und des positiven Buttons auf „q“ und „e“
  27. Löschen der beiden Einträge für alternative Buttons
  28. Hinzufügen der folgenden Code-Zeilen in oben genanntem Script:
     
    transform.Rotate(Vector3.up, rotate * rotationSpeed * Time.deltaTime);
    Vector3 direction = this.transform.right * strafe + this.transform.forward * forward;
    characterController.SimpleMove (direction + walkingSpeed);


    Der gesamte Quelltext sieht nun so aus:

    using UnityEngine;
    using System.Collections;
    
    public class ThirdPersonController : MonoBehaviour {
    
    	CharacterController characterController;
    	public float rotationSpeed = 60.0f;
    	public float walkingSpeed = 8.0f;
    
    	// Use this for initialization
    	void Start () {
    		characterController = this.GetComponent<CharacterController> ();
    	}
    
    	// Update is called once per frame
    	void Update () {
    		float forward = Input.GetAxis("Vertical");
    		float rotate = Input.GetAxis("Horizontal");
    		float strafe = Input.GetAxis("Strafe");
    		transform.Rotate(Vector3.up, rotate * rotationSpeed * Time.deltaTime);
    		Vector3 direction = this.transform.right * strafe + this.transform.forward * forward;
    		characterController.SimpleMove (direction + walkingSpeed);
    	}
    }


  29. Erster Test der Anwendung über den Play-Button am oberen Fensterrand von Unity (oberhalbe des SceneExplorers)

Im Tutorial startet hier das Spiel und die Figur lässt sich bewegen, ich bekomme aber die drei folgenden Fehlermeldungen (in der Unity Console) und das „Spiel“ startet nicht:

 

Assets/Scripts/ThirdPersonController.cs(23,49): error CS0019: Operator `+' cannot be applied to operands of type `UnityEngine.Vector3' and `float'

Assets/Scripts/ThirdPersonController.cs(23,37): error CS1502: The best overloaded method match for `UnityEngine.CharacterController.SimpleMove(UnityEngine.Vector3)' has some invalid arguments

Assets/Scripts/ThirdPersonController.cs(23,37): error CS1503: Argument `#1' cannot convert `object' expression to type `UnityEngine.Vector3'

Hat jemand eine Idee, woran das liegen könnte? Was mache ich falsch? Was übersehe ich? Ich komme nicht weiter. :( Ich würde mich freuen, ein paar Ideen oder Lösungsvorschläge von euch zu sehen.

 

Gruß,

UnityMaster

Link zu diesem Kommentar
Auf anderen Seiten teilen

Erstmal die Frage warum benutzt du Notepad ?

und beim schnellen rüber gucken würde ich bei

characterController.SimpleMove (direction + walkingSpeed);

statt einen + , ein * schreiben.

 

Ich verstehe zwar deinen Fehler...weil du willst ja zu der Richtung die Geschwindigkeit haben, und deswegen addierst du. Aber ja ich würde es mit * versuchen. Probier es einfach mal :)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Erstmal die Frage warum benutzt du Notepad ?

und beim schnellen rüber gucken würde ich bei

characterController.SimpleMove (direction + walkingSpeed);

statt einen + , ein * schreiben.

 

Ich verstehe zwar deinen Fehler...weil du willst ja zu der Richtung die Geschwindigkeit haben, und deswegen addierst du. Aber ja ich würde es mit * versuchen. Probier es einfach mal :)

Gut gesehen, Get-Smart. Ich denke auch, dass da der Fehler liegt. In der Zeile

Vector3 direction = this.transform.right * strafe + this.transform.forward * forward;

wird festgelegt, in welche RICHTUNG der Character gehen soll. Das Ganze ist ein Vector3, und SimpleMove erwartet auch einen Vector3 als Parameter. Wenn du jetzt den Vector mit einer float multiplizierst, sollte es gehen.

 

Ich möchte dich noch für deine superausführliche Beschreibung loben. Ein wohltuender Unterschied zu den vielen "Mein Programm funktioniert nicht, mimimi"-Threads. Und noch was: cooler Nickname ;)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ihr habt völlig Recht! Statt des + muss dort ein * hin! Das gibt es doch nicht! Ich habe jedes Element des Scripts x Mal überprüft und doch habe ich diesen kleinen Fehler einfach übersehen und das mehrfach. Vermutlich hätte ich es bemerkt, wenn ich versucht hätte, zu verstehen, was diese Codezeile bewirkt.

 

Jedenfalls ganz herzlichen Dank an euch beide! Ihr habt mir richtig gut geholfen.

 

Und ja, wenn ich mir für ein Problem Hilfe von anderen erwarte, versuche ich immer das Problem so genau wie möglich zu beschreiben. Nur so kann mir vernünftig geholfen werden. Alles andere würde den Leser (und potentiellen Helfer) nur frustrieren.

 

Wegen Notepad++: Mit dem Editor kenne ich mich aus. Und bei der Installation von Unity hatte ich, glaube ich, MonoDevelop ausversehen "abgewählt", sodass dieses nicht mit installiert wurde. Hat denn das noch andere Nachteile? Ich müsste Unity komplett neu installieren, um MonoDevelop hinzuzufügen.

 

Freudigen Gruß,

UnityMaster

Link zu diesem Kommentar
Auf anderen Seiten teilen

Nö, Notepad++ ist ein sehr guter Editor mit Syntaxhighlighting usw.

 

Empfehlen würde ich dir einfach Visual Studio in der kostenlosen Community-Edition. Vorteil: Intellisense und vor allem Debugging. Das hat mir schon ein paar mal den Hintern gerettet. Außerdem wäre der Fehler oben vermutlich direkt im Editor angezeigt worden. VS hat auch weniger Macken als MonoDevelop. Außerdem kannst du dein Spiel gleich von VS heraus starten, Haltepunkte setzen usw.

 

VS kannst du auch gut nachträglich installieren. Die Integration in Unity ist ein wenig tricky, dazu benötigst du die Erweiterung http://unityvs.com/.

 

Hier ist eine Beschreibung zur Installation des Ganzen: https://msdn.microsoft.com/en-us/library/dn940025%28v=vs.140%29.aspx

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.

×
×
  • Neu erstellen...