Jump to content
Unity Insider Forum

Objekte in Umgebung Laden


PM_Daniel

Recommended Posts

Hallo Leute!

 

Ich hab wieder mal ein Problem (Wer hätte das gedacht ;P ).

 

Ich bin gerade dabei ein 2D Spiel zu entwerfen bei dem ziemlich viele GameObjects

in einer Szene bzw. sogar in in einem Scroll View.

 

Nun möchte ich aber das nur die Objekte die ich sehe Angezeigt werden.

Ich habe es mal ganz simpel mit einem Collider auf der Cam versucht und Trigger auf den Objekten.

Diese haben dann bei Enter die Objekte aktiviert und bei Exit deaktiviert.

Das klappt auch super, doch brauchen die Collider, bzw. die Abfragen mehr Leistung als die Objekte an sich.

 

Gibt es evtl. eine Möglichkeit wie ich das ohne Collider lösen kann? :)

 

Über Hilfe wäre ich wie immer sehr dankbar!

Link zu diesem Kommentar
Auf anderen Seiten teilen

Guten Morgen! :)

@Ismoh Danke erstmal für den Tipp. Allerdings nutze ich "Image".

@Sascha Theoretisch weis ich das, allerdings hab ich im Profiler folgendes stehen (zumindest wenn ich Scrolle):

CanvasRenderer.SyncTransform

CanvasRenderer.SyncWorldRect

CanvasRenderer.SyncClipRect

 

und da jeweils so viel Calls wie Gameobjekte.

In meinem Test sind das gerade 10.000.

 

Allgemein hab ich es nun etwas anders gelöst, was allerdings immer noch nicht die beste Methode ist, denke ich.^^

 

Ich habe den jeweiligen Objekten eine Updatefunktion gegeben in dem abgefragt wird:

void Update()
{
	if (transform.position.y < 0 - Range || transform.position.y > 0 + Range)
	{
		Button.SetActive(false);
	}
	else
	{
		Button.SetActive(true);
	}
}

 

An sich kostet das auch viel Leistung, diese liegt aber weit unter allen vorangegangenen Optionen.

 

Evtl kann mir da noch jemand helfen? :)

 

Hier ein Update:

 

   private void Update()
   {
    if (Math.Abs(_oldTrans.y - transform.position.y) > 1)
    {
	    if (_on && Vector2.Distance(new Vector2(0, 0), transform.position) > Range)
	    {
		    transform.GetChild(0).gameObject.SetActive(false);
		    _on = false;
	    }
	    if (!_on && Vector2.Distance(new Vector2(0, 0), transform.position) < Range)
	    {
		    transform.GetChild(0).gameObject.SetActive(true);
		    _on = true;
	    }
	    _oldTrans.y = transform.position.y;
    }
   }

 

Preformanter bekomme ich es nicht hin.

 

So läuft es allerdings auch auf meinem Alten Galaxy Express problemlos mit 10k Objekten. :)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ach herrje, hatte übersehen, dass es um einen Canvas geht. Da macht Unity tatsächlich kein Frustum Culling.

 

Aber: http://forum.unity3d.com/threads/ui-elements-culling.360420/

best way would be to add a 2D Rect Mask to the canvas object. this culls the children which i think is what you want.

Sollte noch aktuell sein, was da im Thread steht. Versuche mal, das nachzubauen; könnte sich lohnen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

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

×
×
  • Neu erstellen...