コード例 #1
0
    public IEnumerator StabilizeY()
    {
        EasyTouch.SetEnabled(false);
        FindNearestAngleY();

        while (true)
        {
            var condition = MathAngle.FirstAngleBiggerThenSecond(CurrentAngleY, rightAngleY - 1) &&
                            MathAngle.FirstAngleBiggerThenSecond(rightAngleY + 1, CurrentAngleY);
            if (condition)
            {
                layerTransform.eulerAngles = new Vector3(CurrentAngleX, rightAngleY, CurrentAngleZ);

                rotateController.ReshuffleAfterYRotation(prevY, rightAngleY, AngleBetweenPlatforms);
                prevY = rightAngleY;
                EasyTouch.SetEnabled(true);

                yield break;
            }
            var angle = GetAngleForYRotation();
            layerTransform.Rotate(0, angle, 0);

            yield return(new WaitForFixedUpdate());
        }
    }
コード例 #2
0
    public IEnumerator UpdateXZ(Platform platform)
    {
        EasyTouch.SetEnabled(false);
        var isRotated = layer.isRotated;
        var rotated   = isRotated ? -1 : 1;

        angleForXZRotation = MathAngle.To360Degree(platform.defaultAngleInLayer);
        angleForXZRotation = isRotated ? 360 - angleForXZRotation : angleForXZRotation;

        angleForXZRotation *= Mathf.Deg2Rad;
        var firstX  = CurrentAngleX;
        var firstZ  = CurrentAngleZ;
        var factorX = (float)-Math.Sin(angleForXZRotation) * rotated;
        var factorZ = (float)Math.Cos(angleForXZRotation) * rotated;

        while (true)
        {
            var speed  = speedXZRotation;
            var angleX = speed * factorX;
            var angleZ = speed * factorZ;
            if (XZisRight(firstX, firstZ))
            {
                SetPerfectRotation();
                rotateController.ReshuffleAfterXZRotation(platform);
                layer.isRotated = !layer.isRotated;
                EasyTouch.SetEnabled(true);

                yield break;
            }
            layerTransform.Rotate(angleX, 0, 0, Space.Self);
            layerTransform.Rotate(0, 0, angleZ, Space.Self);
            yield return(new WaitForFixedUpdate());
        }
    }
コード例 #3
0
    private float GetAngleForYRotation()
    {
        var res = speedYRotation;

        if (MathAngle.FirstAngleBiggerThenSecond(CurrentAngleY, rightAngleY))
        {
            res *= -1;
        }
        if (layer.isRotated)
        {
            res *= -1;
        }
        return(res);
    }
コード例 #4
0
    private void FindNearestAngleY()
    {
        var between = AngleBetweenPlatforms;
        var delta   = deltaAngelForAlignmentY;

        if (between == 120)
        {
            between /= 2;
        }
        var leftOrRight = Math.Round((CurrentAngleYWithAlignment % between) / between);

        rightAngleY  = (int)(leftOrRight + ((CurrentAngleYWithAlignment - (CurrentAngleYWithAlignment % between)) / between)) * between;
        rightAngleY += delta;
        rightAngleY  = MathAngle.To360Degree(rightAngleY);
    }
コード例 #5
0
    private void SetPerfectRotation()
    {
        var x            = CurrentAngleX;
        var z            = CurrentAngleZ;
        var leftOrRightX = Math.Round((x % 180) / 180);
        var leftOrRightZ = Math.Round((z % 180) / 180);

        rightAngleX = (int)(leftOrRightX + ((x - (x % 180)) / 180)) * 180;
        rightAngleZ = (int)(leftOrRightZ + ((z - (z % 180)) / 180)) * 180;
        rightAngleX = MathAngle.To360Degree(rightAngleX);
        rightAngleZ = MathAngle.To360Degree(rightAngleZ);
        FindNearestAngleY();
        prevY = rightAngleY;
        layerTransform.eulerAngles = new Vector3(rightAngleX, rightAngleY, rightAngleZ);
    }
コード例 #6
0
    private bool XZisRight(float firstX, float firstZ)
    {
        var isRightX = MathAngle.AngleIsInRange(CurrentAngleX, firstX + 180 - 4, firstX + 180 + 4);

        if (isRightX)
        {
            var isZ0   = MathAngle.AngleIsInRange(CurrentAngleZ, -4, 4);
            var isZ180 = MathAngle.AngleIsInRange(CurrentAngleZ, 180 - 4, 180 + 4);
            return(isZ0 || isZ180);
        }
        var isRightZ = MathAngle.AngleIsInRange(CurrentAngleZ, firstZ + 180 - 4, firstZ + 180 + 4);

        if (isRightZ)
        {
            var isX0   = MathAngle.AngleIsInRange(CurrentAngleX, -4, 4);
            var isX180 = MathAngle.AngleIsInRange(CurrentAngleX, 180 - 4, 180 + 4);
            return(isX0 || isX180);
        }
        return(false);
    }
コード例 #7
0
    public IEnumerator UpdateY()
    {
        var startPosition = Input.mousePosition;

        startPosition.z = 30;
        startPosition   = camera.ScreenToWorldPoint(startPosition);
        var angleOfPlatform = Mathf.Atan2(startPosition.z, startPosition.x) * Mathf.Rad2Deg + CurrentAngleY;

        while (true)
        {
            var touchPosition = Input.mousePosition;
            touchPosition.z = 30;
            touchPosition   = camera.ScreenToWorldPoint(touchPosition);

            var angle = Mathf.Atan2(touchPosition.z, touchPosition.x) * Mathf.Rad2Deg - angleOfPlatform;
            angle = MathAngle.To360Degree(angle);
            layerTransform.rotation = Quaternion.Euler(CurrentAngleX, -angle, CurrentAngleZ);
            yield return(new WaitForFixedUpdate());
        }
    }