Jump to content
Unity Insider Forum

Mausklick fokussieren


Blupp44

Recommended Posts

Hallo zusammen,

ich beschäftige mich seit kurzem mit Unity und C#. Um die Grundlagen besser verstehen zu können, wollte ich mich jetzt an einem 2D Spiel versuchen.

Der Spieler bewegt sich per Mausklick und soll jetzt die Stelle, zu der er hingeht auch fokussieren. Diesen Code habe ich im offiziellen Unity Forum gefunden:

 using UnityEngine;
 using System.Collections;
 
 public class GotoMouse : MonoBehaviour {
 
     public float speed = 1.5f;
     private Vector3 target;
 
     void Start () {
         target = transform.position;
     }
     
     void Update () {
         if (Input.GetMouseButtonDown(0)) {
             target = Camera.main.ScreenToWorldPoint(Input.mousePosition);
             target.z = transform.position.z;
         }
         transform.position = Vector3.MoveTowards(transform.position, target, speed * Time.deltaTime);
     }    
 }

 

Mir wäre außerdem wichtig zu wissen, wie man den Code noch verändern könnte, aber die Funktion beibehält.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Da gibt's lauter Sachen, die alle mehr oder weniger wichtig sind oder mehr oder weniger die Funktion verändern.

Das geht los bei so Sachen wie der Klammersetzung - die öffnenden geschweiften Klammern werden in C# in der Regel in die nächste Zeile gepackt, also:

if ( ... )
{
  // Code

statt

if ( ... ) {
  // Code

Aber hier geht's um die Lesbarkeit und ist darüber hinaus im Zweifelsfall auch Geschmackssache. Konsistenz ist hier wichtiger als eine der beiden Varianten für sich genommen.

Ist ja aber auch nur ein Beispiel für die Kleinigkeiten, an denen man schrauben könnte. Wenn man sich wichtigere Sachen anschauen will, sollte man auf jeden Fall nicht in "richtig" oder "falsch" denken. Du musst dir bewusst machen, was du genau willst, und dann genau das implementieren. Zum Beispiel wird hier Vector3.MoveTowards benutzt. In diesem Kontext bedeutet das eine gleichbleibende Geschwindigkeit bis zum Ziel. Du könntest den Code dahingehend abändern, dass die Figur erst schnell ist, und dann immer langsamer wird, je näher sie dem Ziel kommt. Oder dass sie von 0 auf "speed" beschleunigt, wenn sie losläuft. Und natürlich besonders interessant wird es, wenn deine Figur nicht mehr durch Wände laufen können soll.

Um auf dieser Ebene etwas zu verändern, musst du von jeder Zeile, von jedem Teil jeder Zeile wissen, was er tut. Dann kannst du diese Teile abändern, unnötiges wegnehmen oder neue Features hinzufügen. Von daher gilt auf jeden Fall: Wenn du Code findest - auch wenn er sofort und problemlos funktioniert - stelle sicher, dass du ganz genau verstehst, warum. Bei Fragen in dieser Hinsicht sind wir auf jeden Fall für dich da! :)

Zum Schluss noch: Wenn dein Code genau das tut, was er soll, ist der nächste Schritt, gute "Code-Qualität" zu haben. Damit ist gemeint, dass dein Code nicht nur richtig funktioniert, sondern noch einige zusätzliche Merkmale erfüllt, wie z.B. Lesbarkeit oder Robustheit. Lesbarkeit ist dafür da, dass andere Leute verstehen können, was dein Code macht, ohne den eine Woche lang zu studieren. Unterschätze nie den Wert davon: Wenn du selber nach ein paar Monaten deinen Code wieder anschaust und er ist nicht sonderlich lesbar, dann kannst nicht einmal du selbst mit diesem Code weiterarbeiten... es sei denn, du arbeitest dich superlange wieder ein :). Aber... wie gesagt, das kommt später, wenn dein Code genau das tut, was er soll.

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 3 Stunden schrieb Der_L:

was genau passiert in der Zeile

Du hast zwei Vector3-Werte, also Dinger mit drei Kommazahlen: x, y und z. Wofür diese drei Zahlen genau stehen, kann je nach Kontext variieren.

