今回はAltseedの音周りについて,自分で使いやすくしたクラスを作った話をします。最後にAlteedの現状の音周りAltseedの音周りでは,主にSoundクラスとSoundSourceクラスを使用します。SoundSourceクラスは読み込んだ音源を保管しておくクラスで,ループ地点などを設定できます。SoundクラスではSoundSourceクラスの音源を再生したり,音量を調整できたりします。音源を読み込んでSoundSourceクラスのインスタンスを生成するメソッドもあります。SoundクラスのPlayメソッドで音源を再生するときにIDが返り値で出されます。このIDを使うことで音量の設定や一時停止などをする事が出来ます。整理するとこんな感じになります。試しに作ってみました。名前適当とか言わないSoundPlusクラスで何をしているかコンストラクタでSoundSourceクラスの参照を受け取ります。asd.Sound.Playを実行されるときに返されるIDをフィールドに持ち,asd.SoundクラスにおけるIDが必要なメソッドの実行を代理でしてくれます。SoundクラスのGet...やSet...メソッドをプロパティにして扱いやすくしています。プロパティの中のSoundStateプロパティでは,音の再生状況を返します。型はSoundStateという独自の列挙体で,以下のようになっています。Stopped}ID管理のためにどうすればよいかIDは音量調整,再生速度変更,一時停止,再生再開,再生停止など様々なことに必要で,asd.Sound.Playメソッドを実行するたびに発行されます。そのため,クラスでIDを管理するとなると1インスタンスにつき1IDが妥当になり,過度な再生を抑止してIDを一意に保つ必要が出てきます。結果,Playメソッドを実行するときに再生中の時は例外を投げる処理にしました。Playメソッドとは別に,再生状況を無視して強制的に新たにIDを発行し再生するForceToPlayメソッドも作りました。Playを何回か行っても音量や再生速度,パン位置などのSoundクラスでのみ設定できる要素が継続できるように,プロパティをフィールドとしても保持しておき,Playした瞬間に設定しなおします(下記参照)。false;}プロパティで値をセットするときはArgumentOutOfRangeExceptionをボンボン投げるようになっています。オーバーしていたら最大値や最小値に丸めるという方法もありますが,そこらへんは実装側の性格次第か...?(このクラスではしょっちゅう例外ぶん投げる)実装内容SoundPlusクラスの実装はこんな感じです。ArgumentNullException(path)SoundSourceクラスの参照を持つため両方それに関係する実装です。isDecompress)を使ってSoundSourceのインスタンスを生成しています。InvalidOperationExcetion(音が再生中ではない)最後に取り敢えずID管理面倒くさい!ってことで実装してみました。今後のゲーム作りで活躍できるといいかなと言う感じです。ソースコードは私のgithubで申し訳程度に公開されているので見たければどうぞ。