使用 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<<hitLayerMask
,1 << 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 版本,这就是我收到此错误的原因。
你好 :) 我正在使用 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<<hitLayerMask
,1 << 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 版本,这就是我收到此错误的原因。