Изменение размера GameObject со временем [дубликат]

Ни в коем случае. Согласно спецификациям, исключения, расширенные из класса RuntimeException или класса Error, считаются неконтролируемыми исключениями (JLS 7, стр. 11.1.1).

-1
задан Programmer 5 October 2017 в 13:53
поделиться

3 ответа

Это можно сделать с помощью функций Time.deltaTime и Vector3.Lerp в сопрограмме. Подобно Поворот GameObject с течением времени и Вопросы Move 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));
3
ответ дан Programmer 15 August 2018 в 16:19
поделиться
  • 1
    Vector3 startScaleSize = objectToScale.position; Должно быть Vector3 startScaleSize = objectToScale.localScale; – TheSkimek 6 October 2017 в 09:11
  • 2
    @TheSkimek Yup, это правильно. Это был быстрый порт. Спасибо за исправление. – Programmer 6 October 2017 в 09:15

Проверьте 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;
}
0
ответ дан ryeMoss 15 August 2018 в 16:19
поделиться

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

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-class. Например, ShrinkBehaviour.cs;

0
ответ дан Sergiy Klimkov 15 August 2018 в 16:19
поделиться
  • 1
    Что делать, если я просто хочу сжать высоту объекта в течение 20 секунд? – Kenneth Dionisi 5 October 2017 в 14:14
  • 2
    Извините, я не закончил читать. Поэтому я меняю свой ответ. – Sergiy Klimkov 5 October 2017 в 14:21
  • 3
    вы не объявили определение скорости, откуда вы получили скорость? – Kenneth Dionisi 5 October 2017 в 14:25
  • 4
    Я чиню это. Просто замените скорость на продолжительность. – Sergiy Klimkov 5 October 2017 в 14:28
  • 5
    Я пытаюсь, и его всего лишь несколько секунд, чтобы уменьшить размер места назначения. – Kenneth Dionisi 5 October 2017 в 14:36
Другие вопросы по тегам:

Похожие вопросы: