简体   繁体   中英

Raycasting in Unity 2D c#

I'm new to c# and trying to figure out how to get raycasting to work here in Unity3d's new 2d support.

I'm getting the error "cannot convert from 'UnityEngine.Ray2D' to 'UnityEngine.Vector2'"

for (int i = 0; i<3; i ++) {
        float dir = Mathf.Sign(deltaY);
        float x = (p.x + c.x - s.x/2) + s.x/2 * i;
        float y = p.y + c.y + s.y/2 * dir;

        ray = new Ray2D(new Vector3(x, y), new Vector3(0, dir));
        Debug.DrawRay(ray.origin, ray.direction);
        hit = Physics2D.Raycast(ray.origin, ray.direction, Mathf.Abs(deltaY), collisionMask);

        if (hit != null && hit.collider != null)
        {
        }
        if (Physics2D.Raycast(ray,out hit,Mathf.Abs(deltaY),collisionMask)) {
            float dst = Vector2.Distance (ray.origin, hit.point);

            if (dst > skin) {
                deltaY = dst * dir + skin;
            }
            else {
                deltaY = 0;
            }

            grounded = true;

            break;

        }
    }

Can someone help me out?

See the Physics2D.Raycast documentation, the method is defined as

static RaycastHit2D Raycast(Vector2 origin, Vector2 direction, float distance = Mathf.Infinity, int layerMask = DefaultRaycastLayers, float minDepth = -Mathf.Infinity, float maxDepth = Mathf.Infinity);

With the parameters defined as

origin: The point in 2D space where the ray originates.

direction: Vector representing the direction of the ray.

distance: Maximum distance over which to cast the ray.

layerMask: Filter to detect Colliders only on certain layers.

minDepth: Only include objects with a Z coordinate (depth) greater than this value.

maxDepth: Only include objects with a Z coordinate (depth) less than this value.

You are using a Ray2D instead of a Vector2D for origin . If you simply replace ray with a Vector2D it will work

Physics2D.Raycast(new Vector2(x, y),out hit,Mathf.Abs(deltaY),collisionMask)

For more information, see passing parameters

  1. Do call like you did in code earlier:

    hit = Physics2D.Raycast(ray.origin, ray.direction, Mathf.Abs(deltaY), collisionMask);

  2. This code is useless:

    if (hit != null && hit.collider != null) { }

But if you need to enter some logics in brackets - you don't need to check hit for null - it is always an object, just check hit.collider

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM