Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unity2D/C#:如何使光线投射忽略其第一次碰撞?_C#_Unity3d_Collision Detection_Raycasting - Fatal编程技术网

Unity2D/C#:如何使光线投射忽略其第一次碰撞?

Unity2D/C#:如何使光线投射忽略其第一次碰撞?,c#,unity3d,collision-detection,raycasting,C#,Unity3d,Collision Detection,Raycasting,我的platformer游戏的raycast控制器的一个特点是,玩家可以通过单向平台跳下。这很好,但我想添加额外的功能,只有当他或她要跳到的平台在一定距离内时,玩家才能跳下 我的平台控制器的跳下功能如下: 我的角色从盒子对撞机下面发射一条光线,并检测它是否在地面上 如果是,并且如果地面被标记为单向平台,并且玩家按下向下跳转按钮,则无论距离有多远,它都将向下跳转到下一个平台 我尝试了一种跳转方法,从角色的长方体碰撞器的中心创建一个新的光线投射(下面的代码中没有显示,因为到目前为止我完全没有成功),

我的platformer游戏的raycast控制器的一个特点是,玩家可以通过单向平台跳下。这很好,但我想添加额外的功能,只有当他或她要跳到的平台在一定距离内时,玩家才能跳下

我的平台控制器的跳下功能如下:

  • 我的角色从盒子对撞机下面发射一条光线,并检测它是否在地面上
  • 如果是,并且如果地面被标记为单向平台,并且玩家按下向下跳转按钮,则无论距离有多远,它都将向下跳转到下一个平台
  • 我尝试了一种跳转方法,从角色的长方体碰撞器的中心创建一个新的光线投射(下面的代码中没有显示,因为到目前为止我完全没有成功),并检查一定距离处的碰撞。我的问题是,它总是检测到它要从平台上跳下来的对撞机,而从来没有机会检测到其他任何东西

    我如何让这个新的光线投射忽略第一次碰撞,潜在地检测光线距离内的碰撞,如果碰撞到某个物体,允许我的角色跳下?此外,我是否需要执行新的光线投射,或者我是否可以在控制器上使用当前的光线投射

    下面是我的raycast控制器脚本,希望能解释一些功能:

    private void MoveVertically(ref Vector3 deltaMovement)
    {
        float directionY = Mathf.Sign(deltaMovement.y);
        float rayLength = Mathf.Abs(deltaMovement.y) + skinWidth;
    
        for (int i = 0; i < verticalRayCount; i++)
        {
            Vector2 rayOrigin = (directionY == -1) ? raycastOrigins.bottomLeft : raycastOrigins.topLeft;
            rayOrigin += Vector2.right * (verticalRaySpacing * i + deltaMovement.x);
    
            RaycastHit2D hit = Physics2D.Raycast(rayOrigin, Vector2.up * directionY, rayLength, collisionMask);
    
            Debug.DrawRay(rayOrigin, Vector2.up * directionY * rayLength, Color.red);
    
            if (hit)
            {
                if (hit.collider.tag == "platformOneWay")
                {
                    if (directionY == 1)
                    {
                        State.IsCollidingWithOneWay = true;
                        State.IsCollidingAbove = false;
                        continue;
                    }
    
                    if (CanJumpDown)
                    {
                        State.IsCollidingBelow = false;
                        continue;
                    }
                }
    
                deltaMovement.y = (hit.distance - skinWidth) * directionY;
                rayLength = hit.distance;
    
    private void垂直移动(参考矢量3 deltaMovement)
    {
    浮动方向y=数学符号(deltaMovement.y);
    浮动光线长度=数学绝对值(deltaMovement.y)+蒙皮宽度;
    对于(int i=0;i
    实际上,Unity3D提供了一个名为
    Physics2D.RaycastAll
    的API,它不仅返回第一次光线投射命中,还返回最大距离内作为数组的所有光线投射命中。
    Physics2D.RaycastAll
    将两个
    Vector2
    作为参数(光线投射原点和方向),并返回一个数组
    RaycastHit2D
    ,该数组按原点到命中点的距离排序。
    下面是一段代码,向您展示了此函数的功能:

    public class Raycaster : MonoBehaviour
    {
        private void Start()
        {
            RaycastHit2D[] hits = Physics2D.RaycastAll(transform.position, Vector2.down);
            for (int i = 0; i < hits.Length; ++i)
            {
                Debug.LogFormat("The name of collider {0} is \"{1}\".", 
                    i, hits[i].collider.gameObject.name);
            }
        }
    }
    
    public class Raycaster:monobhavior
    {
    私有void Start()
    {
    RaycastHit2D[]hits=Physics2D.RaycastAll(transform.position,Vector2.down);
    对于(int i=0;i
    另一种方法是创建LayerMask。在Unity编辑器中创建一个新层,并将该层指定给连接碰撞器的游戏对象

    使用
    LayerMask.GetMask
    在代码中获取层掩码ID,并将其添加为参数。现在,光线投射将仅投射指定给该层的碰撞器

    var layerMask = LayerMask.GetMask ("myLayerName");
    var ray = Camera.main.ScreenPointToRay (Input.mousePosition);
    RaycastHit hit;
    if (Physics.Raycast (ray, out hit, 100.0f, layerMask)) {
        Debug.Log ("Got ya!");
    }
    

    刚刚实现了这个,它工作得很好。感谢您让我了解这个API。虽然这可能会起作用,但如果我们想要
    层3
    的第二个对象呢?也就是说,两个结果(第一个命中的东西和我们想要的东西)都在同一物理层上。