Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在全息镜头中,当一个对象位于另一个对象内部时,如何选择内部游戏对象?_C#_Unity3d_Hololens_Mrtk - Fatal编程技术网

C# 在全息镜头中,当一个对象位于另一个对象内部时,如何选择内部游戏对象?

C# 在全息镜头中,当一个对象位于另一个对象内部时,如何选择内部游戏对象?,c#,unity3d,hololens,mrtk,C#,Unity3d,Hololens,Mrtk,我正在尝试创建一个应用程序,其中一个游戏对象可以位于另一个游戏对象内。我希望能够移动内部的游戏对象,而它是在外部的。当用户注视内部对象并进行空气轻击手势时,外部对象就是移动的对象。有没有办法在MRTK中实现此行为。尝试使用transform.localPosition而不是transform.position Transform.position使用场景坐标变换。localPosition使用父对象的局部坐标。我想你的意思是:外部对象的碰撞器正在阻止光线投射,所以你不能击中内部碰撞器 尝试使用获

我正在尝试创建一个应用程序,其中一个游戏对象可以位于另一个游戏对象内。我希望能够移动内部的游戏对象,而它是在外部的。当用户注视内部对象并进行空气轻击手势时,外部对象就是移动的对象。有没有办法在MRTK中实现此行为。

尝试使用
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;
打破
}

只需移除外部对象的碰撞器即可

当用户查看游戏对象时,您想按层次查找游戏对象,还是同时查找两者?我认为这里的问题在于外部对象的碰撞器阻止光线投射,因此您无法命中内部对象;)