For the last couple of evenings (after daily job as developer) I was working on Twisted lasers game, exactly on laser reflection. As a player you have ability to rotate mirror and depends on mirror rotation laser beam will be reflected.
For laser beam I used line renderer.
To find out if an object is placed on laser beam I used Physics.LineCast.
If object is mirror we want to instantiate new line renderer where initial position is hit point and destination position depends on laser beam origin direction.
I know the code is a bit dirty, not optimized and refactored, but this is just initial mock up and hopefully find better solution.
LateUpdate function:
if(myhit.transform.tag == "Mirror")
{
// depends on X rotation of mirror object, manipulate laser beam
this.lineRenderer.SetPosition(1, myhit.transform.position);
myhit.transform.tag = "OnLaser";
GameObject lr = Instantiate(this.gameObject, originBeam, transform.rotation) as GameObject;
Vector3 reflectVector = CalculateReflectVector(myhit.transform, originBeam);
lr.GetComponent<linerenderer>().SetPosition(0, myhit.transform.position);
lr.GetComponent<linerenderer>().SetPosition(1, reflectVector);
lr.GetComponent<laserbeamtriggered>().originBeam = myhit.transform.position;
lr.GetComponent<laserbeamtriggered>().directionBeam = reflectVector;
laserBeamAdded = true;
}
public Vector3 CalculateReflectVector(Transform hitBeam, Vector3 originBeam)
{
// Calculate second line renderer Vector 3
if (originBeam.y < hitBeam.position.y) {
Debug.Log ("Laser under");
Debug.Log (hitBeam.transform.eulerAngles.z);
// origin laser under target
if ((int)hitBeam.transform.eulerAngles.z == 45) {
return new Vector3 (hitBeam.transform.position.x + laserOffset, hitBeam.transform.position.y, hitBeam.transform.position.z);
} else {
return new Vector3 (hitBeam.transform.position.x - laserOffset, hitBeam.transform.position.y, hitBeam.transform.position.z);
}
} else if (originBeam.y > hitBeam.position.y) {
Debug.Log ("Laser top");
// origin laser at the top of the target
if ((int)hitBeam.transform.eulerAngles.z == 45) {
return new Vector3 (hitBeam.transform.position.x - laserOffset, hitBeam.transform.position.y, hitBeam.transform.position.z);
} else {
return new Vector3 (hitBeam.transform.position.x + laserOffset, hitBeam.transform.position.y, hitBeam.transform.position.z);
}
} else if (originBeam.x < hitBeam.position.x) {
// origin laser at right
if ((int)hitBeam.transform.eulerAngles.z == 45) {
return new Vector3 (hitBeam.transform.position.x, hitBeam.transform.position.y + laserOffset, hitBeam.transform.position.z);
} else {
return new Vector3 (hitBeam.transform.position.x, hitBeam.transform.position.y - laserOffset, hitBeam.transform.position.z);
}
}
else if (originBeam.x > hitBeam.position.x) {
// origin laser at right
if ((int)hitBeam.transform.eulerAngles.z == 45) {
return new Vector3 (hitBeam.transform.position.x, hitBeam.transform.position.y - laserOffset, hitBeam.transform.position.z);
} else {
return new Vector3 (hitBeam.transform.position.x, hitBeam.transform.position.y + laserOffset, hitBeam.transform.position.z);
}
}
// if fails
return originBeam;
}

Comments
Post a Comment