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

时间:2016-04-16 16:02:56

标签: c# unity3d optional-parameters raycasting

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

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:我知道我在一个函数中引入了'transform.position',这是一个Vector3对象,该函数应该包含一个Vector2对象。但我之前已经这样做了,我没有错误。我正在采用的唯一新方法是参数layerMask:/

的规范

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

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

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

2 个答案:

答案 0 :(得分:0)

您必须在图层蒙版之前传递距离,但是您没有这样做。函数的签名是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);

这将编译,但由于您在图层中的传递方式可能无法正常工作。您可以使用按位运算来执行此操作。例如,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#&lt; = 3.5并删除了一些功能。

答案 1 :(得分:0)

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

为了用命名参数做我想做的事情,我需要C#4.0版本,这就是我收到此错误的原因。