2017-11-12 7 views
0

Ich habe für eine Weile auf den Code für ARCore Unity gesucht und ich möchte eine einfache Aufgabe, die eine Schaltfläche haben, so dass Benutzer ein Objekt in der platzieren können Szene, während sie wissen, wo sie platziert werden soll, während die verfolgten Ebenen sichtbar sind, und sobald der Benutzer das Objekt platziert, hat er die Option, die verfolgten Ebenen einfach optisch zu deaktivieren, so dass es realistischer aussieht. Ich konnte dies in Android Studio tun, indem sie so etwas wie dies in der Haupt HelloArActivity.java tun:Deaktivieren/Umschalten der Visualisierung von getrackten Ebenen in ARCore Einheit

if (planeToggle) { 
       mPlaneRenderer.drawPlanes(mSession.getAllPlanes(), frame.getPose(), projmtx); 
      } 

dies wirklich einfach war. Ich habe einen bool namens planeToggle erstellt und die Funktion mPlaneRenderer.drawPlanes in eine if-Bedingung gestellt. Wenn das Bool wahr ist, zeigt es die Ebenen an und wenn es falsch ist, ist es nicht ...

Allerdings bin ich mit Unity verwirrt. Ich habe so etwas in der HelloARController.cs:

Ich habe eine Schaltfläche zu togglePlanes gemacht. einen Ereignis-Listener es Legen Sie eine boolean Variable zu wechseln und tat etwas wie folgt aus:

for (int i = 0; i < m_newPlanes.Count; i++) 
       { 
       // Instantiate a plane visualization prefab and set it to track the new plane. The transform is set to 
       // the origin with an identity rotation since the mesh for our prefab is updated in Unity World 
       // coordinates. 

       GameObject planeObject = Instantiate(m_trackedPlanePrefab, Vector3.zero, Quaternion.identity, 
         transform); 
        planeObject.GetComponent<TrackedPlaneVisualizer>().SetTrackedPlane(m_newPlanes[i]); 

        m_planeColors[0].a = 0; 

        // Apply a random color and grid rotation. 
        planeObject.GetComponent<Renderer>().material.SetColor("_GridColor", m_planeColors[0]); 
        planeObject.GetComponent<Renderer>().material.SetFloat("_UvRotation", Random.Range(0.0f, 360.0f)); 


     if (togglePlanes == false){ // my code 

      planeObject.SetActive(false); // my code 

      } // 
    } 

Es passiert nichts, wenn ich auf den Schalter drücken.

Die andere Option war ich hatte Änderungen in der TrackedPlaneVisualizer.cs zu machen, wo ich so etwas wie dies tat:

for (int i = 0; i < planePolygonCount; ++i) 
      { 
       Vector3 v = m_meshVertices[i]; 

       // Vector from plane center to current point 
       Vector3 d = v - planeCenter; 

       float scale = 1.0f - Mathf.Min((FEATHER_LENGTH/d.magnitude), FEATHER_SCALE); 
       m_meshVertices.Add(scale * d + planeCenter); 

       if (togglePlanesbool == true) // my code 
       { 
        m_meshColors.Add(new Color(0.0f, 0.0f, 0.0f, 1.0f)); // my code 
       } 

       else 
       { 
        m_meshColors.Add(new Color(0.0f, 0.0f, 0.0f, 0.0f)); // my code 
       } 
    } 

Diese Arbeit taten. Aber ich habe Verzögerungen beim Umschalten und manchmal, wenn zwei verschiedene Ebenen gerendert wurden, wechseln sie zwischen sich selbst (wenn einer aktiviert ist, wird der andere deaktiviert). Also ich denke, das ist auch nicht die Option zu gehen .... Wer kann helfen?

Beachten Sie, dass ich ein Anfänger in Unity bin.

Antwort

1

Das Beispiel ist nicht wirklich entworfen, um die Flugzeuge zu verstecken und zu zeigen, also müssen Sie ein paar Sachen hinzufügen.

Zuerst gibt es keine Sammlung der GameObjects, die die ARCore-Ebenen darstellen. Am einfachsten fügen Sie den Spielobjekten ein Tag hinzu:

Suchen Sie im Unity-Editor das Präfix TrackedPlaneVisualizer und wählen Sie es aus. Fügen Sie dann im Eigenschafteninspektor das Dropdown-Menü Tag hinzu und fügen Sie ein Tag mit dem Namen plane hinzu.

Als nächstes müssen Sie in der Toggle-Handler-Methode alle Spielobjekte mit dem Tag "plane" suchen. Rufen Sie dann die Komponenten Renderer und TrackedPlaneVisualizer ab und aktivieren oder deaktivieren Sie sie basierend auf dem Umschalten. Sie müssen beide Komponenten ausführen. Der Renderer zeichnet das Flugzeug und der TrackedPlaneVisualizer aktiviert den Renderer erneut (im Idealfall wird der Status des Renderers berücksichtigt).

public void OnTogglePlanes(bool flag) { 
     showPlanes = flag; 
     foreach (GameObject plane in GameObject.FindGameObjectsWithTag ("plane")) { 
      Renderer r = plane.GetComponent<Renderer>(); 
      TrackedPlaneVisualizer t = plane.GetComponent<TrackedPlaneVisualizer>(); 
      r.enabled = flag; 
      t.enabled = flag; 
     } 
    } 

Sie können auch eine ähnliche Sache tun, wo die Gameobject instanziiert wird, ehren so neue Ebenen der Toggle.

+0

Vielen Dank! Das hat funktioniert! –

+0

Ich habe zuvor ein 'GameObject' (d. H.' PlaneWrapper') implementiert und dabei: 'Instantiate (plane, Vector3.zero, Quaternion.identity, PlaneWrapper.transform)'. Auf diese Weise kann ich 'PlaneWrapper.SetAccticve ([true | false])' 'setzen. Seltsamerweise, was ist der Overhead-Unterschied? – Daevin

+0

Der große Unterschied ist, dass SetActive alle Scripts eines Objekts steuert, während Sie das Rendering nur aktivieren/deaktivieren und andere Scripts weiterhin ausführen.Meiner Meinung nach ist es ein Fehler in TrackedPlaneVisualizer, aber es aktiviert den Renderer erneut, wenn sich das Mesh ändert oder der Renderer-Status überprüft wird. –