【问题标题】:Unity: how to fade away scene for few secondsUnity:如何在几秒钟内淡出场景
【发布时间】:2016-01-08 19:00:04
【问题描述】:

我正在编写一个简单的游戏,其中玩家必须收集一些物品。我想做的是,在他收集到一个物体后,场景消失几秒钟,然后改变玩家的位置。

我知道如何改变位置,我不知道如何制作渐隐效果。我尝试过使用图像效果(例如 Vortex 和 Blur),但我无法缓慢地增加它们的变量(例如 Vortex 的角度值和模糊的模糊迭代),从而给人一种动画的印象。

有人可以指导我吗?

【问题讨论】:

标签: c# animation unity3d fading


【解决方案1】:

将 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 变小即可。 它非常适合我。

【讨论】:

    【解决方案2】:

    您可以在场景中添加一个带有纹理的新对象,使其类似于全局蒙版。如果您希望淡入淡出效果下的场景只是黑色,那么填充黑色的小方形纹理就足够了,您可以适当缩放它以适合相机。 并且此材质上的着色器应支持透明度,以便可以管理纹理的 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();
    }
    }
    

    我没有测试这段代码,但它显示了方法。

    【讨论】:

    • 如何慢慢增加alpha值?
    • 我在回答中添加了一个示例。
    【解决方案3】:

    我最近一直在为一个实验性的 2D 游戏做类似的事情。我发现最好的方法是使用一个非常简洁的免费库——LeanTween。您可以在普通游戏对象和 Unity UI 元素上使用它。这就是淡出的样子。

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

    第一个参数应该是你想要淡出的游戏对象,第二个是你想要的 alpha 值(0.0f 将完全淡出对象),最后一个是动画的持续时间。

    【讨论】:

      【解决方案4】:

      您还可以使用 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;
                  }
              }
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-09-04
        • 1970-01-01
        • 2011-12-30
        • 2015-08-20
        • 2021-08-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多