C# 在全息镜头中,当一个对象位于另一个对象内部时,如何选择内部游戏对象?
我正在尝试创建一个应用程序,其中一个游戏对象可以位于另一个游戏对象内。我希望能够移动内部的游戏对象,而它是在外部的。当用户注视内部对象并进行空气轻击手势时,外部对象就是移动的对象。有没有办法在MRTK中实现此行为。尝试使用C# 在全息镜头中,当一个对象位于另一个对象内部时,如何选择内部游戏对象?,c#,unity3d,hololens,mrtk,C#,Unity3d,Hololens,Mrtk,我正在尝试创建一个应用程序,其中一个游戏对象可以位于另一个游戏对象内。我希望能够移动内部的游戏对象,而它是在外部的。当用户注视内部对象并进行空气轻击手势时,外部对象就是移动的对象。有没有办法在MRTK中实现此行为。尝试使用transform.localPosition而不是transform.position Transform.position使用场景坐标变换。localPosition使用父对象的局部坐标。我想你的意思是:外部对象的碰撞器正在阻止光线投射,所以你不能击中内部碰撞器 尝试使用获
transform.localPosition
而不是transform.position
Transform.position
使用场景坐标<代码>变换。localPosition使用父对象的局部坐标。我想你的意思是:外部对象的碰撞器正在阻止光线投射,所以你不能击中内部碰撞器
尝试使用获取所有对象,然后检查是否命中子对象如果是,则选择子对象,如果是父对象,则选择子对象
为此,我将使用和
例如
using System.Linq;
...
var hits = Physics.RaycastAll(transform.position, transform.forward, 100.0F);
GameObject selectedObject = null;
// go through all hits
foreach (var hit in hits)
{
// get all children colliders of the hit object
var colliders = hit.gameObject.GetComponentsInChildren<Collider>(true);
// since these will also include this hit collider itself filter it/them out
var childrenColliders = colliders.Where(c => c.gameObject != hit.gameObject);
// Finally check if any children is contained in the hits
// if yes then this object can not be selected
if(childrenColliders.Any(c => hits.Contains(c)) continue;
// otherwise you have found a child that has no further hit children
selectedObject = hit.gameObject;
break;
}
使用System.Linq;
...
var hits=physical.RaycastAll(transform.position,transform.forward,100.0F);
GameObject selectedObject=null;
//通关
foreach(命中率中的var命中率)
{
//获取命中对象的所有子碰撞器
var colliders=hit.gameObject.GetComponentsInChildren(true);
//因为这些也包括这个命中碰撞器本身,所以会过滤掉它/它们
var childrenColliders=colliders.Where(c=>c.gameObject!=hit.gameObject);
//最后检查点击中是否包含任何子项
//如果是,则无法选择此对象
如果(childrenColliders.Any(c=>hits.Contains(c))继续;
//否则,您已找到一个没有进一步命中儿童的儿童
selectedObject=hit.gameObject;
打破
}
只需移除外部对象的碰撞器即可当用户查看游戏对象时,您想按层次查找游戏对象,还是同时查找两者?我认为这里的问题在于外部对象的碰撞器阻止光线投射,因此您无法命中内部对象;)