【问题标题】:Unity 2D: Simple Cutscene animation system/managerUnity 2D:简单的过场动画系统/管理器
【发布时间】:2017-11-30 01:32:00
【问题描述】:

我正在努力想出一种聪明的方法来处理我的 2D 游戏中的过场动画。我想我已经决定使用Animator 创建/控制过场动画,并移动实际的游戏对象。

我正在苦苦挣扎的是:

这种方法意味着每个GameObject 都需要自己的Animator。那么我该如何触发正确的过场动画呢?我将使用游戏阶段来控制游戏及其进度,例如:

if(gameStage == 34 && entering scene castle)
{
    playCorrectCutscene();
}

如何以及在哪里保留对所有过场动画的引用?假设我在一个场景中有 22 个 NPC,其中 15 个有自己的Animator,因为他们有过场动画,我该如何播放来自 NPC_11 的动画?

我想我正在寻找某种“过场动画管理器”。最好的解决方案是为每个带有 ID 的过场动画(动画)设置一个 List。然后我可以使用 ID 播放正确的动画。但由于每个动画都存储在实际的GameObject 中,我不知道这是否可能。

希望我说得通。

【问题讨论】:

  • 您可以将每个过场动画创建为预制件,并为其提供一些参考名称,然后实例化您需要的预制件 - 如果您有很多过场动画,您将节省大量内存。
  • @RafalZiolkowski 我认为您应该将其作为答案。将所有游戏对象制作为预制件,并使用资源或资产包loading 它们应该这样做。
  • @Programmer - 回家后我会做的,包括代码示例 - 我在日常工作中并不完全是统一开发人员 :)
  • 没问题。当你这样做时会回来检查。
  • @RafalZiolkowski 过场动画的动画会在您的意思是预制件内吗?是的,一个代码示例会很棒!

标签: unity3d unity5


【解决方案1】:

一旦你创建了完整的 prefab,每个 prefab 有 1 个 Animator,那么你可以使用下面的方法动态创建实例:

假设你有像这样的 CutsceneManager 脚本:

class CutsceneManager : MonoBehaviour {
    public GameObject InstantiateResource(string folder, string name)
    {
        GameObject resource = Instantiate<GameObject>(Resources.Load<GameObject>(folder + "/" + name));
        if (resource == null)
        {
            Debug.LogErrorFormat("Cannot find resource {0} in {1}", name, folder);
            return null;
        }
        resource.name = name;
        return resource;
    }        
}

使用它最简单的方法是将它附加到 Empty 对象上。然后您可以在其他脚本中为经理创建公共变量,您需要在其中显示过场动画,如下所示:

class SomeOtherScript : MonoBehaviour {
    public CutsceneManager CutsceneManager;
}

这将允许您将 CutsceneManager 空拖放到您需要的每个脚本中。这样一来,所有类都有 1 个过场动画管理器实例。

现在,您需要在需要播放 custscene 的地方进行实例化:

class SomeOtherScript : MonoBehaviour {
    public CutsceneManager CutsceneManager;

    public void PlayMyCutscene() {
        GameObject cutscene = CutsceneManager.InstantiateResource("Cutscenes", "SomeOtherCutscene");
        cutscene.setActive(true); // Or whetever other method to fire it off
    }
}

关于文件夹结构,您需要:Assets\Resources\Cutscenes

过场动画将被称为:SomeOtherCutscene.prefab

请注意,当您实例化一个 .prefab 时,无需包含 .prefab - Unity 框架会“知道”并为您添加它。

【讨论】:

  • 在哪里播放实际动画?说NPC1在我的世界里走来走去。但他也有2个过场动画。我是否会实例化一个新的 NPC1,然后只是播放过场动画,然后将其删除? (PS:所有预制件都应该保存在资源文件夹中吗?我只是将它们放在预制文件夹atm中,如果我需要一个脚本中的一个,我将它附加到编辑器中。)。
  • 这取决于你的过场动画是如何完成的。是否可以将现有的NPC1作为参数重新使用?
  • 目前我只是将一个动画师附加到 NPC1 并为每个过场动画创建一个动画。那么它会是 NPC1 我实例化并从中触发正确的动画吗?
  • 是的,我认为你可以这样做。
  • 我决定制作一个更通用的管理器,并将其附加到过场动画的实际触发器上。这是更多的代码,我需要遍历所有过场动画并找到正确的 Id 和相应的预制件。但是这样,预制件不必在场景中才能触发 cutScene :) 如果您有超过 20 种不同类型的预制件来存储 cutScene,则不会推荐它,但是代码太多并且 switch 语句很快就会变得混乱
猜你喜欢
  • 1970-01-01
  • 2020-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多