【问题标题】:Unity c# multiple functions share the same behavior?unity c# 多个函数共享相同的行为?
【发布时间】:2017-03-06 21:41:50
【问题描述】:

在我的游戏中,有很多地方需要在功能完成后播放音频,例如:

class Player{
    public AudioClip clip;
    void WalkToDestination()
    {
         //walk code here

         AudioManager.Play(clip);
    }
}

class GameManger{  
    public AudioClip clip;
    void AfterCompleteLevel()
    {
          //play level completion animation
           AudioManager.Play(clip);
    }
}

由于需要播放声音的功能太多了,每次都得加 public AduioSource clip进课堂,AudioManager.Play(clip);进正文,重复的工作太多了。 有什么好的设计模式吗?

【问题讨论】:

  • 这段代码甚至不应该编译。我认为你应该修改它以反映你现在所拥有的。

标签: c# design-patterns unity3d


【解决方案1】:

定义一个基类,并在其中放入共享函数:

public class PlayerBase 
{
     protected SomeClass clip;
     public void PlaySound()
     {
         AudioManager.Play(clip);
     }
}

class Player : PlayerBase {}
class GameManger : PlayerBase {}

直接在派生的PlayerGameManager 类中调用PlaySound()

【讨论】:

  • 是的,这是一个解决方案,但我觉得它们不太相似,唯一相似的行为是播放音乐
【解决方案2】:

您可能正在寻找的是 Singleton :它们在使用音频管理器或类似的东西时非常有用。

你可以这样声明:

public class YourClassName: MonoBehaviour
{
    public static YourClassName instance;

    public void Awake()
    {
        if (!instance)
        {
            instance = this;
        }
    }

    public void YourMethodToCall()
    {
        //Do what you want here
    }
}

然后你可以从另一个脚本访问它:

if (YourClassName.instance)
{
    YourClassName.instance.YourMethodToCall();
}

【讨论】:

  • 最好有一个“预加载”场景并在那里加载音频管理器,而不是单例类。您删除静态实例,而是使用Object.FindObjectOfType<YourClassName>();。有关如何执行此操作的完整说明,请参阅this answer
  • @ScottChamberlain 同意这是另一种方式:我个人“总是”使用一种预加载场景(通常包含自定义启动画面、介绍视频等)来设置我所有的经理:)
  • 预加载场景不应该是闪屏恕我直言。您希望它在调试时也能快速运行,如果您将其设置为启动画面,那么您必须等待启动画面加载,然后才能每次调试。
  • @ScottChamberlain 这就是为什么在每一个执行不必要(对于游戏)长动作(例如视频播放)的脚本上,使用像 DEBUG 这样的定义符号可以轻松快速调试,无需在最终构建之前恢复所有内容;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-17
  • 2020-06-16
  • 1970-01-01
相关资源
最近更新 更多