- Home /
Question by
Piotrone · May 14, 2015 at 02:02 PM ·
raycastlinerenderer
Linerender/Raycast2D colliding inconsistently with sprites
Hi,
I have a laser beam that bounce of 2D tiles inconsistently.
On some part of the tile the laser bounces correctly, the Vertices count is correct but the collider is not detected.
On some other part of the same tile the laser dies, the Vertices count goes up to LaserMaxReach+1 and the collider is detected.
(If I use Raycast instead of Raycast2D and 3D colliders on sprites the laser works perfectly, but I need 2d colliders since other parts of the game work with them)
What is wrong in my code? Thanks
using UnityEngine;
using System.Collections;
[RequireComponent (typeof(LineRenderer))]
public class WeaponLaserBeams : MonoBehaviour {
[Range(0f, 1f)] public float LaserThinkness = 0.1f;
public LayerMask LayerMask;
public int LaserMaxReach = 100;
public int LaserMaxReflections;
RaycastHit2D Hit;
LineRenderer Laser;
private bool isActive;
private Vector3 CurrentDirection;
private Vector3 CurrentPosition;
private int Vertices = 1;
void Start()
{
Laser = GetComponent<LineRenderer>();
WeaponPosition = GetComponentInParent<WeaponPosition> ();
}
void Update() {
Laser.enabled = Input.GetMouseButton (0);
if (Input.GetMouseButton (0)) {
DrawLaser ();
}
}
public static Vector2 Reflect(Vector2 vector, Vector2 normal)
{
return vector - 2 * Vector2.Dot(vector, normal) * normal;
}
public void DrawLaser() {
Vertices = 1;
isActive = true;
CurrentDirection = transform.right;
CurrentPosition = transform.position;
Laser.SetVertexCount (1);
Laser.SetPosition (0,transform.position);
while(isActive) {
Vertices++;
Laser.SetVertexCount(Vertices);
Hit = Physics2D.Raycast(CurrentPosition, CurrentDirection, LaserMaxReach, LayerMask);
if(Hit.collider!=null) {
CurrentPosition = Hit.point;
CurrentDirection = Reflect(CurrentDirection, Hit.normal);
Laser.SetPosition(Vertices-1, Hit.point);
Debug.Log ("hit");
} else {
isActive = false;
Laser.SetPosition(Vertices-1, CurrentPosition+50*CurrentDirection);
Debug.Log ("No hit");
}
if (Vertices > LaserMaxReflections)
{
isActive = false;
}
Debug.DrawRay (transform.position, CurrentDirection, Color.green);
Debug.Log("Vertices: " + Vertices + ", Collider: " + Hit.collider.name + ", Hit point: " + Hit.point);
}
}
}
Comment