Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Techie

Alter Hase

  • »Techie« ist der Autor dieses Themas

Beiträge: 717

Wohnort: Bayreuth

Beruf: Student | Hilfswissenschaftler in der Robotik

  • Private Nachricht senden

1

10.12.2013, 17:22

[ Unity & C# ] RayCast und Picking

Hi Leute,
ich arbeite zur Zeit an meinem Mini-RTS.
Ich möchte gerne auf einer Plane eine Position wählen auf die sich anschließend ein Objekt bewegen soll.
Leider treffe ich da auf ein Problem, den das Objekt bewegt sich zwar auf die Richtige stelle, aber versinkt leider halb im Boden, hat da jemand eine Idee wie ich das beheben kann?

Mein Code zum Bewegen ist wie folgt:

C#-Quelltext

1
    void Move( Vector3 target) {        Debug.Log( target );            transform.position = target;        }        // Alles andere als fertig..



Gruß Techie
I write my own game engines because if I'm going to live in buggy crappy filth, I want it to me my own - Ron Gilbert

2

10.12.2013, 17:31

Versuchs doch so:

C#-Quelltext

1
2
3
4
5
6
void Move( Vector3 target) 
{        
target.y += 1; //Also du veränderst den Höhenwert deines Vektors, aber du musst halt schauen was du für eine Zahl brauchst bzw. sogar für unterschiedliche Einheiten andere Höhenunterschiede benutzen.
Debug.Log( target );           
transform.position = target;        
}


Das wäre jetzt meine Idee. ;)

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

3

10.12.2013, 17:43

Deine Bewegung ist doch vermutlich nur 2 dimensional. Bewege deine Objekte am besten auch genau so. Entweder passt du die Höhenkoordinate passend an ( so wie von poorsider vorgeschlagen ) oder du bewegst einfach nur auf der X und Y Achse. Wenn du die Y Koordinate passend wählst, dann würde ich mir den Wert aber passend für jedes Objekt berechnen und nicht einfach eine Konstante von 1 dafür verwenden. Am besten ist meiner Meinung nach den Abstand über einen Ray zu bestimmen welchen du von oben feuerst. Dadurch kannst du dann die Höhe des Bodens bestimmen und dein Objekt passend auf den Boden "pappen". Wenn dein Boden wirklich nur aus einer flachen Plane besteht, dann kannst du dir diesen Ray natürlich sparen da du die Höhe der Plane ja kennst. Dann reicht die Höhe der einzelnen Objekte für die passende Y Koordinate.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

Renegade123

Alter Hase

Beiträge: 494

Wohnort: Berlin

Beruf: Certified Unity Developer

  • Private Nachricht senden

4

10.12.2013, 17:57

Was hälst du von der Idee, einfach eine CharacterController Komponente mit seiner SimpleMove Methode zu benutzen?
CharacterController.SimpleMove
Das ganze erspart dir insofern Arbeit, weil SimpleMove die Gravitation aus dem Physics Manager berücksichtigt und die Geschwindigkeit entlang der Y-Achse ignoriert.
Physics Manager

Ich würde prinzipiell, sofern es im Kontext möglich ist, immer auf das Physic System von Unity bei Bewegungen zurückgreifen. Sieht nicht nur in den meisten Fällen besser aus, ist auch simpler zu handhaben.
Liebe Grüße,
René

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »Renegade123« (10.12.2013, 18:09)


Sacaldur

Community-Fossil

Beiträge: 2 301

Wohnort: Berlin

Beruf: FIAE

  • Private Nachricht senden

5

11.12.2013, 09:39

Auch wenn ich mir den CharacterController noch nicht angesehen habe, würde ich grundsätzlich erstmal empfehlen, den Weg zu gehen, den Renegade vorgeschlagen hat.

