2015-10-30 7 views
0

Итак, я пытаюсь использовать 2D-raycast, чтобы остановить лазерный прицел в моей игре, проходящей сквозь стены.Unity 2D, C# 2D Raycast дает странные результаты дистанции

Сначала я попытался просто установить конечную точку лазера в точку попадания. Тем не менее, это приносило странные результаты, причем точка попадания, казалось бы, находилась в случайном месте, обычно за игроком.

Я сделал отладки, чтобы проверить, что raycast сталкивается, как я хотел (хотя я знаю отладки использует для 3D-системы raycast, так что, может быть, я делаю что-то неправильно там?)

Затем я попытался с помощью расстояние от точки попадания. Он работает, вроде, когда лазер попадает в стену, он меняет свою длину, поэтому он не попадает в стену. Проблема в том, что она останавливается задолго до стены, а не в какой-то конкретной точке, если я подошёл ближе к стене, линия изменится почти так же, как если бы она пыталась сохранить разделение расстояния от стены. Это, наверное, что-то действительно простое, но я не могу, чтобы лифт меня это исправить.

Лазерный прицел глубоко в иерархии компонентов игроков, некоторые из которых имеют масштаб, мне интересно, может ли это быть причиной нечетного деления, и если да, то как его исправить.

Заранее благодарим за любую помощь!

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

    } 
}