Почему Raycast2D имеет отклонение?
Добавлено: 27 янв 2021, 12:45
Всем привет. Я в тупике, заранее благодарю за любую помощь. Ситуация такова: У меня есть 2 объекта. Стартовый луч и зеркало. Зеркало продублировано через префабы. Зеркало использует Raycast2D чтобы кастовать луч дальше. И всё вроде бы работает, но с отклонением. Можете сами взглянуть. Все зеркала расставлены с чёткими градусами типа(135, 45, -45), то есть отражение должно быть таким же. Но уже на зеркале номер 2 жёлтая картинка луча отклоняется на 0.443. На зеркале номер 3 происходят странные вещи. Луч и Raycast имеют разные углы. На второй картинке видно, что стартовая позиция (-27, 12,5), Вектор (1.0, 0.0) то есть ровно вправо. Но точка попадания Raycast (12.9, 11.6), что на 0,9 ниже чем должна быть. На зеркале номер 7 схожая ситуация. И я честно не понимаю, как луч который идёт ровно вправо, может попасть ниже чем нужно. И к этому всему ещё и при векторе (1,0) кватернион выдаёт (0.0,0.0,0.9,0.4). Проект чистый, создал сегодня. Так что с моей стороны, надеюсь, минимум ошибок.
https://ibb.co/VL9bVVt
https://ibb.co/r5mrYcx
Синтаксис:
Используется 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