Unity中的同心盒式对撞机

时间:2017-03-30 13:18:53

标签: c# unity3d unity5

我在同一个GameObject上有两个同心Box碰撞器。外箱碰撞器旋转物体(在滑动屏幕时),内盒碰撞器在我们触摸屏幕时播放动画。

但是当光线从我的移动屏幕移动到外部对撞机时,它会摧毁并且不会穿过该对撞机。

有什么办法吗?

2 个答案:

答案 0 :(得分:2)

您可以通过在检查器中选中Is Trigger来使外部触发器成为触发器对撞机: enter image description here

并将内部对撞机作为对撞机。然后,您可以使用OnTriggerEnter检查外部的OnCollisionEnter,将内部的OnTriggerEnter检查。

或者你可以给他们不同的Tags,并通过检查标签检查每个雷命中(为此使用void OnTriggerEnter (Collider other) { if (other.gameObject.tag == "Inner Cube") { // We have hit the inner cube } else if (other.gameObject.tag == "Outer Cube") { // We have hit the outer cube } } 。)

$loopArr = array();
while($loop = . . . .){
     $loopArr[] = "<a>{$loop['tag']}</a>";
}
echo implode(', ',$loopArr);

看看你想要在你的问题中做什么,使用2个同心对撞机并不像简单地检测用户执行的哪些输入动作(轻击或滑动)并按照那样行动。

答案 1 :(得分:0)

看看Physics.RayCastAll。使用RayCastAll,你的Ray不会只返回第一次碰撞而是一系列所有碰撞。

RayCastHit[] hits;
Ray ray = camera.ScreenPointToRay(Input.mousePosition);
hits = Physics.RaycastAll(ray);

// If you have objects behind your object then sort the hit array by distance:
// hits = hits.OrderBy(l => l.distance).ToArray();

for(int i = 0; i < hits.Length; i++)
{
    RaycastHit hit = hits[i];
    // From here you can use a tag approach similar to what Flaming Zombie posted to check whether the collision object supports swipes or touches.
    // Once you find the first valid object then you can perform your action and break out of this loop.
}

但是,这种方法有几点需要注意:

  1. 您将需要遍历每次碰撞。
  2. 您需要确定用户是否滑动或触摸(您可能已将其关闭)
  3. GameObject背后的碰撞者也将返回碰撞。
  4. 如果你没有使用两个碰撞器的具体原因,那么我会做Flaming Zombie建议并使用单个碰撞器。这是一个简单的实现:

    对撞机上的组件:

    public class ExampleComponent : MonoBehaviour
    {
        public void OnInteract(bool isSwipe)
        {
            if (isSwipe)
            {
                //Rotate
            }
            else
            {
                //Animate
            }
        }
    }
    

    Raycast逻辑:

    RaycastHit hit;
    Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
    if (Physics.Raycast(ray, out hit))
    {
        ExampleComponent c = hit.transform.GetComponent<ExampleComponent>()
        if(c != null)
        {
            c.OnInteract(isSwipe); // You'll need to implement isSwipe
        } 
    }