Единство: как за несколько секунд угаснуть сцена
Я программирую простую игру, в которой игрок должен собирать некоторые предметы. Что я хотел бы сделать, так это то, что после того, как он соберет объект, сцена исчезнет на несколько секунд, а затем позиция игрока изменится.
Я знаю, как изменить положение, я не знаю, как сделать эффект исчезновения. Я пытался использовать эффект изображения (например, Vortex и Blur), но я не в состоянии медленно увеличивать их переменные (например, значение угла для Vortex и итерация размытия для размытия), чтобы создать впечатление анимации.
Может ли кто-нибудь провести меня через это?
4 ответа
Недавно я делал подобные вещи для экспериментальной 2D-игры. Я обнаружил, что лучший способ сделать это - использовать действительно аккуратную бесплатную библиотеку - LeanTween. Вы можете использовать его на обычных игровых объектах и элементах пользовательского интерфейса Unity. Вот так будет выглядеть затухание.
LeanTween.alpha (gameObject, 0.0f, 1.0f);
Первый параметр должен быть игровым объектом, который вы хотите исчезнуть, второй - это альфа-значение, к которому вы стремитесь (0,0f полностью исчезнет с объекта), а последний - это продолжительность анимации.
Добавьте эффект изображения ScreenOverlay к вашей камере, установите BlendMode на ScreenBlend и Intensity на 0, затем добавьте следующий скрипт:
bool fading;
float fadeValue = 0;
const float INCREMENT = 0.01f;
const float MAX_BLEND = 2;
ScreenOverlay so;
void OnTriggerEnter(Collider other)
{
fading = true;
}
void Start()
{
so = gameObject.GetComponent<ScreenOverlay>();
}
void Update()
{
if (fading)
{
fadeValue += INCREMENT;
so.intensity = fadeValue * MAX_BLEND;
if (fadeValue >= 1)
{
fading = false;
// change player position
}
}
else if (fadeValue > 0)
{
fadeValue = Mathf.Max(0, fadeValue - INCREMENT);
so.intensity = fadeValue * MAX_BLEND;
}
}
Чтобы увеличить продолжительность, просто сделайте INCREMENT
меньше. Это прекрасно работает для меня.
Вы можете добавить новый объект с текстурой на сцену, чтобы это было что-то вроде глобальной маски. Если вы хотите, чтобы ваша сцена с эффектом затухания была просто черной, тогда достаточно маленькой квадратной текстуры, заполненной черным, вы можете правильно масштабировать ее так, чтобы она подходила камере. И шейдер этого материала должен поддерживать прозрачность, чтобы альфа-слой текстуры был управляемым. Затем вы можете управлять альфа-значением из кода, используя метод renderer.sharedMaterial.SetFloat().
Что-то вроде этого:
IEnumerator SetTransparencyLevel(bool fullyTransparent)
{
for (var i = renderer.material.GetFloat("Alpha"); fullyTransparent && i > 0 || !fullyTransparent && i < 1; i+=0.05f)
{
renderer.material.SetFloat("Alpha", i);
yield return new WaitForEndOfFrame();
}
}
Я не тестировал этот код, но он показывает путь.
Вы также можете использовать CanvasGroup и изменить альфа-канал с помощью Coroutines. Я думаю, это легкий подход.
Вот что я делаю в своих играх:
public class Fader : MonoBehaviour {
private CanvasGroup _canvasGroup;
private Coroutine _currentActiveFade;
private void Awake() {
_canvasGroup = GetComponent<CanvasGroup>();
}
public void FadeOutImmediately() => _canvasGroup.alpha = 1;
public Coroutine FadeOut(float time) => Fade(1, time);
public Coroutine FadeIn(float time) => Fade(0, time);
private Coroutine Fade(float target, float time) {
if (_currentActiveFade != null) StopCoroutine(_currentActiveFade);
_currentActiveFade = StartCoroutine(FadeRoutine(target, time));
return _currentActiveFade;
}
private IEnumerator FadeRoutine(float target, float time) {
while (!Mathf.Approximately(_canvasGroup.alpha, target)) {
_canvasGroup.alpha = Mathf.MoveTowards(_canvasGroup.alpha, target, Time.deltaTime / time);
yield return null;
}
}
}