【问题标题】:RaycastHit2D doesn't collide with objects that has Collider2DRaycastHit2D 不会与具有 Collider2D 的对象发生碰撞
【发布时间】:2021-09-13 20:33:07
【问题描述】:

我正在尝试制作我的第一款统一游戏,它基于抓鱼,基于 Raycast 和 Colliders。我复制了一些代码并对其进行了一些修改,但是当我启动Ray时,它似乎没有与鱼发生碰撞 (GameObject) 有一个Collider2D,它在Hit.Collider 值上给了我NULL。我有一个GameObject,其中包含脚本,以及来自它的 Ray 发射和具有碰撞器的鱼。 顺便说一句,我画了一条线来证明射线到达GameObject(鱼)并且确实到达了,但没有发生碰撞。 这是我的代码,然后是图片:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class grapplinghook : MonoBehaviour {

    DistanceJoint2D joint;
    Vector3 TargetPos;

    public float maxdistance;
    public LayerMask mask;

    // Use this for initialization
    void Start () {
        joint = GetComponent<DistanceJoint2D>();
        joint.enabled = false;
    }

    // Update is called once per frame
    void Update () {

        if(Input.GetMouseButton(0) ) {
            TargetPos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
            TargetPos.z = 0;
            Vector2 TargetPos2D = new Vector2(TargetPos.x, TargetPos.y); 
            Vector2 CurrentPos2D = new Vector2(transform.position.x, transform.position.y);

            RaycastHit2D Hit = Physics2D.Raycast(CurrentPos2D, TargetPos2D, maxdistance);
            Debug.DrawLine(transform.position, TargetPos2D, Color.black);
            if(Hit != null)
                Debug.Log("trueeeeeeeeeee");
                Debug.Log(Hit.collider);
                Debug.Log(Input.mousePosition);

            if(Hit.collider){
                joint.enabled = true;
                Debug.Log("true" + Hit.collider.gameObject.name);
                joint.connectedBody = Hit.collider.gameObject.GetComponent<Rigidbody2D>();
                joint.distance = Vector2.Distance(transform.position, Hit.point);
            }
        }
        if(Input.GetMouseButtonUp(0)){
            joint.enabled = false;
        }

    }
}

通过 youtube 上第 16 分钟的视频,我发现 WorldPoint 和 Screen 坐标之间的差异与我的问题有关:https://www.youtube.com/watch?v=eF8F5NHZoHQ&t=1246s

问题是我使用ScreenToWorldPoint()时的坐标大于Input.mousePosition

【问题讨论】:

    标签: c# unity3d


    【解决方案1】:

    Physics2D.Raycast 采用两个 Vector2 作为前两个参数:原点和方向。

    原点是光线开始的点,方向是光线要走的方向。

    您正在使用它,就好像它是从 A 点到 B 点一样。如果您想要一条从 A 点到 B 点的射线,您的原点应该是 A 点,但方向应该是 B - A(因为那是计算从 A 到 B 的方向的方法)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-28
      • 1970-01-01
      相关资源
      最近更新 更多