Ich bringe noch eine weitere Frage zum Ziehen mit der Maus (ich verwende Unity mit C #), aber mit einem weniger verbreiteten Detail: dem Vorhandensein von Hindernissen in der Mitte des Weges, durch den das Ziehen erfolgt (3D-Raum, nicht 2D) .
Lassen Sie mich erklären. Angenommen, ich habe eine Ebene, über die ich einen Würfel namens "obj" ziehen möchte. Das ist einfach. Hier ist meine einfache Implementierung dafür:
void Update () {
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit hit;
if(Physics.Raycast(ray, out hit, 1000000))
obj.transform.position = new Vector3(hit.point.x,0.25F,hit.point.z);
}
Es klappt. Angenommen, ich habe noch ein paar andere Würfel über dem Flugzeug, die die Hindernisse darstellen. Wenn sich der Spieler "obj" über das Flugzeug bewegt, sollte diese Bewegung offensichtlich durch die Hindernisse blockiert werden. Und dann, während "obj" mit den Hindernissen kollidiert, sollte es sich nur an den Seiten dieses Hindernisses bewegen. Wenn die Maus bewegt wird und "obj" nicht mehr mit Hindernissen kollidiert, wird die Bewegung im freien Ziehstil wieder fortgesetzt.
Um die Herausforderung zu erschweren, bemühe ich mich, dies ohne die Verwendung von RigidBody-Komponenten an den Hindernissen zu erreichen (das gezogene Objekt kann es haben). Irgendwelche Ideen, wie dies am effizientesten erreicht werden kann? Danke vielmals!
BEARBEITEN: Kommentatoren haben mich darauf aufmerksam gemacht, dass ich erwähnen sollte, dass sich Objekte beim Einrasten drehen dürfen.
EDIT 2: Angesichts der Schwierigkeit der ursprünglichen Formulierung habe ich die Frage geändert, die die Verwendung von Rigidbody-Komponenten an den gezogenen Objekten erlaubt. Die Lösung kann einfach keine Rigidbody-Komponenten an den Hindernissen verwenden.
Antworten:
Es ist schwierig, eine Kollision zu erkennen, ohne dass starre Körper beteiligt sind. Da Sie jedoch Würfel verwenden, können Sie möglicherweise Bounds.Intersects verwenden . Überprüfen Sie bei jeder Aktualisierung, ob sich die Grenzen des gezogenen Objekts mit den Grenzen von Hindernissen überschneiden. Wenn ja, können Sie Folgendes versuchen:
Sie hören nie auf, den Block zu ziehen. Dem Benutzer wird lediglich angezeigt, dass der Block nicht mehr gezogen wird, während er sich mit einem Hindernis überschneidet.
quelle
Ohne es selbst getan zu haben, würde ich Folgendes versuchen:
Es scheint mir, dass, wenn Sie möchten, dass Ihr Objekt entlang einer schrägen Ebene eines Hindernisses gezogen wird, die Transformation einfach weiterhin der Position des letzten Raycast-Treffers folgt.
quelle