簡體   English   中英

Unity:如何在幾秒鍾內淡出場景

[英]Unity: how to fade away scene for few seconds

我正在編寫一個簡單的游戲,玩家必須在其中收集一些對象。 我想要做的是,在他收集一個物體后,場景會消失幾秒鍾,然后改變玩家位置。

我知道如何改變位置,我不知道如何制作漸隱效果。 我已經嘗試使用圖像效果(例如 Vortex 和 Blur),但我無法緩慢增加它們的變量(例如 Vortex 的角度值和模糊的模糊迭代),因此給人一種動畫的印象。

有人可以指導我完成這個嗎?

將 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變小。 它非常適合我。

您可以在場景中添加一個帶有紋理的新對象,使其類似於全局蒙版。 如果您希望淡入淡出效果下的場景只是黑色,那么填充黑色的小方形紋理就足夠了,您可以正確縮放它以適合相機。 此材質上的着色器應支持透明度,因此紋理的 alpha 層將是可管理的。 然后您可以使用 renderer.sharedMaterial.SetFloat() 方法從代碼中操作 alpha 值。

像這樣的東西:

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

我沒有測試這段代碼,但它顯示了方式。

我最近一直在為一個實驗性的 2D 游戲做類似的事情。 我發現最好的方法是使用一個非常簡潔的免費庫 - LeanTween。 您可以在普通游戲對象和 Unity UI 元素上使用它。 這就是淡出的樣子。

LeanTween.alpha (gameObject, 0.0f, 1.0f);

第一個參數應該是你想要淡出的游戲對象,第二個是你想要的 alpha 值(0.0f 將完全淡出對象),最后一個是動畫的持續時間。

您還可以使用 CanvasGroup 並使用 Coroutines 更改 alfa。 我認為這是一個簡單的方法。

這就是我在游戲中所做的:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM