Ни в коем случае. Согласно спецификациям, исключения, расширенные из класса RuntimeException
или класса Error
, считаются неконтролируемыми исключениями (JLS 7, стр. 11.1.1).
Это можно сделать с помощью функций 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));
Проверьте 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;
}
Вы создадите новый скрипт 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;
Vector3 startScaleSize = objectToScale.position;
Должно бытьVector3 startScaleSize = objectToScale.localScale;
– TheSkimek 6 October 2017 в 09:11