Синтаксис:
Используется csharp
public class Mirror_Script : MonoBehaviour
{
[HideInInspector]
public Vector2 LastHit;
[HideInInspector]
public Vector2 inDirection;
public Transform NormalPos;
public RaycastHit2D LastRaycastHit;
public float distance;
private Vector2 LastVector;
private Vector2 NewVector;
private Vector2 inNormal;
private string HitName;
public GameObject Ray_Sprite;
private Mirror_Script MirrorBP;
public bool isPrint;
public void Mirror()
{
inNormal = LastRaycastHit.normal;
NewVector = Vector2.Reflect(inDirection, inNormal); // Новый отражённый вектор
NewVector = NewVector.normalized; // Нормализация вектора до длинны 1
Ray_Sprite.SetActive(true); // Включение луча
Ray_Sprite.transform.localRotation = (Quaternion.FromToRotation(-NewVector, inNormal));
RaycastHit2D Hit = Physics2D.Raycast(this.transform.position, NewVector, distance); // Рейкаст по новому вектору на дистанцию
if (Hit.transform != null) // если попадание не пустое
{
Debug.DrawLine(this.transform.position, Hit.point, Color.blue, 0.1f);
if (isPrint) // это чтобы не все зеркала печатали инфу, а только выбраное
{
print("Start position" + this.transform.position);
print("Vector" + NewVector);
print("Hit Point" + Hit.point);
}
if (Hit.transform.tag == "Mirror") // если тэг обьекта Mirror
{
if (HitName != Hit.transform.name)
{
HitName = Hit.transform.name;
MirrorBP = Hit.transform.gameObject.GetComponent<Mirror_Script>();
}
Ray_Sprite.transform.localScale = new Vector3(Ray_Sprite.transform.localScale.x, Hit.distance / 5.08f, Ray_Sprite.transform.localScale.z);
Debug.DrawLine(this.transform.position, Hit.point, Color.red);
LastVector = Hit.point - LastHit;
MirrorBP.LastHit = Hit.point;
MirrorBP.inDirection = LastVector;
MirrorBP.LastRaycastHit = Hit;
MirrorBP.Mirror();
}
else if (Hit.transform.tag == "Crystal")
{
}
else
Ray_Sprite.transform.localScale = new Vector3(Ray_Sprite.transform.localScale.x, Hit.distance / 5.08f, Ray_Sprite.transform.localScale.z);
}
else
Ray_Sprite.SetActive(false);
}
}
{
[HideInInspector]
public Vector2 LastHit;
[HideInInspector]
public Vector2 inDirection;
public Transform NormalPos;
public RaycastHit2D LastRaycastHit;
public float distance;
private Vector2 LastVector;
private Vector2 NewVector;
private Vector2 inNormal;
private string HitName;
public GameObject Ray_Sprite;
private Mirror_Script MirrorBP;
public bool isPrint;
public void Mirror()
{
inNormal = LastRaycastHit.normal;
NewVector = Vector2.Reflect(inDirection, inNormal); // Новый отражённый вектор
NewVector = NewVector.normalized; // Нормализация вектора до длинны 1
Ray_Sprite.SetActive(true); // Включение луча
Ray_Sprite.transform.localRotation = (Quaternion.FromToRotation(-NewVector, inNormal));
RaycastHit2D Hit = Physics2D.Raycast(this.transform.position, NewVector, distance); // Рейкаст по новому вектору на дистанцию
if (Hit.transform != null) // если попадание не пустое
{
Debug.DrawLine(this.transform.position, Hit.point, Color.blue, 0.1f);
if (isPrint) // это чтобы не все зеркала печатали инфу, а только выбраное
{
print("Start position" + this.transform.position);
print("Vector" + NewVector);
print("Hit Point" + Hit.point);
}
if (Hit.transform.tag == "Mirror") // если тэг обьекта Mirror
{
if (HitName != Hit.transform.name)
{
HitName = Hit.transform.name;
MirrorBP = Hit.transform.gameObject.GetComponent<Mirror_Script>();
}
Ray_Sprite.transform.localScale = new Vector3(Ray_Sprite.transform.localScale.x, Hit.distance / 5.08f, Ray_Sprite.transform.localScale.z);
Debug.DrawLine(this.transform.position, Hit.point, Color.red);
LastVector = Hit.point - LastHit;
MirrorBP.LastHit = Hit.point;
MirrorBP.inDirection = LastVector;
MirrorBP.LastRaycastHit = Hit;
MirrorBP.Mirror();
}
else if (Hit.transform.tag == "Crystal")
{
}
else
Ray_Sprite.transform.localScale = new Vector3(Ray_Sprite.transform.localScale.x, Hit.distance / 5.08f, Ray_Sprite.transform.localScale.z);
}
else
Ray_Sprite.SetActive(false);
}
}
https://ibb.co/VL9bVVt
https://ibb.co/r5mrYcx