Unity 2D,C#2D Raycast给出了奇怪的距离结果

时间:2015-10-30 03:27:51

标签: c# unity3d 2d raycasting

所以我正在尝试使用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));
            }
        }
    }
}

1 个答案:

答案 0 :(得分:1)

我想我修好了,问题在于将世界空间转换为本地空间。这是我最后编写的代码

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));
            }
        }

    }
}