2015-10-30 54 views
0

所以我試圖用2D射線停止我的遊戲穿過牆壁的激光瞄準鏡。Unity 2D,C#2D Raycast給出奇怪的距離結果

首先,我試着簡單地將激光的終點設置到點。然而,這提供了奇怪的結果,其中生命值似乎處於隨機位置,通常落後於玩家。

我做了調試,以檢查光線投射面臨我想要的方式(雖然我知道調試使用到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

我想我解決了它,問題是將世界空間轉換爲本地空間。這是我寫的代碼

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

    } 
}