Raycast - 从C#转换为UnityScript

时间:2014-01-08 15:09:00

标签: c# unity3d unityscript

我正在学习用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”是什么,我不知道替换它的位置。

3 个答案:

答案 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

outref关键字是有用的C#构造,允许您传递对结构的引用(或对类引用的引用),这通常会通过值传递。

该方法的C#变体将创建一个新的RaycastHit类型实例,并将其分配给您作为out参数传递的变量。

在UnityScript中,这是不必要的,您可以在不使用out关键字的情况下获得所期望的内容。

答案 2 :(得分:1)

根据documentation

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 documentationLayerMask可以从整数隐式转换。