赞
踩
正在学习Unity,2D项目,需要做一个功能:鼠标点击到哪个物体就产生对应的效果,很容易想到使用射线检测,从鼠标位置发出一条射线,方向也是鼠标位置,就可以检测到鼠标点击到的物体。
于是用了官方文档给的范例:
public Camera camera;
void Start(){
RaycastHit hit;
Ray ray = camera.ScreenPointToRay(Input.mousePosition);
if (Physics.Raycast(ray, out hit)) {
Transform objectHit = hit.transform;
//逻辑代码
}
}
但是调试时发现无法触发下面的逻辑代码,经过Debug.Log()排查之后,射线能够正常产生,但是无法触发if语句,也就是没有检测到射线和物体的碰撞,我一开始以为是UI遮挡或者是深度之类的问题,反复调试之后也无果,最后偶然看到一篇教程,才发现问题所在。
因为Unity的2D与3D项目互相兼容,可以随时来回切换,并且2D和3D物理引擎的组件和函数形式上也基本相同,只是在名字上加了2D而已,所以我就下意识地认为它们也能互相兼容,但事实上它们是互相独立的,各类组件和函数都无法相互触发。
我的项目里的所有物体的碰撞体都使用Collider 2D,而官方文档中给的Physics.Raycast函数是3D物理引擎的函数,只有射线触碰到带有Collider的物体才能有返回值,所以自然无法触发if语句,所以尽量避免2D和3D混用,要么全用2D,要么用3D组件模拟2D也可以,应该能实现比纯2D更好的效果。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。