void FixedUpdate() { // If the object's lifetime is over, destroy if (TimeAtCreation + Lifetime <= Time.timeSinceLevelLoad) { Destroy(this.gameObject); return; } float fade = 1 - (Time.timeSinceLevelLoad - TimeAtCreation) / Lifetime; this.localMaterial.SetColor("_TintColor", new Color(defaultColor.r, defaultColor.b, defaultColor.g, defaultColor.a * fade)); currentLength = maxLength; Vector3 fwd = transform.TransformDirection(Vector3.forward); Ray laserRay = new Ray(transform.position, fwd); RaycastHit hit; if (Physics.Raycast(laserRay, out hit, maxLength)) { currentLength = hit.distance - 2.2f; ILaserTarget laserTarget = hit.collider.gameObject.GetComponent <ILaserTarget>(); if (laserTarget != null && canDamage()) { laserTarget.OnLaserHit(hit.point, damage); } } updateVertices(width, currentLength); }
void Start() { Vector3 fwd = transform.TransformDirection(Vector3.forward); Ray laserRay = new Ray(transform.position, fwd); RaycastHit hit; currentLength = maxLength; if (Physics.Raycast(laserRay, out hit, maxLength)) { //Debug.Log (hit.transform.name+" was lasered"); currentLength = hit.distance - 2.2f; ILaserTarget laserTarget = hit.collider.gameObject.GetComponent <ILaserTarget>(); if (laserTarget != null) { laserTarget.OnLaserHit(hit.point, damage); } } vertices = createVertices(width, currentLength); triangles = createTriangles(); UVs = createUVs(); UV2s = createUV2s(); gameObject.AddComponent <MeshFilter>(); gameObject.AddComponent <MeshRenderer>(); Mesh mesh = GetComponent <MeshFilter>().mesh; MeshRenderer meshRenderer = GetComponent <MeshRenderer>(); mesh.Clear(); updateVertices(width, currentLength); mesh.uv = UVs; mesh.uv2 = UV2s; mesh.SetTriangles(triangles, 0); localMaterial = Instantiate(laserMaterial); meshRenderer.material = localMaterial; defaultColor = laserMaterial.GetColor("_TintColor"); TimeAtCreation = Time.timeSinceLevelLoad; }
private void RecursiveLaserPath(ref List <Laser> lasers, Laser current, int index, int max) { lasers.Add(current); if (index >= max) { return; } if (current.red + current.green + current.blue < .01f) { return; } Vector2Int origin = current.origin; int distance = 1; Vector2Int direction = current.GetDirectionVector(); while (true) { LaserLabObject nextObject = level.board.GetLaserLabObject(origin + (direction * distance)); if (nextObject && nextObject is ILaserTarget) { current.length = distance; ILaserTarget nextTarget = nextObject as ILaserTarget; Laser[] nextLasers = nextTarget.OnLaserHit(current); for (int i = 0; i < nextLasers.Length; i++) { nextLasers[i].origin = nextTarget.GetPosition(); RecursiveLaserPath(ref lasers, nextLasers[i], index + 1, max); } return; } distance++; } }
/// <summary> /// True when this laser tile has hit the given target /// </summary> /// <param name="target"></param> /// <returns></returns> public bool HasHitTarget(ILaserTarget target) { return(m_laser.HasTarget(target)); }
/// <summary> /// True when the given target has been hit by this laser /// </summary> /// <param name="target"></param> /// <returns></returns> public bool HasTarget(ILaserTarget target) { return(Targets.Contains(target)); }