Exemple #1
0
    bool checkForJumpPositions(Vector3 dir, out Vector3 out_minAngleDir)
    {
        Vec3Int jumpCoords = vxe.ToGrid(transform.position);

        bool    canJump     = false;
        float   maxdotprod  = float.MinValue;
        Vector3 minAngleDir = Vector3.zero;

        for (int i = -JUMP_RANGE; i <= JUMP_RANGE; i++)
        {
            for (int j = -JUMP_RANGE; j <= JUMP_RANGE; j++)
            {
                for (int k = MAX_JUMP_HEIGHT; k >= 1; k--)
                {
                    Vec3Int vcoords = jumpCoords + new Vec3Int(i, k, j);
                    Voxel   vx      = vxe.grid.getVoxel(vcoords);
                    if (vx.isOccupied() && vxe.voxelHasSurface(vx, VF.VX_TOP_SHOWN))
                    {
                        Vector3 wrldcoords = vxe.FromGridUnTrunc(vcoords.ToVec3() + new Vector3(0.5f, 1.0f, 0.5f));
                        Vector3 vdir       = Vector3.ProjectOnPlane((wrldcoords - transform.position), Vector3.up).normalized;
                        float   dotprod    = Vector3.Dot(dir, vdir);
                        if (dotprod > 0)
                        {
                            canJump = true;
                            if (dotprod > maxdotprod)
                            {
                                maxdotprod   = dotprod;
                                minAngleDir  = vdir;
                                jumpPosition = wrldcoords;
                            }
                        }
                    }
                }
            }
        }



        out_minAngleDir = minAngleDir;
        return(canJump);
    }