Единство: как за несколько секунд угаснуть сцена

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

Я знаю, как изменить положение, я не знаю, как сделать эффект исчезновения. Я пытался использовать эффект изображения (например, 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;
            }
        }
    }
Другие вопросы по тегам