public void Portate(GameObject StartPortal, GameObject EndPortal) { if (!IsShadow) //Если наш объект не является "тенью" то разрешаем его телепортацию { ThisPortal = StartPortal; ShadowPortal = StartPortal; //Ставим теневой объект за вторым поратолом //Для начала определяем координаты текущего объекта относительно портала var ObjectCoord = transform.position; var PortalCoord = StartPortal.transform.position; var PortalAngles = StartPortal.transform.eulerAngles; var ShadowCoordAtPortal = TransformCoord.Transform(ObjectCoord, PortalCoord, PortalAngles); //Затем ставим теневой объект за вторым порталом точно так же расположен первый объект относительно порала //Только инвертируем координату у, чтобы объект был за порталом ShadowCoordAtPortal.y *= -1; //Теперь изменияем вектор скорости для теневого объекта var ShadowVelocity = RBody.velocity; //Сначала поворачивем наш вектор на нунжый угол var Angles = EndPortal.transform.eulerAngles - StartPortal.transform.eulerAngles; ShadowVelocity = TransformCoord.Rotate(ShadowVelocity, Angles); ShadowVelocity *= -1; Shadow.SetShadowPortate(StartPortal, EndPortal, ShadowVelocity, ShadowCoordAtPortal); isPortate = true; } }
public void SetShadowPortate(GameObject StartPortal, GameObject EndPortal, Vector3 velocity, Vector3 PositionAtPotal) { isPortate = true; gameObject.SetActive(true); RBody.WakeUp(); //Переводим координаты объекта относительно портала в глобальные координаты //Сначала поворачиваем вектор обозначающий позицию за порталом на угол поворота портала var PortalAngles = EndPortal.transform.eulerAngles; //Углы умножаем на минус один, поскольку в формулах поворота положительное направление угла - против часовой стрелки. А в unity - по PortalAngles.x *= -1; PortalAngles.y *= -1; PortalAngles.z *= -1; var ShadowCoordAtPortal = TransformCoord.Rotate(PositionAtPotal, PortalAngles); //Прибавляем к позиции портала наши координаты transform.position = EndPortal.transform.position + PositionAtPotal; RBody.velocity = velocity; IsShadow = true; ThisPortal = EndPortal; ShadowPortal = StartPortal; isPortate = true; //Отрисовываем меш DrawVertices(); }
//Отлавливаем коллизии с другими объектами и корректируем поведение теневого объекта private void OnCollisionEnter(Collision collision) { //Вычисляем скорость объекта после коллизии var Speed = RBody.velocity; //Поворачиваем скорость на нужный угол var Angles = ShadowPortal.transform.eulerAngles - ThisPortal.transform.eulerAngles; var ShadowSpeed = TransformCoord.Rotate(Speed, Angles); ShadowSpeed *= -1; //Прибавляем скорость к теневому объекту ShadowRBoy.velocity = ShadowSpeed; }