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

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

Вот мой код для класса цилиндров

 public class Cylinder : Shape
{
    public Cylinder()
    {
    GameObject cylinder = GameObject.CreatePrimitive(PrimitiveType.Cylinder);
        cylinder.transform.position = new Vector3(3, 0, 0);
        cylinder.transform.localScale = new Vector3(1.0f, Random.Range(1, 2)-1*Time.deltaTime, 1.0f);

        cylinder.GetComponent<MeshRenderer>().material.color = Random.ColorHSV();
        Destroy(cylinder, 30.0f);
    }
}

Ответы на вопрос(3)

в. Затем вы будете использовать метод «Обновление» монобихиоризма (или сопрограммы) для изменения объекта с течением времени.

Monobehaviour должен выглядеть так:

public class ShrinkBehaviour : MonoBehaviour
{
    bool isNeedToShrink;
    Config currentConfig;

    float startTime;
    float totalDistance;

    public void StartShrink(Config config)
    {
        startTime = Time.time;
        currentConfig = config;
        totalDistance = Vector3.Distance(currentConfig.startSize, currentConfig.destinationSize);
        isNeedToShrink = true;
        transform.localScale = config.startSize;
    }

    private void Update()
    {
        if (isNeedToShrink)
        {
            var nextSize = GetNextSize(currentConfig);

            if (Vector3.Distance(nextSize, currentConfig.destinationSize) <= 0.05f)
            {
                isNeedToShrink = false;
                return;
            }

            transform.localScale = nextSize;
        }
    }

    Vector3 GetNextSize(Config config)
    {
        float timeCovered = (Time.time - startTime) / config.duration;
        var result = Vector3.Lerp(config.startSize, config.destinationSize, timeCovered);
        return result;
    }

    public struct Config
    {
        public float duration;
        public Vector3 startSize;
        public Vector3 destinationSize;
    }
}

Для использования этого вы должны сделать следующее:

public Cylinder()
{
    GameObject cylinder = GameObject.CreatePrimitive(PrimitiveType.Cylinder);
    var shrink = cylinder.AddComponent<ShrinkBehaviour>();
    shrink.StartShrink(new ShrinkBehaviour.Config() { startSize = Vector3.one * 10, destinationSize = Vector3.one * 1, duration = 20f });
    cylinder.transform.position = new Vector3(3, 0, 0);

    cylinder.GetComponent<MeshRenderer>().material.color = Random.ColorHSV();
    Destroy(cylinder, 30.0f);
}

Вы должны помнить, что сценарий monobehaviour-script должен находиться в отдельном файле и должен иметь имя, подобное имени класса monobehaviour. Например, ShrinkBehaviour.cs;

 Kenneth Dionisi05 окт. 2017 г., 16:25
Вы не объявили определение скорости, откуда вы взяли скорость?
 Sergiy Klimkov05 окт. 2017 г., 16:21
Извините, я не дочитал до конца. Так что я меняю свой ответ.
 Sergiy Klimkov05 окт. 2017 г., 16:28
Я чиню это. Просто замените скорость на продолжительность.
 Kenneth Dionisi05 окт. 2017 г., 16:14
Что если я просто хочу уменьшить высоту объекта на 20 секунд?
 Kenneth Dionisi05 окт. 2017 г., 16:36
Я пытаюсь, и это займет всего несколько секунд, чтобы сжаться до размера назначения.

Проверять, выписыватьсяLerp, Общий пример того, как его использовать, будет примерно таким:

float t = 0;
Update()
{
    t += Time.deltaTime;
    cylinder.localScale = new Vector3(1, Mathf.Lerp(2f, 1f, t/3f), 1); // shrink from 2 to 1 over 3 seconds;
}

Это можно сделать с помощьюTime.deltaTime а такжеVector3.Lerp в функции сопрограммы. Похожий наПоворот GameObject с течением времени а такжеПереместить GameObject с течением времени вопросов. Немного изменил это, чтобы сделать именно это.

bool isScaling = false;

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;
}

ИСПОЛЬЗОВАНИЕ:

Будет масштабировать GameObject в течение 20 секунд:

StartCoroutine(scaleOverTime(cylinder.transform, new Vector3(0, 0, 90), 20f));
 Programmer06 окт. 2017 г., 11:15
@ TheSkimek Да, верно. Это был быстрый порт. Спасибо за исправление.
 TheSkimek06 окт. 2017 г., 11:11
Vector3 startScaleSize = objectToScale.position; Должно бытьVector3 startScaleSize = objectToScale.localScale;

Ваш ответ на вопрос