Unity3d 物理.光线投射不识别网格对撞机

Unity3d 物理.光线投射不识别网格对撞机,unity3d,collision-detection,mesh,Unity3d,Collision Detection,Mesh,我在获取Physics.Raycast以识别网格碰撞器时遇到问题。我有一个自定义创建的网格来模拟地形,还有一个可以用键盘和鼠标控制的相机对象。我试图实现摄影机和地形之间的碰撞,以便摄影机无法在地形中移动 下面是生成网格的脚本。它连接到一个游戏对象,该游戏对象有一个网格碰撞器和一个网格过滤器组件。请特别注意这些组件在脚本中设置了mesh和sharedMesh属性的位置 var分区:int; 变量大小:浮动; 变量高度:浮动; 私有变量顶点:向量3[]; 私有变量numvities:int; 私有变

我在获取
Physics.Raycast
以识别网格碰撞器时遇到问题。我有一个自定义创建的网格来模拟地形,还有一个可以用键盘和鼠标控制的相机对象。我试图实现摄影机和地形之间的碰撞,以便摄影机无法在地形中移动

下面是生成网格的脚本。它连接到一个游戏对象,该游戏对象有一个网格碰撞器和一个网格过滤器组件。请特别注意这些组件在脚本中设置了
mesh
sharedMesh
属性的位置

var分区:int;
变量大小:浮动;
变量高度:浮动;
私有变量顶点:向量3[];
私有变量numvities:int;
私有变量cameraStartVertex:Vector3;
函数启动(){
初始化地形();
}
函数InitTerrain(){
数量=(部门+1)*(部门+1);
顶点=新矢量3[num垂直];
var-UVs:Vector2[]=新的Vector2[numvities];
变量三角形:int[]=新的int[divisions*divisions*6];
var HALFTERAINSIZE:浮动=大小/2;
var分区大小:浮动=大小/分区;
//看这里!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
变量网格:网格=新网格();
GetComponent.(.mesh=mesh;
GetComponent.(.sharedMesh=网格;
GetComponent.(.isTrigger=true;
var triangleOffset:int=0;

对于(var i=0;i最好隔离
checkCollisionImpression()
并使其独立于按键。现在的情况是,在移动方向以外的方向上的任何光线投射都不会触发。我将相应地更改
update()
函数:

函数更新(){
var-trans;
变量w、s、a、d;
//翻译。。。
if(Input.GetKey(KeyCode.D)){
trans=新向量3(translationSensitivity*Time.deltaTime,0,0);
}
if(Input.GetKey(KeyCode.A)){
trans=新向量3(-translationSensitivity*Time.deltaTime,0,0);
}
if(Input.GetKey(KeyCode.S)){
trans=新向量3(0,0,-翻译敏感性*时间增量);
}
if(Input.GetKey(KeyCode.W)){
trans=新向量3(0,0,翻译敏感性*时间增量);
}
//检查碰撞
w=检查碰撞即将发生(矢量3向前);
s=检查碰撞即将发生(Vector3.back);
a=检查碰撞即将发生(向量3.左);
d=检查碰撞即将发生(向量3.右);
//如果发生碰撞,请不要执行任何操作
if(w | s | a | d){
返回;
}
转换。翻译(trans);
}

我没有测试过此代码,但它应该可以正常工作。请告诉我们这是否有帮助。

如果隔离
checkCollisionImpression()
并使其独立于按键,则效果会更好。现在的情况是,在移动方向以外的方向上的任何光线投射都不会触发。我将更改
更新()
相应的功能:

函数更新(){
var-trans;
变量w、s、a、d;
//翻译。。。
if(Input.GetKey(KeyCode.D)){
trans=新向量3(translationSensitivity*Time.deltaTime,0,0);
}
if(Input.GetKey(KeyCode.A)){
trans=新向量3(-translationSensitivity*Time.deltaTime,0,0);
}
if(Input.GetKey(KeyCode.S)){
trans=新向量3(0,0,-翻译敏感性*时间增量);
}
if(Input.GetKey(KeyCode.W)){
trans=新向量3(0,0,翻译敏感性*时间增量);
}
//检查碰撞
w=检查碰撞即将发生(矢量3向前);
s=检查碰撞即将发生(Vector3.back);
a=检查碰撞即将发生(向量3.左);
d=检查碰撞即将发生(向量3.右);
//如果发生碰撞,请不要执行任何操作
if(w | s | a | d){
返回;
}
转换。翻译(trans);
}

我尚未测试此代码,但它应该可以正常工作。请告诉我们这是否有帮助。

您是否检查了光线投射上的距离2是否足以与您的对象发生碰撞?@joreldraw是的,我也尝试了距离5和10,但相机仍在地形中移动。您是否检查了光线投射上的距离2是否足以与您的对象发生碰撞与你的物体发生碰撞?@joreldraw是的,我也尝试了距离5和距离10,但摄影机仍然在地形中移动。不幸的是,这不起作用。摄影机继续在地形中移动。你能帮上什么忙吗?真的不知道出了什么问题……当镜头移动时,你真的在场景视图中看到了碰撞器吗程序正在运行?请尝试设置
GetComponent.().convertic=true;
。我从类似的帖子中读到,通常生成的碰撞器比实际网格大,因此您可能需要将其缩小。当我第一次尝试光线投射时,我的光线击中了投射对象的碰撞器。我使用的是
Physics.Raycast2D()
。如果您的相机有一个,请尝试移除它。除此之外,我会尝试通过创建一个非常基本的网格(类似于具有4个顶点的平面)来简化问题使用它的碰撞器,看看是否能工作。我如何才能使碰撞器在场景视图中可见?不幸的是,这不起作用。摄影机继续在地形中移动。你能再帮点忙吗?真的不知道出了什么问题…当程序运行时,你真的能在场景视图中看到碰撞器吗?请尝试设置
GetComponent。(.convertic=true;
。我从类似的帖子中读到,通常生成的碰撞器比实际网格大,因此您可能必须将其缩小。当我第一次尝试光线投射时,我的光线击中了投射对象的碰撞器。我使用的是
physical.Raycast2D()
。如果您的相机有一个,请尝试将其移除。除此之外,我会尝试通过创建一个非常基本的网格(类似于4V的平面)来简化问题