Как я могу это сделать, если в Обновлении я меняю состояние направления, оно изменит его в реальном времени? - PullRequest
0 голосов
/ 04 апреля 2020
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ChangePivotDirections : MonoBehaviour
{
    public enum Directions { Left, Right, Up, Down, Both_Left_Right, Both_Up_Down };

    public Directions direction;
    public bool scaleBothDirections = false;
    public Transform prefabToScale;
    public float scalingamount;
    public float scalingDuration;
    public string directionState;

    private Vector3 ToScale;
    private bool isScaling = false;
    private float setPivot;

    private void Start()
    {
        ToScale = prefabToScale.transform.localScale;

        if (scaleBothDirections == false)
        {
            ScalingDirections();
            ToScaling();
        }
        else
        {
            ScalingDirections();
        }
    }

    IEnumerator scaleOverTime(Transform objectToScale, Vector3 toScale, float duration)
    {
        //Make sure there is only one instance of this function running
        if (isScaling)
        {
            yield break; ///exit if this is still running
        }
        isScaling = true;

        float counter = 0;

        //Get the current scale of the object to be moved
        Vector3 startScaleSize = objectToScale.localScale;

        while (counter < duration)
        {
            counter += Time.deltaTime;
            objectToScale.localScale = Vector3.Lerp(startScaleSize, toScale, counter / duration);

            yield return null;
        }

        isScaling = false;
    }

    private void ScalingDirections()
    {
        var child = prefabToScale.GetChild(0).transform;

        if (scaleBothDirections == false)
        {
            if (direction == Directions.Left)
            {
                setPivot = prefabToScale.localScale.x / 2;
                prefabToScale.localPosition = new Vector3(prefabToScale.localPosition.x + setPivot, prefabToScale.localPosition.y, prefabToScale.localPosition.z);
                child.localPosition = new Vector3(child.localPosition.x - setPivot, child.localPosition.y, child.localPosition.z);
            }

            if (direction == Directions.Right)
            {
                setPivot = prefabToScale.localScale.x / 2;
                prefabToScale.localPosition = new Vector3(prefabToScale.localPosition.x - setPivot, prefabToScale.localPosition.y, prefabToScale.localPosition.z);
                child.localPosition = new Vector3(child.localPosition.x + setPivot, child.localPosition.y, child.localPosition.z);
            }

            if (direction == Directions.Up)
            {
                setPivot = prefabToScale.localScale.y / 2;
                prefabToScale.localPosition = new Vector3(prefabToScale.localPosition.x, prefabToScale.localPosition.y - setPivot, prefabToScale.localPosition.z);
                child.localPosition = new Vector3(child.localPosition.x, child.localPosition.y + setPivot, child.localPosition.z);
            }

            if (direction == Directions.Down)
            {
                setPivot = prefabToScale.localScale.y / 2;
                prefabToScale.localPosition = new Vector3(prefabToScale.localPosition.x, prefabToScale.localPosition.y + setPivot, prefabToScale.localPosition.z);
                child.localPosition = new Vector3(child.localPosition.x, child.localPosition.y - setPivot, child.localPosition.z);
            }
        }
        else
        {
            if (direction == Directions.Both_Left_Right)
            {
                StartCoroutine(scaleOverTime(prefabToScale, new Vector3(ToScale.x + scalingamount, ToScale.y, ToScale.z), scalingDuration));
            }

            if (direction == Directions.Both_Up_Down)
            {
                StartCoroutine(scaleOverTime(prefabToScale, new Vector3(ToScale.x, ToScale.y + scalingamount, ToScale.z), scalingDuration));
            }
        }

        directionState = direction.ToString();
    }

    private void ToScaling()
    {
        if (direction == Directions.Left || direction == Directions.Right)
        {
            StartCoroutine(scaleOverTime(prefabToScale, new Vector3(scalingamount, ToScale.y, ToScale.z), scalingDuration));
        }

        if (direction == Directions.Up || direction == Directions.Down)
        {
            StartCoroutine(scaleOverTime(prefabToScale, new Vector3(ToScale.x, scalingamount, ToScale.z), scalingDuration));
        }
    }

    private void Update()
    {

    }
}

Например, если он масштабируется влево, а я изменяю его в середине вправо, то из точки масштабирования он теперь масштабируется вправо так же, как для повышения, так и для обоих состояний.

Конечно, вы не можете изменить Слева на Вверх в середине, поэтому в Обновлении он должен быть только с другой стороны от текущей. Например, измените слева направо или справа налево вниз и оба.

Все отлично работает при запуске игры, но не знаете, как внести изменения в обновлении.

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