Unity 2D:简单的过场动画 system/manager
Unity 2D: Simple Cutscene animation system/manager
我正在努力想出一种巧妙的方法来处理我的 2D 游戏中的过场动画。我想我已经决定 Create/Control 使用 Animator
过场动画,并移动实际的游戏对象。
我正在苦苦挣扎的是:
这种方法意味着每个 GameObject
都需要自己的 Animator
。那么我该如何触发正确的过场动画呢?我将使用游戏阶段来控制游戏及其进度,例如:
if(gameStage == 34 && entering scene castle)
{
playCorrectCutscene();
}
我如何以及在哪里保留对我所有过场动画的引用?假设我在一个场景中有 22 个 NPC,其中 15 个有自己的 Animator
因为他们有过场动画,我该如何播放来自 NPC_11 的动画?
我想我要找的是某种 "Cutscene Manager"。最好的解决方案是为每个带有 ID 的过场动画(动画)制作一个 List
。然后我可以只使用 ID 来播放正确的动画。但是由于每个动画都存储在实际的 GameObject
中,我不知道这是否可能。
希望我说得有道理。
一旦你创建了完整的预制件,每个预制件有 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;
}
}
最简单的使用方法是将它附加到空对象上。然后你可以在其他脚本中为经理创建 public 变量,你需要在其中显示过场动画,如下所示:
class SomeOtherScript : MonoBehaviour {
public CutsceneManager CutsceneManager;
}
这样您就可以将空的 CutsceneManager 拖放到每个脚本中您需要的地方。这样你就有了所有 类.
的 1 个 cutscenemanager 实例
现在,在你需要播放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 - Unity 框架会 "know" 并为您添加它。
我正在努力想出一种巧妙的方法来处理我的 2D 游戏中的过场动画。我想我已经决定 Create/Control 使用 Animator
过场动画,并移动实际的游戏对象。
我正在苦苦挣扎的是:
这种方法意味着每个 GameObject
都需要自己的 Animator
。那么我该如何触发正确的过场动画呢?我将使用游戏阶段来控制游戏及其进度,例如:
if(gameStage == 34 && entering scene castle)
{
playCorrectCutscene();
}
我如何以及在哪里保留对我所有过场动画的引用?假设我在一个场景中有 22 个 NPC,其中 15 个有自己的 Animator
因为他们有过场动画,我该如何播放来自 NPC_11 的动画?
我想我要找的是某种 "Cutscene Manager"。最好的解决方案是为每个带有 ID 的过场动画(动画)制作一个 List
。然后我可以只使用 ID 来播放正确的动画。但是由于每个动画都存储在实际的 GameObject
中,我不知道这是否可能。
希望我说得有道理。
一旦你创建了完整的预制件,每个预制件有 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;
}
}
最简单的使用方法是将它附加到空对象上。然后你可以在其他脚本中为经理创建 public 变量,你需要在其中显示过场动画,如下所示:
class SomeOtherScript : MonoBehaviour {
public CutsceneManager CutsceneManager;
}
这样您就可以将空的 CutsceneManager 拖放到每个脚本中您需要的地方。这样你就有了所有 类.
的 1 个 cutscenemanager 实例现在,在你需要播放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 - Unity 框架会 "know" 并为您添加它。