質問するログイン新規登録
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

2回答

524閲覧

thisがインスタンスか否か

kotowari_yasusi

総合スコア17

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2018/09/23 09:22

編集2018/09/23 09:28

0

0

前提・実現したいこと

こちらのサイト
https://qiita.com/kenta71/items/1d108e2f329f19077853

のソースコードをコピペしたところうまくいきませんでした。
こちらに沿ってSEを鳴らしたいです。

よろしければunityでのthis,null,インスタンスなど理解の助けとなるサイトなどありましたら教えてください。

発生している問題・エラーメッセージ

Debug.Logでいろいろやったところ、
どうやらAwakeのif文でthisがInstanceでないということみたいでした。
ifの中のreturnはAwakeを終わる、という認識でいいのでしょうか。

該当のソースコード

lang

1 2 3~中略~ 4 public static AudioManager Instance = null; 5 6 //================================================================================= 7 //初期化 8 //================================================================================= 9 10 private void Awake () 11 { 12 if (this != Instance) { 13 Destroy (this); 14 return; 15 } 16~後略~ 17

試したこと

Debug.Logでいろいろと試しました。
Singletonとやらも必要だったみたいでそれを記述して
SingletonMonoBehaviour.csというスクリプトにしました。
一番最初のclass宣言で
AudioManager:AudioManagerとしたらエラーが返ってきたので
AudioManager:SingletonMonoBehavior<AudioManager>
と書き替え、エラーはなくなりました。

補足情報(FW/ツールのバージョンなど)

unity 2018.1.0f2
VisualStudio2017

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

どうやらAwakeのif文でthisがInstanceでないということみたいでした。

thisは自身のインスタンスを指します。
よって、thisがインスタンスでは無いということはありません。
ただし、インスタンスは複数存在できるので、thisのインスタンスとInstanceのインスタンスが異なることはありえます。

この場合、すでに別のAudioManagerのインスタンスが存在している場合、AudioManagerが2つになってしまうので、古い方を残して新しい方を削除するという意味で書いたのだと思います。
ただ、このソースだと、Instanceがnullの時でも削除されてしまいそうな気がしますし、そもそもInstanceを代入している箇所もありませんでした。
元のソースではSingletonMonoBehaviourを使っているので、Instanceはそこで定義されているのでしょう。

AudioManager:AudioManagerとしたらエラーが返ってきたので

ClassA:ClassBと書いた場合、「ClassBを継承したClassA」という意味になります。
AudioManager:AudioManagerと書くと、元のAudioManagerはありませんので当然エラーになります。

結局のところ、その記事のソース自体がおかしいので、元のソースを使うのがよろしいかと思います。

投稿2018/09/23 10:14

fiveHundred

総合スコア10480

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kotowari_yasusi

2018/09/23 11:50

時間を空けずに回答ありがとうございます。 元のソースをコピペしただけでは新たにエラーが発生したので、その対処策を書いておきます。 本の記事「僕が考えたさいきょうのAudioManager2」 http://kan-kikuchi.hatenablog.com/entry/AudioManager2 のコードすべてではなく 最初の using UnityEngine; から Awake()の終わりの "}"  までを https://qiita.com/kenta71/items/1d108e2f329f19077853 のソースの該当箇所に置き換えればよいようです。 VisualStudio側に警告CS0114が出ますが、実行には今のところ問題ありません。 また、Awake()内でAudioListenerコンポーネントを生成しており、実行時、シーン内のAudioListenerコンポーネントは1つだけにしろというDebugがものすごい勢いで増えました。 (メインカメラには元からAudioListenerが付いている) ※実行には今のところ影響はありません なので、カメラのAudioListenerを外すか、スクリプトのその部分を外すかしたほうがよいようです。
guest

0

下でコメントしたことをこっちにも書いておきます(こっちの方が読みやすいかな)
元のソースをコピペしただけでは新たにエラーが発生したので、その対処策を書いておきます。
元の記事「僕が考えたさいきょうのAudioManager2」
http://kan-kikuchi.hatenablog.com/entry/AudioManager2
のコードすべてではなく
最初の

lang

1using UnityEngine; //から 2 3 4 5//~略~ 6 7 private void Awake () 8 { 9 //~略~ 10 }//Awakeの終わりまで 11

lang

1using UnityEngine; 2using System.Collections; 3using System.Collections.Generic; 4 5/// <summary> 6/// BGMとSEの管理をするマネージャ。シングルトン。 7/// </summary> 8public class AudioManager : SingletonMonoBehaviour<AudioManager> 9{ 10 //ボリューム保存用のkeyとデフォルト値 11 private const string BGM_VOLUME_KEY = "BGM_VOLUME_KEY"; 12 private const string SE_VOLUME_KEY = "SE_VOLUME_KEY"; 13 private const float BGM_VOLUME_DEFULT = 1.0f; 14 private const float SE_VOLUME_DEFULT = 1.0f; 15 16 17 //オーディオファイルのパス 18 private const string BGM_PATH = "Audio/BGM"; 19 private const string SE_PATH = "Audio/SE"; 20 21 22 //BGMがフェードするのにかかる時間 23 public const float BGM_FADE_SPEED_RATE_HIGH = 0.9f; 24 public const float BGM_FADE_SPEED_RATE_LOW = 0.3f; 25 private float _bgmFadeSpeedRate = BGM_FADE_SPEED_RATE_HIGH; 26 27 //次流すBGM名、SE名 28 private string _nextBGMName; 29 private string _nextSEName; 30 31 //BGMをフェードアウト中か 32 private bool _isFadeOut = false; 33 34 //BGM用、SE用に分けてオーディオソースを持つ 35 private AudioSource _bgmSource; 36 private List<AudioSource> _seSourceList; 37 private const int SE_SOURCE_NUM = 10; 38 39 //全AudioClipを保持 40 private Dictionary<string, AudioClip> _bgmDic, _seDic; 41 42 43 //================================================================================= 44 //初期化 45 //================================================================================= 46 47 private void Awake () 48 { 49 if (this != Instance) { 50 Destroy (this); 51 return; 52 }

と置き換えればよいようです。
VisualStudio側に警告CS0114が出ますが、実行には今のところ問題ありません。
また、Awake()内でAudioListenerコンポーネントを生成しており、実行時、シーン内のAudioListenerコンポーネントは1つだけにしろというDebugがものすごい勢いで増えました。
(シーン作成時のメインカメラには元からAudioListenerが付いている)
※実行には今のところ影響はありません
なので、カメラのAudioListenerを外すか、スクリプトのその部分を外すかしたほうがよいようです。
シングルトンに関しては自分もよくわかってないのでご自分で調べてください。

投稿2018/09/23 12:01

編集2018/09/25 07:59
kotowari_yasusi

総合スコア17

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.30%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問