Jump to content
Unity Insider Forum

Camera nach "LookAT" durcheinander


Elowan

Recommended Posts

Du musst verstehen was die Scripte machen. Das ist das Geheimnis dabei!

Ein vorgefertigtes Script zu nutzen hilft ersteinmal schnell um einen kleinen Erfolg zu haben. Aber wie du selber gemerkt hast, lassen sich viele vorgefertigte Scripte nicht einfach zusammen nutzen.

Deswegen musst du scripten lernen. Nutze dabei die anderen Scripte um zu verstehen, kopier sie aber nicht einfach.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Das ist sicherlich richtig, Malzbie.

 

Ich versuche, aus dem Code anderer zu lernen, den anzupassen und für mich nutzbar zu machen.

Dabei lerne ich die Dinge (so der Plan). Ich sehe schon an vielen Stellen, was der code da so macht - nur kenne ich nicht die Alternativen Funktionen/Befehle von Unity, weiß nicht "Warum das nur so gehen kann" oder "Wenn du in dem Script das so machst - dann kannst du xy nicht so in dem anderen script machen", usw.

 

Ok, wie dem auch sei:

 

Ich werde einen letzten Versuch wagen, bzw. sind es genau genommen zwei ;)

 

1. Dem ZoomRotateScript mal ein "echtes" Target (ein angeklicktes GO) zuweisen und sehen, wie sich das ganze dann verhält.

Ich hoffe, das sich das Problem (der Cam-tilt um die Z Achse) damit lösen lässt, bzw. gar nicht auftreten wird.

(Den Teil mit Alt+Linke Maus = zentrieren+cam Richtung Go verschieben lasse ich dabei erstmal raus)

 

Wenn das klappt, muss ich einen Weg finden, wie ich das target wieder "löschen", bzw. "breaken" kann, so bald man mit der Maus wieder panning macht...

 

2. Alternativ den Teil mit Alt+linke Maus belassen und einen Weg finden, die Verschiebung durch hit.distance so ablaufen zu lassen

, dass die Cam die gleiche "Y-Höhe" wie das GO bekommt + sich in der Z-Achse der Cam nichts ändert (also diese unsägliche Rotation ausbleibt oder "auf null" gesetzt wird) Vielleicht mit "Camera.main.transform.rotation.z = 0"?!

 

Falls das auch nicht geht, bleibt nur 15$ auszugeben für eine Cam-Script aus dem Asset Store oder es ganz bleiben zu lassen.

 

Mir stehen max. 12h Freizeit pro Woche zur Verfügung (die ich am PC nutzen kann). Geht man mal davon aus, dass man so ab 6 Monaten intensiven lernens erst Resultate vorweisen können wird, ist es dann nächstes Jahr Sommer, bis ich so etwas wie eine "Homeworld-Cam" aus dem Ärmel schütteln kann ;) Aber gut - gut Ding braucht Weile... allerdings werde ich dann wohl wieder umsteigen und ein anderes Game modden, statt zu versuchen, es von Grund auf direkt so aufzubauen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Sehr löbich, dass du versuchst deine Eigenen Sachen aus den Scripte heraus zu ziehen.

Und ja, es ist frustrierend, wenn man weiß, was man machen will, aber die Befehle nicht kennt.

Du wirst jedoch sehen, dass es immer besser wird und immer schneller geht, neue Felder zu erforschen.

 

Ich geb dir mal eine Strucktur, was du machen solltest, könntest:

 

Alles was du machst, bezieht sich auf die Transform Komponente deines GameObjects. DIese Komponente gibt deine Position und Rotation im Raum wieder. Deswegen das erste Suchwort: "Transform" http://docs.unity3d..../Transform.html

DIese Komponente hat Variablen und Funktionen, die wichtig für dich sind.

 

Bei den Variablen findest du "localPosition" und localEulerAngles". Local ist wichtig, weil es die Eigene Ausrichtung und Richtung bedient. Will ich nämlich etwas bewegen, dann kann das im Bezug auf die Welt sein oder auch im Bezug auf das Objekt selbst.

In der Welt ist vorwärts,rückwärts immer in in die gleiche Richtung. Egal wo das vorwärts für dein Objekt wäre.

Wenn sich dein Objekt dreht, dann zeigt die Z-Achse des Objektes von sich aus gesehen nach vorne. Von der Welt aus gesehen wäre das aber garnicht mehr vorne sondern vielleich halbrechts. Guckst du also auf dein Ziel und willst geradeaus drauf zu fahren, dann bietet es sich an deine lokalen Werte nutzen und zu beschreiben.

 

Bei den Funktionen vom Transform findest du z.B. LookAt und Translate. LookAt zum Gucken aufs Ziel und Translate für das Bewegen des Transforms.

 

Die Positionsangaben und die Rotationsangaben sind vom Typ Vector3. Somit brauchst informationen darüber: http://docs.unity3d....ce/Vector3.html

