Jump to content
Unity Insider Forum
Der_L

Mausklick fokussieren

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.

Share this post


Link to post
Share on other sites

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.

  • Thanks 1

Share this post


Link to post
Share on other sites

Danke Sascha,

wärst du denn bereit mit mir den Code durchzugehen ? Im Prinzip verstehe ich bereits was dort steht, nur hätte ich einzelne Fragen, dir mir noch offen sind.

Share this post


Link to post
Share on other sites

target.z = transform.position.z; -was genau passiert in der Zeile & warum wird die nicht in der Ereignismethode mit eingebunden ?

steht .z -Steht der . für Operator & z für die Achse ? Also so ähnlich wie Steuerelement.Eigenschaft ?

Share this post


Link to post
Share on other sites
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.

Share this post


Link to post
Share on other sites

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 ?

Share this post


Link to post
Share on other sites

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.

Share this post


Link to post
Share on other sites
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.

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...

×
×
  • Create New...