Adi*_*l.R 3 c# android unity-game-engine arcore
我一直在寻找ARCore Unity的代码已有一段时间,我想做一个简单的任务,就是有一个切换按钮,以便用户可以在场景中放置对象,同时知道在跟踪平面可见的情况下将对象放置在哪里并且,一旦用户放置了对象,便可以在视觉上禁用跟踪的平面,从而使它看起来更逼真。通过在主HelloArActivity.java中执行以下操作,我可以在Android Studio中做到这一点:
if (planeToggle) {
mPlaneRenderer.drawPlanes(mSession.getAllPlanes(), frame.getPose(), projmtx);
}
Run Code Online (Sandbox Code Playgroud)
这真的很简单。我创建了一个名为planeToggle的布尔型,并将mPlaneRenderer.drawPlanes函数置于if条件中。当布尔值为true时,它显示飞机;而布尔值为false时,它不显示飞机。
但是,对于Unity我感到困惑。我在HelloARController.cs中做了这样的事情:
我做了一个按钮来切换平面。设置一个事件侦听器以切换一个布尔变量,并执行以下操作:
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
} //
}
Run Code Online (Sandbox Code Playgroud)
当我按下切换按钮时,什么也没有发生。
我的另一个选择是在TrackedPlaneVisualizer.cs中进行如下更改:
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
}
}
Run Code Online (Sandbox Code Playgroud)
这确实有效。但是我遇到了切换的延迟,有时如果渲染了两个不同的平面,它们将开始在它们自己之间切换(如果启用了一个,则禁用了另一个)。所以我想这也是不可行的选择。...谁能提供帮助?
请注意,我是Unity的初学者。
该示例并非真正用于隐藏和显示飞机,因此您必须添加一些内容。
首先,没有代表ARCore平面的GameObjects的集合。最简单的方法是向游戏对象添加标签:
在Unity编辑器中,找到TrackedPlaneVisualizer预制件并选择它。然后在属性检查器中,下拉标签下拉列表并添加一个名为plane的标签。
接下来,在Toggle处理程序方法中,您需要找到所有带有“ plane”标记的游戏对象。然后获取Renderer和TrackedPlaneVisualizer组件,并根据切换启用或禁用它们。您需要同时做这两个组成部分。渲染器绘制平面,TrackedPlaneVisualizer重新启用渲染器(理想情况下,它将接受渲染器的状态)。
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;
}
}
Run Code Online (Sandbox Code Playgroud)
您还可以在实例化GameObject的地方做类似的事情,因此新的飞机将使用该切换。
| 归档时间: |
|
| 查看次数: |
4090 次 |
| 最近记录: |