我在同一个GameObject上有两个同心Box碰撞器。外箱碰撞器旋转物体(在滑动屏幕时),内盒碰撞器在我们触摸屏幕时播放动画。
但是当光线从我的移动屏幕移动到外部对撞机时,它会摧毁并且不会穿过该对撞机。
有什么办法吗?
答案 0 :(得分:2)
您可以通过在检查器中选中Is Trigger来使外部触发器成为触发器对撞机:
并将内部对撞机作为对撞机。然后,您可以使用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.
}
但是,这种方法有几点需要注意:
如果你没有使用两个碰撞器的具体原因,那么我会做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
}
}