Ansonsten noch der Hinweis: vielleicht könnte es sinnvoll sein, wann der Punkt deiner Einheiten, anhand derer diese Positioniert werden, nicht deren Mittelpunkt ist, sondern unterhalb ihrer Füße liegt. Erreichen kann man das, indem man das Modell einfach um die Hälfte seiner Höhe nach oben verschiebt und das gesamte GameObject dann wieder auf den Boden setzt.
Wenn der CharacterController (warum auch immer) nicht verwendet werden kann, aber Physik in Frage kommt, kann man, statt die Position selbst anzupassen, die Geschwindnigkeit der Einheit anpassen.
Wenn auch Physik nicht in Frage kommen sollte, könnte man mit Hilfe eines Raycasts die Höhenkoordinate herausfinden, nur wird das ziemlich kompliziert, wenn die Einheit sich auch mal unter begehbarem Tarrain bewegt. Wenn man von einer zu hohen Position aus einen Raycast nach unten macht, könnte es die über der Einheit liegenden Platform treffen, wenn es von einem zu tiefen Punkt aus gemacht wird, startet der Raycast evtl. bereits im Boden (Abhängig von der Einheitenposition und der Umgebung).
Spieleentwickler in Berlin? (Thema in diesem Forum)
---
Es ist ja keine Schande etwas falsch zu machen, als Programmierer tu ich das täglich, [...].

Renegade123

Alter Hase

Beiträge: 494

Wohnort: Berlin

Beruf: Certified Unity Developer

  • Private Nachricht senden

6

11.12.2013, 20:15

Sollte Physik absolut nicht in Frage kommen, so benutze anstatt SimpleMove die CharacterController.Move Methode (berücksichtig Geschwindigkeit in Y-Achse und ignoriert Gravity Einstellung im Physics Manager). Prinzipiell benutzt der CharacterController sowieso keine echte Physik - viel mehr imitiert er eine Dome/Unreal Like. Willst du es physikalisch korrekt mit Kräften haben, so musst du eine Variante mit Rigidbody schreiben. Hier ein FPS Beispiel von Unify.

PS: Für die korrekte Höhe checkst du in der Start mit einem Raycast von der Position des Players (sollte an den Füßen sein) nach unten nach dem Layer des Terrains und setzt den Character auf die Position des RaycastHit. (Vorausgesetzt das Terrain ist eine Plane)
Liebe Grüße,
René

Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von »Renegade123« (11.12.2013, 20:29)


Techie

Alter Hase

  • »Techie« ist der Autor dieses Themas

Beiträge: 717

Wohnort: Bayreuth

Beruf: Student | Hilfswissenschaftler in der Robotik

  • Private Nachricht senden

7

12.12.2013, 18:38

Danke für die Antworten, ich habe jetzt erstmal den einfachen Weg mit dem addierten Y nutzen, da ich dieses Problem nur bei meinen "Gebäuden" sehe, Charactere bekommen einen eigenen A*-Algorithmus.
:)

Eine Frage bleibt aber noch, die "Bewege"-Methode wird über SendMessage aufgerufen, ich möchte nun Attribute dieser Objekte abfragen. Diese Attribute sind in eigenen Scripten gecodet.
Wie frage ich diese ab bzw. wie kann ich Rückgabewerte durch SendMessage nutzen?
I write my own game engines because if I'm going to live in buggy crappy filth, I want it to me my own - Ron Gilbert

Sacaldur

Community-Fossil

Beiträge: 2 301

Wohnort: Berlin

Beruf: FIAE

  • Private Nachricht senden

8

12.12.2013, 21:12

Was meinst du mit dem "Weg mit dem addierten Y"? am Passendsten wäre es, den Bezugspunkt des Gameobjects an dessen "zentrierten Bodenposition" zu haben. Wenn man dann das GameObject auf eine bestimmte Koordinate auf der Karte setzt, dann steht es auch richtig auf dem Boden (und nicht im Boden). Am ehesten solltest du ein leeres GameObject haben, in das dann das Model (weiteres GameObject) reingelegt wird (ggf. Verschoben).

Rückgabewerte: ist mir in der Form nicht bekannt.
Am ehesten solltest du an die Komponente (also das Objekt der jeweiligen Klasse) kommen und die Methoden davon aufrufen.
Das kann entweder über ein Zuweisen im Editor gemacht werden (public-Variable oder [SerializeField]) oder über einen Aufruf von GameObject.GetComponent<T>().
Wenn du solche Aufrufe häufiger durchführen musst, könnte eine Speicherung der Komponente sinnvoll sein, statt GetComponent (oder eine der Find Methoden) jedes Mal aufzurufen (eine entsprechende Anmerkung dazu gab es bereits in einem anderen Thema).
Spieleentwickler in Berlin? (Thema in diesem Forum)
---
Es ist ja keine Schande etwas falsch zu machen, als Programmierer tu ich das täglich, [...].

Werbeanzeige