Прежде чем начать, я хотел бы сказать, извините, если это не очень профессионально написано, я работал над этим часами, стуча головой о стену, пытаясь понять это без удачи, я устал и подчеркнул.
Я пытаюсь заставить движущийся объект войти через 1 портал в указанной точке c и выйти из другого портала в той же точке, в которую он вошел. Таким образом, если шарик входит в верхнюю часть портала, объект выйдет в верхнюю часть выходного портала, а если объект входит в нижнюю часть портала, он выйдет из нижней части другого портала. Я не самая лучшая иллюстрация, но вот что я хочу сделать:
Здесь вы можете видеть на обоих изображениях объект входит в синий портал и выходит из оранжевого в той точке, в которую он вошел так что сверху вниз, снизу вниз.
Я действительно заставил это работать нормально, но теперь мне нужно сделать это снова, но на этот раз один из порталов должен быть горизонтальным, а не вертикальным:
Итак, что я сделал, так это сделал так, чтобы когда оба вертикальных, я оставлял флажок «exitIsHorizontal» без проверки (false), и когда один из них находился на потолке на уровне , он переводит вертикальную ось в горизонтальную.
Я даже вроде как заставил это работать, однако у него есть воспроизводимый кварк, который нужно исправить. Когда объект попадает в нижнюю часть портала, он работает нормально, как вы ожидаете, и так же, как на картинке выше. Но когда вы попадаете на верхнюю часть портала, объект выходит с другой стороны портала, как и следовало ожидать, но объект начинает двигаться в противоположном направлении, как показано на этом изображении:
Правильное расположение выхода, неправильное направление выхода по некоторым причинам. Мне также нужно, чтобы эта функция была динамической c, чтобы, если, скажем, объект попадал на синий портал с другого направления, в котором направление выхода также поменялось бы на стороны: ![enter image description here](https://i.stack.imgur.com/yXCWv.png)
Вот мой скрипт:
public GameObject otherPortal;
public PortalController otherPortalScript;
private BallController ballController;
public bool exitIsHorizontal = false;
List<PortalController> inUseControllers = new List<PortalController>();
// Use this for initialization
void Start ()
{
}
// Update is called once per frame
void Update ()
{
}
void OnTriggerEnter2D(Collider2D other)
{
if (other.gameObject.tag == "Ball")
{
ballController = other.GetComponent<BallController>();
if (inUseControllers.Count == 0)
{
inUseControllers.Add(otherPortalScript);
var offset = other.transform.position - transform.position;
if(exitIsHorizontal)
{
offset.x = offset.y;
offset.y = 0;
}
else
{
offset.x = 0;
}
other.transform.position = otherPortal.transform.position + offset;
}
}
}
void OnTriggerExit2D(Collider2D other)
{
if (other.gameObject.tag == "Ball")
{
inUseControllers.Clear();
}
}
Этот скрипт прикреплен к обоим порталам, так что оба портала могут обрабатывать как вход, так и выход. И любую переменную, которую вы не видите объявленной с помощью чего-либо в скрипте, делающей ее практически нулевой (например, «otherPotal»), я объявляю в редакторе.
Держу пари, это что-то чрезвычайно простое, что я просто пропускаю Я просто не знаю, что что-то есть.