Auch hier gibt es wieder Variablen und Funktionen. Die Variablen x,y und z brauchst du für deine Positionsangaben und Drehung.

Die Funktionen RotateToward, Distance, MoveToward und auch Lerp helfen dir dabei eine langsame Drehung und Bewegung zu bekommen.

 

Um ein Ziel anzuklicken und Werte zurück zu bekommen, brauchst du Physics.Raycast http://docs.unity3d....cs.Raycast.html

Physics deswegen, weil ein Objekt um erkannt zu werden einen Collider bzw. Trigger braucht und das ist eine physikalische Komponente.

Im untersten Beispiel siehst du, wie du von der Kamera aus einen Raycast in Richtung Maus sendest. Nutze das Beispiel um ein Objekt als Ziel zu markieren und den RaycastHit auszuwerten. http://docs.unity3d....RaycastHit.html

 

 

 

Jetzt versuch einfach einmal eine popelige Szene zu erzeugen wo deine Camera und ein paar Ziele drin sind. Einfache Quader tuen es da ganz gut.

Schreib dir ein Script, wo einfach über die 4 Tasten awsd die Kamera hoch runter links und rechts bewegt wird. Denk an die "Lokale" Bewegung.

Wenn das geht, erweiterst du das Script und fügst den Raycast hinzu. Die Informationen des RaycastHit nutzt du um Variablen zu beschreiben. Du willst ja wissen wo das Ziel im Raum liegt und wie weit es entfernt ist.

Versuch jetzt mit RotateToward dich zum Ziel zu drehen.

Wenn das auch geht und deine Bewegungen über die Pfeiltasten immer noch funktionieren, geste zu nächsten Schritt.

Bau dein Mausrad ein um mit Hilfe der Distanz eine Vorwärtsbewegung bis zu einem Punkt vor dem Objekt zu kommen.

Jetzt sollte das andere natürlich immer noch gehen.

 

Mach es so und du wirst dein eigenes Script haben, welches auch funktioniert. Und das Beste daran, du hast es dann auch verstanden. :)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Soooo, habe nun so einiges selbst gescriptet, nach der Unity reference, step by step.

 

Es funktioniert auch alles, jetzt bin ich jedoch wieder bei letzen Schritt angelangt und benötige hier Hilfe, um auch diesen erfolgreich ans Laufen zu kriegen:

 

 

 

// Wenn Alt+linke Maus gleichzeitig gedrückt wurden
  if(Input.GetMouseButton(0)&& Input.GetKey(KeyCode.LeftAlt)){

  // Erzeuge Strahl, Ursprung ist der MouseInput (Cursor) 2D x,y Koord. im Screen.Space
  Ray ray = Camera.main.ScreenPointToRay (Input.mousePosition);
  RaycastHit hit;

  if(Physics.Raycast(ray, out hit)){
  // Wenn etwas getroffen wurde, existierten ein hit.point & hit.distance = (Entfernung [m] Vom origin (MouseInput) zum hit.point
  Debug.Log("Etwas getroffen bei Koordinate "+hit.point); // 3D x,y,z Koord. im World.Space)
  Debug.Log("Name des GObj "+hit.collider.name); // Name des GOs
  Debug.Log("Entfernung "+hit.distance+" Meter"); // Entfernung (Schrägstrecke 3D)
  Debug.DrawLine(ray.origin, hit.point); // Darstellung als Line (Ursprung zu Treffer) auf dem Bildschirm

 

Der Debug liefert:

 

Etwas getroffen bei Koordinate (-72.3, 26.0, 70.1)

 

Name des GObj A_BS2-full-rot-fix

 

Entfernung 298.859 Meter

 

So - wie verschiebe ich nun meine Camera auf den X,Y Wert der ermittelten Koordinate?

 

Ist "Camera.main.transform.position = new Vector3(hit.point.x, hit.point.y, 0);" richtig?

 

Oder noch besser wäre es, der "Target Variable" meiner Camera würde auf das getroffene GameObject "A_BS2-full-rot-fix" als neues Target zugeordnet werden (den Namen des GOs habe ich ja zumindest).

 

(Habe ich mittlerweile selbst herausgefunden) :)

 

 

Leider habe ich es immer noch nicht geschafft, alle scripte in eines zu packen. Das funktioniert einfach so nicht.

Egal, ob ich selber alles neu programmiere oder nicht.

Entweder pan ODER Zoomen per Mousewheel, beide zusammen no way.

 

Das liegt an dieser Stelle:

// calculate position based on the new currentDistance
		position = target.position - (rotation * Vector3.forward * currentDistance + targetOffset);
		transform.position = position;

 

Wenn man die letzte Zeile auskommentiert, dann geht Pan, rotate usw. aber der Mousewheel zoom nicht mehr (logo). transform.position beisst sich wohl mit dem pan getaxis-script, bzw. dem berechnen der Verschiebungen...

 

Ich werde einfach mal versuchen, Teile vom Cam script auf andere GO auszulagern... mal sehen, was da geht.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

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

×
×
  • Neu erstellen...