Unity3d - 需要隐藏区域中的一组对象
Unity3d - Need to hide a group of objects in the area
我已经尝试过深度遮罩着色器并研究了一些其他想法,但它似乎根本不适合我。
我正在制作一款 AR 游戏,我有一个场景,里面有房子和树木。所有这些对象都是动画的,并且做一些像从天上掉下来的事情,但不是一次,而是顺序。比如先房子,再树,再栅栏等
(请看我的图片了解详情)http://f2.s.qip.ru/bVqSAgcy.png
如果用户将相机移得太远,他会看到所有这些物体都卡在空中,等待它们的命令开始下落,这并不好。我想从各个方面隐藏这个区域(因为在 AR 中相机可以自由移动)并且只有当每个部分开始移动(掉落)时才让所有部分可见。
(多一屏)http://f3.s.qip.ru/bVqSAgcz.png
我考虑过动画事件,但是对象(例如砖块)太多,我无法手动处理所有这些。
期待您的宝贵建议 ;)
P.S。对不起,我的英语不好。
您可以禁用它们的(即将掉落的物体)网格渲染器并在它们准备好掉落时重新激活它们。
有关网格渲染器的更多详细信息,请参阅 here。
停用您的对象。您可以使用相机视口坐标来获取视口外的 y 位置。它们从屏幕的左下角 (0,0) 开始,然后到达屏幕的右上角 (1,1)。将它们转换为世界空间坐标。 Camera.ViewportToWorldPoint
Vector3 outsideCamera = Camera.main.ViewportToWorldPoint(new Vector3(0.5f, 1.2f, 10.0f));
现在您可以使用对象的预期 x 和 z 位置。想放下就激活。
myObject.transform.position = new Vector3(myObject.transform.position.x, outsideCamera.y, myObject.transform.position.z);
您还可以做的另一件事是在对象下落时将其从非常小缩放到其预期大小。当用户将相机指向上方时,这将防止对象在掉落之前可见。
1-也许你可以使用相机远剪裁平面属性.
或者你甚至可以使用 2 Cameras 如果你需要用一个 "big" far clipping plane 并使用第二个 Depth only clear flags rendering only the items(根据我的理解,这个可以有一个更小的 far clipping plane)。
2- 我给你的另一个建议是给你的动画添加比例:
- 在动画开始时将比例设置为 0
- 等待需要的物品掉落
- 将比例设置为 1(如果需要可以进行过渡)
- 使物品掉落
编辑: 您找到的解决方法也很好!但我认为仅跟踪世界位置就足够了(节省少量内存)。
希望对您有所帮助,
最后,我选择的方案。我已将此脚本添加到组合中的每个对象。它在 Start() 中存储对象的位置(在我的例子中是世界位置和本地位置),如果它在 Update() 中发生变化则监听。因此,如果为真,则停止监视并将 MeshRenderer 设置为开启状态。
[RequireComponent(typeof(MeshRenderer))]
public class RenderScript : MonoBehaviour
{
private MeshRenderer mr;
private bool monitoring = true;
private Vector3 posLocal;
private Vector3 posWorld;
// Use this for initialization
void Start()
{
mr = GetComponent<MeshRenderer>();
mr.enabled = false;
posLocal = transform.localPosition;
posWorld = transform.position;
}
// Update is called once per frame
void Update()
{
if (monitoring)
{
if (transform.localPosition != posLocal || transform.position != posWorld)
{
monitoring = false;
mr.enabled = true;
}
}
}
}
在这之后甚至连我的有趣的廉价 сhinese 智能手机都还活着,所以,我想,没关系。
我已经尝试过深度遮罩着色器并研究了一些其他想法,但它似乎根本不适合我。 我正在制作一款 AR 游戏,我有一个场景,里面有房子和树木。所有这些对象都是动画的,并且做一些像从天上掉下来的事情,但不是一次,而是顺序。比如先房子,再树,再栅栏等
(请看我的图片了解详情)http://f2.s.qip.ru/bVqSAgcy.png
如果用户将相机移得太远,他会看到所有这些物体都卡在空中,等待它们的命令开始下落,这并不好。我想从各个方面隐藏这个区域(因为在 AR 中相机可以自由移动)并且只有当每个部分开始移动(掉落)时才让所有部分可见。
(多一屏)http://f3.s.qip.ru/bVqSAgcz.png
我考虑过动画事件,但是对象(例如砖块)太多,我无法手动处理所有这些。
期待您的宝贵建议 ;)
P.S。对不起,我的英语不好。
您可以禁用它们的(即将掉落的物体)网格渲染器并在它们准备好掉落时重新激活它们。
有关网格渲染器的更多详细信息,请参阅 here。
停用您的对象。您可以使用相机视口坐标来获取视口外的 y 位置。它们从屏幕的左下角 (0,0) 开始,然后到达屏幕的右上角 (1,1)。将它们转换为世界空间坐标。 Camera.ViewportToWorldPoint
Vector3 outsideCamera = Camera.main.ViewportToWorldPoint(new Vector3(0.5f, 1.2f, 10.0f));
现在您可以使用对象的预期 x 和 z 位置。想放下就激活。
myObject.transform.position = new Vector3(myObject.transform.position.x, outsideCamera.y, myObject.transform.position.z);
您还可以做的另一件事是在对象下落时将其从非常小缩放到其预期大小。当用户将相机指向上方时,这将防止对象在掉落之前可见。
1-也许你可以使用相机远剪裁平面属性.
或者你甚至可以使用 2 Cameras 如果你需要用一个 "big" far clipping plane 并使用第二个 Depth only clear flags rendering only the items(根据我的理解,这个可以有一个更小的 far clipping plane)。
2- 我给你的另一个建议是给你的动画添加比例:
- 在动画开始时将比例设置为 0
- 等待需要的物品掉落
- 将比例设置为 1(如果需要可以进行过渡)
- 使物品掉落
编辑: 您找到的解决方法也很好!但我认为仅跟踪世界位置就足够了(节省少量内存)。
希望对您有所帮助,
最后,我选择的方案。我已将此脚本添加到组合中的每个对象。它在 Start() 中存储对象的位置(在我的例子中是世界位置和本地位置),如果它在 Update() 中发生变化则监听。因此,如果为真,则停止监视并将 MeshRenderer 设置为开启状态。
[RequireComponent(typeof(MeshRenderer))]
public class RenderScript : MonoBehaviour
{
private MeshRenderer mr;
private bool monitoring = true;
private Vector3 posLocal;
private Vector3 posWorld;
// Use this for initialization
void Start()
{
mr = GetComponent<MeshRenderer>();
mr.enabled = false;
posLocal = transform.localPosition;
posWorld = transform.position;
}
// Update is called once per frame
void Update()
{
if (monitoring)
{
if (transform.localPosition != posLocal || transform.position != posWorld)
{
monitoring = false;
mr.enabled = true;
}
}
}
}
在这之后甚至连我的有趣的廉价 сhinese 智能手机都还活着,所以,我想,没关系。