Unity 2D、C#2D光线投射会产生奇怪的距离结果

本文关键字:距离 结果 2D C#2D 光线投射 Unity | 更新日期: 2023-09-27 18:19:48

所以我试图使用2D光线投射来阻止游戏中的激光瞄准器穿过墙壁。

首先,我试着简单地将激光的终点设置为命中点。然而,这提供了奇怪的结果,击球点似乎在一个随机的地方,通常在球员身后。

我进行了一次调试,以检查光线投射是否符合我想要的方式(尽管我知道调试使用的是3D光线投射系统,所以也许我在那里做错了什么?)

然后我试着使用命中点的距离。它在工作,有点像,当激光击中墙壁时,它会改变它的长度,这样它就不会击中墙壁。问题是,它在墙之前很久就停了下来,也没有停在特定的点上,如果我走得更靠近墙,线就会改变,就好像它试图与墙保持一定的距离一样。这可能是一件非常简单的事情,但我无法解决。

激光瞄准器位于玩家组件的层次结构中,其中一些组件具有规模,我想知道这是否是奇怪划分的原因,如果是,如何纠正。

提前感谢您的帮助!

using UnityEngine;
using System.Collections;
public class LaserSight : MonoBehaviour {
    private LineRenderer Lren;
    public void Start () {
        Lren = GetComponent<LineRenderer>();
    }
    public void Update() {
        if (Lren.enabled) {
            int layerMask = (1 << LayerMask.NameToLayer("Wall")) | 
                            (1 << LayerMask.NameToLayer("Enemies"));
            //layerMask = ~layerMask;
            RaycastHit2D hit = Physics2D.Raycast(transform.position,
                                                 transform.right, 
                                                 layerMask);
            if (hit) {
                Lren.SetPosition(1,-hit.point); 
                //Lren.SetPosition(1, new Vector3(hit.distance, 0, 0));
            } else {
                Lren.SetPosition(1, new Vector3(100, 0, 0));
            }
        }
    }
}

Unity 2D、C#2D光线投射会产生奇怪的距离结果

我想我解决了这个问题,问题是将世界空间转换为局部空间。这是我最后写的代码

using UnityEngine;
using System.Collections;
public class LaserSight : MonoBehaviour {   
   private LineRenderer Lren;
   public void Start () {
       Lren = GetComponent<LineRenderer>();
   }
    public void Update() {
        if (Lren.enabled) {
            int layerMask = (1 << LayerMask.NameToLayer("Wall")) | (1 << LayerMask.NameToLayer("Enemies"));
            RaycastHit2D hit = Physics2D.Raycast( transform.position, transform.right , 100, layerMask);
            if (hit) {
                Lren.SetPosition(1, new Vector3 (transform.InverseTransformPoint(hit.transform.position).x, 0 , 0));
                //Lren.SetPosition(1, new Vector3( hit.distance, 0 , 0));
            } else {
                Lren.SetPosition(1, new Vector3( 100, 0 , 0));
            }
        }
    }
}