Unity3d 统一-音频剪辑阵列的问题

Unity3d 统一-音频剪辑阵列的问题,unity3d,audioclip,Unity3d,Audioclip,我想在Unity中制作一个音频播放器。 我首先创建了一个ResourceManager,它有一个 音频剪辑[]阵列 使其显示在剪辑拖放框中 但是,我希望在ResourceManager中将AudioClip数组设置为静态,以便其他脚本(例如PlayPause.cs)可以通过函数调用静态访问片段。 但问题是,一旦我将剪辑设置为静态,对剪辑的拖放就会消失 有办法解决这个问题吗?还是有更好的设计模式?谢谢。你可以简单地做 公共类ResourceManager:MonoBehavior { ... //

我想在Unity中制作一个音频播放器。 我首先创建了一个ResourceManager,它有一个 音频剪辑[]阵列

使其显示在剪辑拖放框中

但是,我希望在ResourceManager中将AudioClip数组设置为静态,以便其他脚本(例如PlayPause.cs)可以通过函数调用静态访问片段。 但问题是,一旦我将剪辑设置为静态,对剪辑的拖放就会消失

有办法解决这个问题吗?还是有更好的设计模式?谢谢。

你可以简单地做

公共类ResourceManager:MonoBehavior { ... //这是督察室里的那个 //通常,我会将检查员保密,只提供公共访问 //如有需要,通过酒店 [SerializeField]私人音频剪辑[]剪辑; //这将被设置为唤醒,以从检查员那里获得 //readonly对于其他类,只有此类可以分配它 公共静态音频剪辑[]剪辑{get;private set;} 公众虚空觉醒 { 剪辑=剪辑; ... } } 建议的替代方案是使ResourceManager成为一个所谓的单例

公共类ResourceManager:MonoBehavior { //您可以在这里存储自己的实例引用 //并提供公共只读访问 公共静态资源管理器实例{get;private set;} [SerializeField]私人音频剪辑[]剪辑; 公共音频剪辑[]剪辑=>剪辑; ... 公众虚空觉醒 { //确保一次只存在一个实例 iInstance&&Instance!=此 { 破坏游戏对象; 回来 } _实例=此; //可选:切换场景时不要销毁此实例 //小心:确保这也适用于AudioSource实例! //现在,我假设它要么附着到这个对象,要么是一个子对象 //如果不是简单地执行相同的操作,也不要在其上加载DestroyonLoad DontDestroyOnLoad this.gameObject; ... } 公共无效加载剪辑 { audioSrc.clip=clips[trackNum]; } } 然后访问reasourcemanager.Instance.Clips

或者使用一个内置的替代单例的脚本,这样场景中的任何其他脚本实际上都可以简单地访问

FindObjectOfType.clips 你根本不需要改变什么

除非我说过我会成功的

[SerializeField]私人音频剪辑[]剪辑; 公共IReadonlyList剪辑=>剪辑;
当然,这取决于你想对剪辑做什么,但这样一来,数组就不能被任何其他脚本改变了

使MonoBehavior成为一个单例。什么是[SerializeField]呢?抱歉,我是C的新手:是Unity特有的属性,允许序列化Inspector中的show并将其保存在assets中的私有字段中;这是一个非常全面的答案!谢谢但是如果我对其中一个数组进行了更改,比如我想从中删除的Clip,那么这些更改是否也能反映到Clip中呢?它是非常相同的数组引用->任何更改都会影响这两个数组。。。除了最后一个例子,我使用了IReadonlyList。。没有其他人可以更改返回的只读集合中的任何内容
public class ResourceManager : MonoBehaviour
{
    public AudioSource audioSrc;
    public AudioClip[] clips;
    private int trackNum = 0;
    
    public void Awake()
    {
        audioSrc = GetComponent<AudioSource>();
        audioSrc.Stop();

    ...omitted...
        
    public void LoadClip()
    {
        audioSrc.clip = clips[trackNum];

    }
}