好吧,我正在尝试制作一个圆圈(具有动态位置)和另一个不应该穿过第一个圆圈的圆圈 --- 如下图所示
我之所以这样做,是因为大的上面可以放很多其他的对象。
但问题是 Physics.Raycast 并不总是检测到我的球体:
蓝线是光线转换
基本上我所做的是通过整个大圆圈进行光线转换,找出较小的圆圈在哪里。
这是我检测大圆圈上物体的代码:
void GetCollisions () {
Angle FixedRenderAngle, k;
RaycastHit hit;
Vector3 p1, p2;
float d, d1, radius;
for ( int i = 0; i < Radiuses.Count; i++ ) {
if ( Angles[i] == null )
Angles[i] = new List<Angle>();
radius = Radiuses[i];
FixedRenderAngle = 360f / (float)NumberOfCalls;
AnglesLast[i] = 0;
Angle j = 0f, pj;
bool exception = false;
for ( int l = 0; l < NumberOfCalls; l++) {
j+= FixedRenderAngle;
pj = j - FixedRenderAngle;
p1 = pj.PointByRadius ( radius );
p2 = j.PointByRadius ( radius );
Debug.DrawRay ( p1, p2 - p1, Color.cyan, 3f );
if ( Physics.Raycast ( p1, p2 - p1, out hit, Vector3.Distance ( p1, p2 ) ) ) {
d = Vector3.Distance ( p1, p2 );
d1 = Vector3.Distance ( p1,hit.point );
k = pj + (j -pj) * (d1/d);
AddToAngles ( ref k, i );
}
if ( Physics.Raycast ( p2, p1 - p2, out hit, Vector3.Distance ( p1, p2 ) ) ) {
if ( AnglesLast[i] == 0 ) exception = true;
d = Vector3.Distance ( p1, p2 );
d1 = Vector3.Distance ( p1,hit.point );
k = pj + (j -pj) * (d1/d);
AddToAngles ( ref k, i );
}
}
if ( exception == true ) {
Angle tmp = Angles[i][AnglesLast[i] - 1];
for ( int l = AnglesLast[i] - 1; l > 0 ; l-- )
Angles[i][l] = Angles[i][l-1];
Angles[i][0] = tmp;
}
}
}
Angle 是一个带有表示度数(0 到 360)的 float 的类,它的函数 PointByRadius 返回一个 Vector3,表示它在基于角度和给定半径的圆上的位置。
我是不是做错了什么,或者我对光线转换有什么不了解的地方?任何帮助,将不胜感激。 (当然任何其他方法都会有所帮助)
最佳答案
Physics.SphereCast ?它有点像 OverlapSphere 但也许更符合您的需求? (虽然很难准确地说出你想做什么......例如,当你说圆圈时,你是指实际的圆圈只在 X-Y 上移动还是在 Z 轴上移动?你想把东西藏在哪个圆圈里,大的还是小的?你是想在视觉上隐藏大圆的一部分吗?)
根据物体移动的速度和大小,光线转换(和一般的 PhysX 碰撞器)可能会变得不稳定,至少根据我的经验。您也可以尝试弄乱您的物理时间步长,看看这是否是问题的一部分,比如更频繁地这样做,看看您是否仍然遇到问题行为。不确定,只是抛出一些想法。
关于c# - Unity Raycast 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22972550/