In diesem Fall hast du ja eine 2D-Kamera. Ob etwas näher an der Kamera dran ist oder weiter weg, macht für sie erst einmal keinen Unterschied. Die Zeile darüber ermittelt eine Position relativ zur Kamera. Ist die Kamera weiter rechts, dann wird diese Position ebenfalls weiter rechts sein, sodass du auf das klicken kannst, was du da siehst. Bei dieser Zeile kommt eine Position in Form eines Vector3 heraus, aber man muss sich die Frage stellen: Wie weit von der Kamera weg hast du eigentlich geklickt? Du kannst problemlos sagen: "ich habe in die obere, rechte Ecke geklickt", aber wie weit in das Bild hinein, wie weit in die Entfernung du geklickt hast ist unklar - schließlich ist dein Bildschirm ja flach. Deswegen hat die z-Komponente des Vektors auch einen Wert, der eventuell nicht besonders sinnvoll ist. Nimmst du jetzt die fragliche Zeile heraus, könnte dein Charakter sich näher an die Kamera heran oder weiter davon weg bewegen. Der Kamera ist das erst einmal egal, da bei einer 2D-Kamera Dinge nicht kleiner wirken, wenn sie weiter weg sind. Allerdings könnten sich Probleme ergeben, wie z.B. dass dein Charakter hinter einem anderen Objekt verschwindet.

Deshalb wird der Wert der z-Komponente der Zielposition abgeändert; es wird einfach der Wert der z-Komponente der aktuellen Position genommen. Dein Charakter bewegt sich damit zu einer neuen Position, aber diese neue Position ist bitte genauso weit von der Kamera entfernt wie die Figur aktuell sowieso schon ist.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Also Vector3 hat 3 Achsen(x, y, z) und ist somit eigentlich für 3D Spiele geeignet. Da wir aber ein 2D Spiel haben, nehmen wir von "target" die Aktuelle z-Achse/Komponente und überschreiben diese auf die neue z-Achse/Komponente, somit bleibt der Wert immer gleich & die Figur kann sich nicht der Kamera nähern oder entfernen, ist das richtig ?

Link zu diesem Kommentar
Auf anderen Seiten teilen

So ziemlich, außer:

vor 2 Stunden schrieb Der_L:

überschreiben diese auf die neue z-Achse/Komponente

Genau genommen überschreiben wir die z-Komponente mit dem alten Wert, damit sich die Entfernung der Figur zur Kamera nicht ändert, während sie sich auf das Ziel zubewegt.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Am 25.7.2019 um 14:00 schrieb Sascha:

Da gibt's lauter Sachen, die alle mehr oder weniger wichtig sind oder mehr oder weniger die Funktion verändern.

Das geht los bei so Sachen wie der Klammersetzung - die öffnenden geschweiften Klammern werden in C# in der Regel in die nächste Zeile gepackt, also:


if ( ... )
{
  // Code

statt


if ( ... ) {
  // Code

 

Ich nehme als jahrelanger Programmierer auch immer die zweite Variante. Aber Visual Studio korrigiert das zu der ersten Variante. Dann ändere ich es auch nicht mehr ab.

// Also so
if (health <= 0) {
    if (EventManager) {
        EventManager.Broadcast("OnPlayerDead", player);
    } else {
        Debug.LogError("EventManager kaputt!")
    }
}

// Statt so
if ( health <= 0 ) 
{
    if( EventManager ) 
    {
        EventManager.Broadcast( "OnPlayerDead", player);
    } 
    else 
    {
        Debug.LogError("EventManager kaputt!")
    }
}

Und wenn man mich fragt wieso? Weil:

if ( health <= 0 )
    if (EventManager)
        EventManager.Broadcast("OnPlayerDead", player);
    else
        Debug.LogError("EventManager kaputt!")

Haben eine kleine Ähnlichkeit :)

Aber ist echt Geschmacksache. Visual Studio verbessert meine Bedingungen immer mit einen Space zwischen den Klammern z.B. ( health <= 0 ). mag ich nicht so.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dachte ich mir schon, aber ich hab's einfach schon viel zu oft gehabt, dass Leute beinahe das richtige Bild hatten und dann irgendwo auf die Nase gefallen sind, weil's eben doch nicht genau richtig war. Da bin ich dann irgendwann pingelich mit Wortlauten geworden, um auf Nummer sicher zu gehen :)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

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

×
×
  • Neu erstellen...