我正在学习用C ++编写的Unity3D教程,并尝试在UnityScript中完成。以下行是我唯一无法正确转换的行,它与Raycasting有关。
这是来自啧啧的C#。
if(Physics.Raycast(ray, out hit, Mathf.Abs(deltaY), collisionMask)){
....
}
以下是我的相关变量。
var ray : Ray;
var hit : RaycastHit;
var collisionMask : LayerMask;
var deltaY : float = moveAmount.y; // moveAmount is a Vector2
这是Physics.Raycast的签名
function Raycast (origin : Vector3,
direction : Vector3,
distance : float = Mathf.Infinity,
layerMask : int = kDefaultRaycastLayers) : boolean
我知道我的问题是使用UnityScript无法识别出“out”是什么,我不知道替换它的位置。
答案 0 :(得分:2)
out表示传递给它的参数将“通过引用”传递,而不是“按值”传递。 See C# documentation
我不熟悉UnityScript。但是,创建等效函数的一种方法是创建一个要返回的新类,其中包含通常会返回的布尔值,以及RaycastHit对象。
class MyCustomReturnObject
Boolean OriginalReturnVariable
RaycastHit hit
答案 1 :(得分:1)
根本不需要out关键字。
var hit : RaycastHit;
if (Physics.Raycast (origin, direction, hit, distance)) {
var hitDistance = hit.distance;
}
您可以使用UnityScript文档作为参考:http://docs.unity3d.com/Documentation/ScriptReference/Physics.Raycast.html
out
和ref
关键字是有用的C#构造,允许您传递对结构的引用(或对类引用的引用),这通常会通过值传递。
该方法的C#变体将创建一个新的RaycastHit类型实例,并将其分配给您作为out
参数传递的变量。
在UnityScript中,这是不必要的,您可以在不使用out
关键字的情况下获得所期望的内容。
答案 2 :(得分:1)
static function Raycast(ray: Ray,
hitInfo: RaycastHit,
distance: float = Mathf.Infinity,
layerMask: int = DefaultRaycastLayers): bool;
参数(读取hitInfo的描述)
ray The starting point and direction of the ray. distance The length of the ray. hitInfo If true is returned, hitInfo will contain more information about where the collider was hit (See Also: RaycastHit). layerMask A Layer mask that is used to selectively ignore colliders when casting a ray.
在C#中,out
通过引用传递,这允许函数修改其范围之外的值。在UnityScript
中,您无需定义何时通过引用或值传递。所以,你只需省略out
。
var ray : Ray;
var hit : RaycastHit;
var collisionMask : LayerMask;
var deltaY : float = moveAmount.y; // moveAmount is a Vector2
if (Physics.Raycast(ray, hit, deltaY, collisionMask)) {
//hit will contain more information about whether the collider was a hit here.
}
注意,根据LayerMask
documentation,LayerMask
可以从整数隐式转换。