Почему объект вращается также по x и z?Он должен вращаться только на - PullRequest
0 голосов
/ 25 сентября 2019
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class NaviManager : MonoBehaviour
{
    public GameObject objectToScale;
    public GameObject lookAtObjToRotate;
    public Camera playerCamera;
    public DimLights dimLights;
    public float duration = 1f;
    public Vector3 minSize;
    public Vector3 maxSize;
    public bool scaleUp = false;
    public Coroutine scaleCoroutine;
    public bool automatic = false;
    public bool coroutineIsRunning = false;

    private Quaternion rotation;
    private float counter = 0;
    private Coroutine lightsCoroutine;

    private void Start()
    {
        objectToScale.transform.localScale = minSize;
    }

    private void Update()
    {
        if (automatic)
        {
            if (!coroutineIsRunning)
            {
                NaviScaling();
            }
        }
        else
        {
            if (Input.GetKeyDown(KeyCode.G))
            {
                NaviScaling();
            }
        }
    }

    public void NaviScaling()
    {
        scaleUp = !scaleUp;

        if (scaleCoroutine != null)
            StopCoroutine(scaleCoroutine);

        if (scaleUp)
        {
            scaleCoroutine = StartCoroutine(ScaleOverTime(objectToScale, maxSize, duration));
        }
        else
        {
            scaleCoroutine = StartCoroutine(ScaleOverTime(objectToScale, minSize, duration));
        }
    }

    private IEnumerator ScaleOverTime(GameObject objectToScale, Vector3 toScale, float duration)
    {
        counter = 0;
        Vector3 startScaleSize = objectToScale.transform.localScale;

        coroutineIsRunning = true;

        while (counter < duration)
        {
            counter += Time.deltaTime;

            ScaleAndRotate(startScaleSize, toScale);

            if (counter > duration)
                coroutineIsRunning = false;

            yield return null;
        }
    }

    private void ScaleAndRotate(Vector3 startScaleSize, Vector3 toScale)
    {
        objectToScale.transform.localScale = Vector3.Lerp(startScaleSize, toScale, counter / duration);

        var lookPos = lookAtObjToRotate.transform.position - objectToScale.transform.position;
        lookPos.y = 0;
        if (scaleUp == true)
        {
            rotation = Quaternion.LookRotation(lookPos);
            objectToScale.transform.rotation = Quaternion.Slerp(objectToScale.transform.rotation, rotation, counter / duration);

            DimLights(1);
        }
        else
        {
            rotation = Quaternion.LookRotation(playerCamera.transform.forward);
            objectToScale.transform.rotation = Quaternion.Slerp(objectToScale.transform.rotation, rotation, counter / duration);

            DimLights(0);
        }
    }

    private void DimLights(int LightsOnOff)
    {
        if (dimLights.lightsOnOff == false)
            lightsCoroutine = StartCoroutine(dimLights.dimLightOverTime(LightsOnOff, duration));
    }
}

1 Ответ

1 голос
/ 25 сентября 2019

Когда scaleUp не соответствует действительности, вы имеете в виду обнуление компонента y вектора направления, который вы передаете в Quaternion.LookRotation.Вы можете использовать Vector3.Scale для этого:

if (scaleUp)
{
    rotation = Quaternion.LookRotation(lookPos);
    objectToScale.transform.rotation = Quaternion.Slerp(
            objectToScale.transform.rotation, rotation, counter / duration);

    DimLights(1);
}
else
{
    Vector3 flattenedLookDirection = Vector3.Scale(
            new Vector3(1,0,1),
            playerCamera.transform.forward);

    rotation = Quaternion.LookRotation(flattenedLookDirection);
    objectToScale.transform.rotation = Quaternion.Slerp(
            objectToScale.transform.rotation, rotation, counter / duration);

    DimLights(0);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...