見出し画像

メニュー画面でもアイテム/スキルごとに設定したSEを鳴らす

そのままだとシステム1で設定した音しか出ない

ホイミとかトヘロスとかメニュー画面で使ったら呪文の音が鳴ってほしいじゃないですか。なのでつくりました。

スクリーンショット 2021-07-30 16.01.46

特に設定やプラグインコマンドはありません。

スクリーンショット 2021-07-30 16.01.19

メモ欄にああいうふうに

<SE:ファイル名|ボリューム|ピッチ,ファイル名|ボリューム|ピッチ...>

というふうに書くと、メニュー画面でアイテムやスキルをつかったときに設定した音が鳴ります。

簡単に実装の解説

備忘録として今回も実装の解説を一応。とはいってもこれは特に難しいところはなくて、Scene_Item.playSeForItem あるいは Scene_Skill.playSeForItem のもともとの処理の後に、アイテム/スキルのメモ欄を読んでそのとおりのSEを鳴らすように書けばいいだけです。

const _Scene_Skill_playSeForItem = Scene_Skill.prototype.playSeForItem;
Scene_Skill.prototype.playSeForItem = function() {
   _Scene_Skill_playSeForItem.call(this);
   if (!SceneManager.isSceneBattle()) {
       let skill;
       if (DataManager.isSkill(this.item())) {
           skill = $dataSkills[this.item().id];
       }
       if (skill) {
           playAdditionalSe(skill);
       }
   }
};

スキルの場合でも playSeFor <Item> なのがちょっと「ウッ」となりますね。

あとは DataManager.isItem とか DataManager.isSkill でそのデータがアイテムなのかスキルなのか識別できるのは今後もけっこう使いそうです。CSVN_fastTravel.js もそれでできたんかなぁ。まぁええけど。

あと SceneManager.isSceneBattle はここで書いたもので、コンストラクタの型比較をしていま戦闘中かどうかの判別をしています。いまどのシーンなのかが SceneManager 内では this._scene でとれるというのは知っておくといいかもしれませんね。

SceneManager.isSceneBattle = function() {
    return this._scene.constructor === Scene_Battle;
};

あぁ、メモ欄を読むサンプルコードなんかもあんまりのせてる人いない気がするので書いておきます。

function playAdditionalSe(item) {
   if (item.meta.SE) {
       const ses = item.meta.SE.split(',');
       let tmp, file, volume, pitch;
       for(const se of ses) {
           tmp = se.split('|');
           file = tmp[0];
           volume = tmp[1];
           pitch = tmp[2];
           AudioManager.playStaticSe({
               name: file,
               volume: volume,
               pitch: pitch,
           });
       }
   }
}

PluginCommonBase がないと動作しませんが、データに対して meta というプロパティができていて簡単にデータが取れます。これも頻出テクっぽいですね。

ダウンロードはこちら

CSVN_playSeForItemEx.js
※右クリックでDL。

ほかにつくったやつはこちら

cursed-steven/rmmz: RPGツクールMZ用のプラグインスクリプトをおいていきます。

この記事が気に入ったらサポートをしてみませんか?