search

Home  >  Q&A  >  body text

javascript - 光线投射:把C#转换成UnityScript

我在学习一个用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

PHP中文网PHP中文网2816 days ago613

reply all(1)I'll reply

  • 大家讲道理

    大家讲道理2017-04-10 13:13:53

    答案:
    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关键词也可以做到你想要的东西。

    reply
    0
  • Cancelreply