web-dev-qa-db-ja.com

非静的メンバーにアクセスするには、オブジェクト参照が必要です

私はこのエラーが発生していますが、なぜ...私はそれを調べようとしましたが、人々はクラスのオブジェクトを作成するか、メソッドを静的として作成するように言っています...しかし私は方法がわからない。

以下は私のコードです:

public class SoundManager : MonoBehaviour {

public List<AudioSource> audioSounds = new List<AudioSource>();
public double minTime = 0.5;

public static void playSound(AudioClip sourceSound, Vector3 objectPosition, int volume, float audioPitch, int dopplerLevel)
{
    bool playsound = false;
    foreach (AudioSource sound in audioSounds) // Loop through List with foreach
    {
        if (sourceSound.name != sound.name && sound.time <= minTime)
        {
            playsound = true;
        }
    }

    if(playsound) {
        AudioSource.PlayClipAtPoint(sourceSound, objectPosition);
    }
}
}
21
James Eaton

AudioSoundsおよびminTimeメンバーを静的にする必要があります。

public static List<AudioSource> audioSounds = new List<AudioSource>();
public static double minTime = 0.5;

しかし、代わりに静的メンバーの代わりにシングルトンオブジェクトの使用を検討します。

public class SoundManager : MonoBehaviour
{

    public List<AudioSource> audioSounds = new List<AudioSource>();
    public double minTime = 0.5;

    public static SoundManager Instance { get; private set; }

    void Awake()
    {
        Instance = this;
    }

    public void playSound(AudioClip sourceSound, Vector3 objectPosition, int volume, float audioPitch, int dopplerLevel)
    {    
        bool playsound = false;
        foreach (AudioSource sound in audioSounds) // Loop through List with foreach
        {  
            if (sourceSound.name != sound.name && sound.time <= minTime)
            {
                playsound = true;
            }
        }

        if(playsound) {
            AudioSource.PlayClipAtPoint(sourceSound, objectPosition);
        }

    }
}
32
Max Yankov

audioSoundsminTimeにアクセスするとエラーが発生すると思いますよね?

問題は、instance membersからstatic methodsにアクセスできないことです。これが意味することは、静的メソッドは一度だけ存在し、他のすべてのオブジェクトで使用できるメソッドであることです(アクセス修飾子が許可する場合)。

一方、インスタンスメンバーは作成されますオブジェクトのすべてのインスタンスに対して。 10個のインスタンスを作成した場合、ランタイムはこれらすべてのインスタンスからどのaudioSoundsリストにアクセスする必要があるかをどのように知るのでしょうか?

他の人が言ったように、audioSoundsminTimeを静的にするか、設計で許可されている場合は、メソッドをインスタンスメソッドにすることもできます。

7
ath

playSoundは静的メソッドであり、プログラムのロード時に存在します。 audioSoundsとminTimeはSoundManagerインスタンス変数です。つまり、SoundManagerのインスタンス内に存在します。 SoundManagerのインスタンスを作成していないため、audioSoundsは存在しません(または存在しますが、それを確認するSoundManagerオブジェクトへの参照がありません)。

問題を解決するには、audioSoundsを静的にすることができます:

public static List<AudioSource> audioSounds = new List<AudioSource>();
public static double minTime = 0.5;

そのため、PlaySoundと同じ方法で作成され、参照される場合があります。または、メソッド内からSoundManagerのインスタンスを作成できます:

SoundManager soundManager = new SoundManager();
foreach (AudioSource sound in soundManager.audioSounds) // Loop through List with foreach
{
    if (sourceSound.name != sound.name && sound.time <= soundManager.minTime)
    {
        playsound = true;
    }
}
3
RossBille

playSoundはクラスの静的メソッドですが、audioSoundsminTimeのような、staticとして宣言されていないメンバーを参照しているため、SoundManager sm = new SoundManager();が必要になります。 sm.audioSounds または sm.minTimeそれぞれ

解決:

public static List<AudioSource> audioSounds = new List<AudioSource>();
public static double minTime = 0.5;
2
devnull69

audioSoundsおよびminTime変数を静的メソッド(playSound)で使用しているので、それらを静的変数として作成します。

メソッドをstaticとしてマークすると、そのメソッドで非静的(インスタンス)メンバーが使用されなくなります。

詳細については、こちらをご覧くださいSO QA:

c#の静的キーワード

1
VS1