消息关闭
    暂无新消息!

我在学习一个用C#写的Unity3D教程,尝试着用UnityScript/Javascript来做。下面的几行我没能转换成功,是关于光线投射的。
这是 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”是什么,我不知道用什么来代替它。

原问题:Raycast - convert from C# to UnityScript


1个回答

︿ 1

答案:
crush:
根据文档 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 documentation,LayerMask可以从整数隐式转换

msm8bball:
out 意味着传递参数将是通过“引用”传递,和通过“值”传递相对。看看。
我不太熟悉UnityScript. 但是创建同等函数的方法之一是创建一个新的要返回的class,包含通常会返回的Boolean,以及RaycastHit对象。

class MyCustomReturnObject
    Boolean OriginalReturnVariable
    RaycastHit hit

Luaan:
这其实不需要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#构造,允许你把引用传递到结构(或者传递引用到class引用),通常会被值传递取代。
C#方法的变体将会创建一个RaycastHit类型的新实例,并将其指定到作为out参数传递的变量。
在UnityScript, 这是不必要的,不用out关键词也可以做到你想要的东西。