Une référence d'objet est requise pour accéder à un non-membre statique
Je vais avoir cette erreur d'arriver et je ne sais pas pourquoi... j'ai essayé de le chercher, les gens sont en train de créer un objet de la classe ou de créer les méthodes statiques... mais je ne suis pas sûr de savoir comment.
Voici mon code ci-dessous:
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);
}
}
}
Quelle ligne avez-vous l'erreur?
La boucle foreach
playSound est une méthode statique dans votre classe, mais vous faites référence à des membres comme
Vous avez besoin de faire audiosounds statique, ou playsound pas statique.
Ou la passer en paramètre lorsque vous appelez la méthode.
La boucle foreach
playSound est une méthode statique dans votre classe, mais vous faites référence à des membres comme
audioSounds
ou minTime
qui ne sont pas déclarées static
donc ils nécessitent une SoundManager sm = new SoundManager();
de fonctionner comme sm.audioSounds
Vous avez besoin de faire audiosounds statique, ou playsound pas statique.
Ou la passer en paramètre lorsque vous appelez la méthode.
OriginalL'auteur James Eaton | 2014-05-15
Vous devez vous connecter pour publier un commentaire.
Vous devriez faire de votre audioSounds et minTime membres statiques:
Mais je voudrais envisager d'utiliser des objets singleton au lieu de la statique des membres à la place:
minTime
.non seulement audioSounds, aussi minTime
My bad, de l'ajouter à la réponse.
Hm, est-ce juste moi ou vous manque l'appel du constructeur
new SoundManager()
? Même un singleton a besoin d'un (seul) appel au constructeurC'est Unity3d détails: MonoBehaviors ne devrait pas être créée avec
new
opérateur; je préfère laisser une instance de SoundManager visible dans la scène initiale.OriginalL'auteur Max Yankov
Je devine que vous obtenez le message d'erreur sur l'accès à l'
audioSounds
etminTime
, droit?Le problème est que vous ne pouvez pas accéder à
instance members
destatic methods
. Ce que cela signifie, c'est que, d'une méthode statique est une méthode qui existe qu'une seule fois et peut être utilisé par tous les autres objets (si c'est modificateur d'accès le permet).Les membres de l'Instance, d'autre part, sont créés pour chaque instance de l'objet. Donc, si vous créez dix cas, comment serait le moteur d'exécution de savoir qui, de toutes ces instances, qui
audioSounds
liste de elle devrait accès?Comme les autres ont dit, faire de votre
audioSounds
etminTime
statique, ou vous pourriez faire votre méthode une méthode d'instance, si votre conception le permet.minTime
Je vous remercie. Mise à jour de ma réponse.
OriginalL'auteur cr4ne
playSound est une méthode statique de sens, il existe lorsque le programme est chargé.
audioSounds et minTime sont SoundManager variable d'instance, ce qui signifie qu'ils existent au sein d'une instance de SoundManager.
Vous n'avez pas créé une instance de SoundManager donc audioSounds n'existe pas (ou qu'il fait, mais vous n'avez pas une référence à un SoundManager objet pour le voir).
Pour résoudre votre problème, vous pouvez soit faire audioSounds statique:
de sorte qu'ils seront créés et peuvent être référencés dans la même manière que PlaySound sera.
Sinon, vous pouvez créer une instance de SoundManager de l'intérieur de votre méthode:
minTime
... comme mentionné à plusieurs reprises dans les autres réponsesstatic class
n'est pas possible, car elle viole le polymorphisme ... une classe statique ne peut pas dériver d'une classe de base (autres que de l'objet)Vous avez raison, j'ai totalement raté ces, il est un peu tard pour moi. La réponse a été mis à jour
OriginalL'auteur RossBille
playSound est une méthode statique dans votre classe, mais vous faites référence à des membres comme
audioSounds
ouminTime
qui ne sont pas déclaréesstatic
de sorte qu'ils nécessitent uneSoundManager sm = new SoundManager();
de fonctionner commesm.audioSounds
ousm.minTime
respectivementSolution:
Non, les classes statiques ne peuvent dériver de
object
. L'exemple de la classe doit dériver d'une autre classe appeléeMonoBehaviour
Je n'ai pas remarqué
OriginalL'auteur devnull69
Faire de votre
audioSounds
etminTime
variables comme des variables statiques, comme vous vous en servez dans une méthode statique (playSound
).Marquage d'une méthode comme
static
empêche l'utilisation de la non-statique (par exemple) que les membres de cette méthode.À comprendre plus , veuillez lire ce DONC QA:
Mot-clé Static en c#
Merci @devnull69, mise à jour de la réponse..
OriginalL'auteur VS1