为什么对于生成实例化的预制体, Physics.OverlapBox获取不到?
注意:是同一个预制体。事先放在场景中的预制体,就可以获取到。用代码实例化出来的预制体,就获取不到。
if (Physics.Raycast(Camera.main.ScreenPointToRay(Input.mousePosition),
out hitInfo, 1000, 1 << LayerMask.NameToLayer("Ground")))
{
Vector3 center = new Vector3((hitInfo.point.x + beginWorldPos.x) / 2, 2, (hitInfo.point.z + beginWorldPos.z) / 2);
Vector3 halfExtents = new Vector3(Mathf.Abs(hitInfo.point.x - beginWorldPos.x) / 2, 2, Mathf.Abs(hitInfo.point.z - beginWorldPos.z) / 2);
Collider[] colliders = Physics.OverlapBox(center, halfExtents);//获取的Collider
//对于实例化出来的预制体,获取不到Collider,但是对于预先放置好在场景中的预制体,colliders里又有。
并且,好像如果点了Play后,在游戏中同时获取“事先放的”和“实例化生成的”物体,那么实例化生成的就会恢复正常,可以获取(明天在测验确认一下)。很神奇。
我知道了,是1 << LayerMask.NameToLayer("Ground")的问题
可能是因为实例化生成的预制体还没有被激活(activated)或者没有被加入到场景(scene)中。如果物体没有被激活或没有被加入到场景中,它们不会被物理引擎计算,因此 Physics.OverlapBox 也就不能检测到它们。
你可以尝试在实例化生成的预制体之后,手动激活(Activate)或加入到场景中(Add to Scene),然后再执行 Physics.OverlapBox 方法来检测。你也可以在实例化生成预制体的时候,就将其激活或加入到场景中。
例如:
GameObject newObject = Instantiate(prefab);
newObject.SetActive(true); // 手动激活
newObject.transform.position = new Vector3(0, 0, 0);
Physics.OverlapBox(newObject.transform.position, newObject.GetComponent<Collider>().bounds.extents);
如果你已经尝试过激活和加入场景,但还是无法检测到预制体的 Collider,那么你可以尝试为实例化生成的预制体添加一个 Collider 组件(例如 BoxCollider),并且确保它的 Is Trigger 属性为 false。这样就能保证 Physics.OverlapBox 方法能够检测到它。