MustafGames Geschrieben 6. Februar 2017 Melden Share Geschrieben 6. Februar 2017 Hallo, ich bin gerade dabei ein Abfrage Script zu machen um mir einige Arbeit zu erleichtern. Dieser soll in alle 3 Achsen Richtungen ein bestimmte Reichweite lang Würfel platzieren, das macht er auch und das klappt auch. Jeder dieser Würfel bekommt folgenden Script. public GameObject main; public bool hasset = false; void Start() { if (Physics.OverlapSphere(transform.position, 0.8f) != null) { if (!hasset) { main.GetComponent<CheckCubePosition>().text = main.GetComponent<CheckCubePosition>().text + "\n" + "SetBlock(x+" + transform.position.x + ",y+" + transform.position.y + ",z+" + transform.position.z + ", new Block(0, 0, 0, 255, true), chunk, true);"; hasset = true; } } } Jedes mal wenn ein Würfel innerhalb eines Colliders ist, was in diesen Fall ein Mesh Collider ist einer Mauer aus Würfeln (als Gesamtobjekt), ich möchte nun überprüfen an welche Stelle etwas ist und an welcher Stelle Luft (Nichts) ist. Jedoch speichert er mir alles ein also angeblich wäre überall etwas. Liegt das an dem Mesh Collider? Die Mauer sieht so aus: Mfg Mustaf PS: Diese Meldung sehe ich immer ganz oben, wenn ich ein neues Thema erstelle. Warning: Cannot modify header information - headers already sent by (output started at /www/htdocs/w0133467/daubit/unitycommunity/board/admin/applications/forums/sources/classes/post/classPostForms.php:799) in /www/htdocs/w0133467/daubit/unitycommunity/board/admin/sources/classes/output/formats/html/htmlOutput.php on line 141 Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Helishcoffe Geschrieben 6. Februar 2017 Melden Share Geschrieben 6. Februar 2017 Also wenn ich das richtig verstehe, möchtest du eine Reihe aus würfeln generieren lassen, und wenn diese Würfelreihe irgendwo anstößt, soll das Objekt zurückgegeben werden? Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
MustafGames Geschrieben 6. Februar 2017 Autor Melden Share Geschrieben 6. Februar 2017 Also wenn ich das richtig verstehe, möchtest du eine Reihe aus würfeln generieren lassen, und wenn diese Würfelreihe irgendwo anstößt, soll das Objekt zurückgegeben werden? Ja praktisch, möchte ich folgendes: Wenn diese Mauer aus einzelnen Würfeln wäre, dann hätte ja jeder Würfel eine Position (0, 1, 0 oder 2, 1, 0 usw), diese Positionen möchte ich. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Zer0Cool Geschrieben 6. Februar 2017 Melden Share Geschrieben 6. Februar 2017 Hat dein Würfel eventuell auch einen Collider? Lass dir am besten mal die Namen der gefundenen GameObjects zurückgeben: using UnityEngine; using System.Collections; public class ExampleClass : MonoBehaviour { void Start() { Collider[] hitColliders = Physics.OverlapSphere(transform.position, 0.8f); int i = 0; while (i < hitColliders.Length) { Debug.Log("Gameobjekt "+i+" - "+ hitColliders[i].gameObject.name); i++; } } } Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
MustafGames Geschrieben 8. Februar 2017 Autor Melden Share Geschrieben 8. Februar 2017 Hat dein Würfel eventuell auch einen Collider? Lass dir am besten mal die Namen der gefundenen GameObjects zurückgeben: using UnityEngine; using System.Collections; public class ExampleClass : MonoBehaviour { void Start() { Collider[] hitColliders = Physics.OverlapSphere(transform.position, 0.8f); int i = 0; while (i < hitColliders.Length) { Debug.Log("Gameobjekt "+i+" - "+ hitColliders[i].gameObject.name); i++; } } } Ja die Prüferwürfel haben alle Collider (Box Collider), das Objekt wo ich die einzelnen Positionen haben möchte wo keine luft ist sondern Material hat einen mesh Collider. Sie geben alle auch das selbe Objekt wieder was so sein soll, jedoch auch die Würfel die eigentlich in einen leeren Bereich wo kein mesh ist sind, liegt denke ich am Mesh Collider. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
QuesterDesura Geschrieben 8. Februar 2017 Melden Share Geschrieben 8. Februar 2017 Du suchst möglicherweise das hier: https://docs.unity3d.com/ScriptReference/Physics.OverlapBox.html Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
MustafGames Geschrieben 8. Februar 2017 Autor Melden Share Geschrieben 8. Februar 2017 Du suchst möglicherweise das hier: https://docs.unity3d...OverlapBox.html Danke das hat mich auf eine Idee gebracht, man muss halt manchmal Dinge aus einer anderen Seite sehen. Edit: Leider ist die Idee doch nicht so gut, ich habe mal oben beschrieben unter Lösung 2 wie ich es eigentlich vor hatte. Aktuell funktioniert es so: void Start() { Collider[] hitColliders = Physics.OverlapSphere(transform.position, 0.5f); int i = 0; while (i < hitColliders.Length) { if (!hasset) { GetComponent<MeshRenderer>().sharedMaterial = trigger; main.GetComponent<CheckCubePosition>().text = main.GetComponent<CheckCubePosition>().text + "\n" + "SetBlock(x+" + transform.position.x + ",y+" + transform.position.y + ",z+" + transform.position.z + ", new Block(0, 0, 0, 255, true), chunk, true);"; hasset = true; } trigg = hitColliders[i].gameObject; Debug.Log("Gameobjekt " + i + " - " + hitColliders[i].gameObject.name); i++; } } Problem ist, das die CollisionDetection immer die Ränder nimmt und nicht die Mitte was bedeutet Blöcke die an der Seite dranliegen werden auch aktiviert. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
MustafGames Geschrieben 19. Februar 2017 Autor Melden Share Geschrieben 19. Februar 2017 #Push Wie kann ich statt den Rändern eines Colliders z.b. die Mitte nehmen das nicht die 2 die außen dran sind auch genommen werden? Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Tiwaz Geschrieben 19. Februar 2017 Melden Share Geschrieben 19. Februar 2017 Mach doch einfach die Box kleiner oder visualisier das Ganze und benutze ein richtiges CubeChecker Objekt und das hier https://docs.unity3d.com/ScriptReference/Bounds.Contains.html Zusätzlich könntest du gleich bei den Bounds bleiben und z.B. die Vertices der gecheckten Bounds oder sowas abfragen. Also liegen z.B. alle 8 Ecken der Würfel innerhalb der Checker.Bounds, wenn ja aktivier sie, wenn nein sind sie nur teilweise drin und mach was immer du dann machst. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
MustafGames Geschrieben 21. Februar 2017 Autor Melden Share Geschrieben 21. Februar 2017 Mach doch einfach die Box kleiner oder visualisier das Ganze und benutze ein richtiges CubeChecker Objekt und das hier https://docs.unity3d...s.Contains.html Zusätzlich könntest du gleich bei den Bounds bleiben und z.B. die Vertices der gecheckten Bounds oder sowas abfragen. Also liegen z.B. alle 8 Ecken der Würfel innerhalb der Checker.Bounds, wenn ja aktivier sie, wenn nein sind sie nur teilweise drin und mach was immer du dann machst. Bei Bounds.Contains muss ich ja einen Vector3 Punkt angeben, was soll ich da den angeben? Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Tiwaz Geschrieben 21. Februar 2017 Melden Share Geschrieben 21. Februar 2017 Die Positionen der Cubes oder wenn du's präzise haben möchtest die Vertices bzw. die Eckpunkte der Bounding Box der Cubes, was aber ja eigentlich auch die Vertices selbst sind (Die bounding box des Cubes ist logischerweise - sofern er nicht rotiert ist - genau so groß wie der Cube selbst) und die kannst du ja theoretisch easy über das Mesh auslesen, statt mit den Bound Center und Extends rumzurechnen. -> Bei Cubes kannst du easy immer die Vertices benutzen, bei komplexeren Meshes würde ich wohl auf eine rotierte Bounding Box zurückgreifen, aber das ist nicht so trivial wie bei den Vertices des Cubes, von daher.. vernachlässigbar an dieser Stelle. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
MustafGames Geschrieben 21. Februar 2017 Autor Melden Share Geschrieben 21. Februar 2017 Die Positionen der Cubes oder wenn du's präzise haben möchtest die Vertices bzw. die Eckpunkte der Bounding Box der Cubes, was aber ja eigentlich auch die Vertices selbst sind (Die bounding box des Cubes ist logischerweise - sofern er nicht rotiert ist - genau so groß wie der Cube selbst) und die kannst du ja theoretisch easy über das Mesh auslesen, statt mit den Bound Center und Extends rumzurechnen. -> Bei Cubes kannst du easy immer die Vertices benutzen, bei komplexeren Meshes würde ich wohl auf eine rotierte Bounding Box zurückgreifen, aber das ist nicht so trivial wie bei den Vertices des Cubes, von daher.. vernachlässigbar an dieser Stelle. Verstehe nicht so ganz wie du das meinst, damit prüfe ich doch ob die Ecken des Würfels im Würfel sind oder? Kann man den nicht einfach prüfen ob der mittlere Punkt eines Würfels in einem Collider drin ist, damit würde es die angrenzenden Würfel ausschliessen. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Tiwaz Geschrieben 22. Februar 2017 Melden Share Geschrieben 22. Februar 2017 Ja schon, ich wäre jetzt davon ausgegangen, dass sich der Origin in der Mitte des Cubes befindet, was dann quasi der Position des Cubes entspricht, was ja gleich meine 4 ersten Worte des Posts waren aber wenn du halt mehr Präzision bräuchtest z.B., ob der Cube teilweise drin ist oder so, dann könnte man das eben die bounds oder im Falle der Cubes eben über die Vertices machen. Aber im Endeffekt kannst du's natürlich so machen wie's dir am idealsten erscheint, also auch einfach ganz simpel über die Position. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
MustafGames Geschrieben 22. Februar 2017 Autor Melden Share Geschrieben 22. Februar 2017 Also, dann so abfragen? if (colliders[i].bounds.Contains(colliders[i].transform.position) { der Würfel ist im Bereich der Collision und es collidiert die Mitte des Würfels? } Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Tiwaz Geschrieben 22. Februar 2017 Melden Share Geschrieben 22. Februar 2017 Nein du müsstest einen separaten Collider/Trigger erstellen, der genau den abzufragenden Raum abdeckt und kannst dann mit dem checken Aber ja, wäre aber dann im Prinzip: if(checkerCollider.bounds.Contains(colliders[i].transform.position){ // Der Würfel ist im Bereich } Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
MustafGames Geschrieben 23. Februar 2017 Autor Melden Share Geschrieben 23. Februar 2017 Achso ich soll praktisch mit den kleinen Würfel (der mir die Position gibt) abfragen ob die Mauer in ihm drin ist? Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
MustafGames Geschrieben 2. März 2017 Autor Melden Share Geschrieben 2. März 2017 public GameObject main; public GameObject trigg; public Material trigger; void Start() { Collider[] hitColliders = Physics.OverlapSphere(transform.position, 50, 1 << 8); int i = 0; while (i < hitColliders.Length) { if (GetComponent<Collider>().bounds.Contains(hitColliders[i].transform.position)) { hitColliders[i].GetComponent<MeshRenderer>().sharedMaterial = trigger; main.GetComponent<CheckCubePosition>().text = main.GetComponent<CheckCubePosition>().text + "\n" + "SetBlock(x+" + hitColliders[i].transform.position.x + ",y+" + hitColliders[i].transform.position.y + ",z+" + hitColliders[i].transform.position.z + ", new Block(0, 0, 0, 255, true), chunk, true);"; } trigg = hitColliders[i].gameObject; Debug.Log("Gameobjekt " + i + " - " + hitColliders[i].gameObject.name); i++; } } Das ist aktuell der Abfrage Script. Ich erstelle mit einen anderen Script eine Anzahl an Würfel in allen Richtungen weil ich ja die Positionen möchte, das wären dann die Positionen der erstellten Würfel. Mein Objekt welches ich dafür nehme hat einen Mesh Collider (Ist ja eine Mauer als 1 Massives Objekt). Nur es findet keine Würfel. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Recommended Posts
Archiviert
Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.