使用 Physics2D.Raycast 时出错 - 可选参数

Error using Physics2D.Raycast - optional arguments

你好 :) 我正在使用 Physics2D.Raycast 方法,根据 Unity 文档,其输入参数定义如下:

public static RaycastHit2D Raycast(Vector2 origin, Vector2 direction, float distance = Mathf.Infinity, 

int layerMask = DefaultRaycastLayers, float minDepth = -Mathf.Infinity, float maxDepth = Mathf.Infinity);

然后我调用了这个方法并插入了以下输入参数:

RaycastHit2D hit = Physics2D.Raycast (transform.position,
newVelocity, layerMask: hitLayerMask);

但是,我收到以下错误消息:

The best overloaded method match for 'UnityEngine.Physics2D.Raycast(UnityEngine.Vector2, UnityEngine.Vector2, float)' 

does not contain a parameter named layerMask

你能帮我解决这个问题吗?我不明白为什么编译器认为我重载了一个只有三个输入参数的方法。

P.S:我知道我在一个假定接受 Vector2 对象的函数中引入了 'transform.position',一个 Vector3 对象。但我以前做过,没有出错。我采用的唯一新颖方法是参数 layerMask 的规范:/

如有任何帮助,我将不胜感激。

编辑:澄清一下,transform.position 是一个 Vector3 对象,newVelocity 是一个 Vector2,hitLayerMask 是一个整数。

编辑 2:请注意,我忽略了传递 "distance" 输入参数,因为它具有默认值 Mathf.Infinity。在这个关于可选参数 (https://msdn.microsoft.com/en-us/library/dd264739.aspx) 的网页上,在 ExampleMethod() 部分,它显示了如何忽略具有默认值的参数。这就是为什么我忽略 "distance" 参数

的原因

您必须在图层蒙版之前通过距离,但您没有通过。该函数的签名是 vector2,vector2,float int 等,但您当前的代码是 vector2,vector2,int (hitLayerMask)....

    int hitLayerMask = 0;
    int layerMask = 6;
    float distance = 60f;

    RaycastHit2D hit = Physics2D.Raycast(transform.position,
        newVelocity, distance, layerMask: hitLayerMask);

这将编译,但由于您在层中传递的方式,可能无法正常工作。你用按位运算来做that.For例子,1<<hitLayerMask1 << LayerMask.NameToLayer("Environment")。有关图层按位运算的更多信息,请访问 here.

下面是正确的做法:

    Vector3 newVelocity = Vector3.zero;
    float distance = 100f;
    int layerMask = 1 << 6; //cast rays only against colliders in layer 6.
    RaycastHit2D hit = Physics2D.Raycast(transform.position,
        newVelocity, distance, layerMask);

编辑:

可能存在错误,因为您尝试使用的功能在当前的 Unity C# 版本中不可用。在 C# V4 中添加了可选参数和命名参数,而 Unity 使用 C#<=3.5 版本并删除了一些功能。

正如用户@Programmer 所述,Unity 使用 C#2->3.5。我实际上使用 "Debug.Log(System.Environment.Version);" 搜索了 c# "version" 并注意到我的版本是 2.0.50727.1433.

为了使用命名参数执行我想要的操作,我需要 C#4.0 版本,这就是我收到此错误的原因。