示例#1
0
    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;
        }
    }
示例#2
0
    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();
    }
示例#3
0
    //Функция которая определяет находится ли наш объект с указанными координатами за порталом
    private bool BehingThePortal(Vector3 ObjectCoord, GameObject Portal)
    {
        var PortalCoord         = Portal.transform.position;
        var PortalAngles        = -1 * Portal.transform.eulerAngles;
        var ObjectCoordAtPorlat = TransformCoord.Transform(ObjectCoord, PortalCoord, PortalAngles);

        return(ObjectCoordAtPorlat.y < 0);
    }
示例#4
0
    //Отлавливаем коллизии с другими объектами и корректируем поведение теневого объекта
    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;
    }