c# - Unity Raycast 问题

标签 c# unity3d

好吧,我正在尝试制作一个圆圈(具有动态位置)和另一个不应该穿过第一个圆圈的圆圈 --- 如下图所示

我之所以这样做,是因为大的上面可以放很多其他的对象。

circle image

但问题是 Physics.Raycast 并不总是检测到我的球体:

broken circle image

蓝线是光线转换

基本上我所做的是通过整个大圆圈进行光线转换,找出较小的圆圈在哪里。

这是我检测大圆圈上物体的代码:

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/

相关文章:

c# - lambda 表达式或 get_property 函数在 C# 中的实际作用是什么?

ios - Xcode:架构 i386 的 undefined symbol :为 iOS 模拟器构建 Unity 项目时的 DebugStringToFile

c# - 如何更新 Unity GameObject 以沿样条曲线移动?

c# - .NET Core 2 中的状态服务器 session 状态

c# - ListView : InvalidArgument = Value of '0' is not valid for 'index' 中的错误

c# - 插入后获取结果ID

c# - 配置 Visual Studio 2012 以使用 Mono 的 C# 编译器而不是默认的 csc.exe

c# - 碰撞时传送玩家对象不起作用

c# - 如何实现 C# Rhino 安全

c# - 为什么我得到 AutoMapper int 到 int[] 数组的异常