Jump to content
Unity Insider Forum

Cube Checker


MustafGames

Recommended Posts

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:

 

f2d37d-1486395159.png

 

 

 

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

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

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

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

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.

 

 

 

8672da-1486574079.png

 

 

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 2 weeks later...

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

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

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

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

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

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

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

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

Archiviert

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

×
×
  • Neu erstellen...