【解決】スキル実行前にアニメーションを再生するプラグイン

アバター
ムノクラ
記事: 2011
登録日時: 2018年2月23日(金) 11:41
連絡を取る:

【解決】スキル実行前にアニメーションを再生するプラグイン

投稿記事by ムノクラ » 2020年3月08日(日) 09:31

下記記事を作成する過程で、見つかっていないプラグインの作成を依頼したく思います。

戦闘カスタマイズ定番のYEP Battle Engine Coreを分解解説
https://fungamemake.com/archives/762

YEP Battle Engine Core では、アクターがスキル使用時に使用前に使用者に再生するアニメーション再生を指定できます。
YEP Battle Engine Core ではスキルの命中タイプで3つに分かれています。

必中
物理攻撃
魔法攻撃

これと似た機能として下記プラグインがありますが、同様のことを実現するスクリプトをコモンイベントに作るのが(初心者には)難しいです。

▼ 発動前コモン(やな様作)
https://plugin.fungamemake.com/archives/2033
スキルやアイテムの発動前に、スキルやアイテムに設定されたコモンイベントを発生させます。

これを簡易化・応用範囲を広げ、スキルにメモタグを入れて、発動前に使用者(アクターだけでなくバトラー)にアニメーションを再生する機能を希望いたします。

機能実装例
スキルのメモ欄に
<BeforeAnimation:1>
と書くと、そのスキルを使用する時にアニメーションID1が再生される。

アクター用と敵キャラ用のプラグインを分けたほうが技術的に望ましいのであれば、アクター用を希望いたします。
最後に編集したユーザー ムノクラ on 2020年3月18日(水) 22:49 [ 編集 1 回目 ]

---
JavaScriptの基本を学習せずにツクールのプラグインやスクリプトを使って横着してゲームを作ろうとしている人間です。
そのような者なので、適当な投稿をするかも知れません。
他の方の投稿を信用してください。
アバター
ムノクラ
記事: 2011
登録日時: 2018年2月23日(金) 11:41
連絡を取る:

Re: スキル実行前にアニメーションを再生するプラグイン

投稿記事by ムノクラ » 2020年3月12日(木) 23:38

下がってきてしまったので、上げておきます。

YEPと同じ3つだけの簡易な分類だけでも良いです。
目的は YEP Battle Engine Core を使う理由を1つでも減らす事が主眼なので…
---
JavaScriptの基本を学習せずにツクールのプラグインやスクリプトを使って横着してゲームを作ろうとしている人間です。
そのような者なので、適当な投稿をするかも知れません。
他の方の投稿を信用してください。
アバター
ムノクラ
記事: 2011
登録日時: 2018年2月23日(金) 11:41
連絡を取る:

Re: スキル実行前にアニメーションを再生するプラグイン

投稿記事by ムノクラ » 2020年3月15日(日) 23:20

まだ、簡易に設定できるプラグインは希望しております。


過去に試行錯誤をして、実現できなかった事が先程、自分なりに解決方法を掘り出したので、書き留めておきます。

▼ 発動前コモン(やな様作)
https://plugin.fungamemake.com/archives/2033
スキルやアイテムの発動前に、スキルやアイテムに設定されたコモンイベントを発生させます。

発動前コモンのデフォルトでは変数ID11に使用者のインデックスが入ります。
これを利用して下記のスクリプトをコモンイベントに入れます。

$gameParty.members()[$gameVariables.value(11)].startAnimation(51,false,0);

スキルのメモタグに下記を入れます。

<発動前コモン:x>
または、
<BeforeCommon:x>
xは上記のコモンイベントIDの数字に置き換えます。

これで、メモタグが入っているスキルを使うと、51番のアニメーションが使用アクターに再生されます。
※YEP Battle Engine Core より少し早いスタートになります。


ちなみに、今までこれが実現できなかったのは…自分のテストしているプロジェクトが破損していました。
再インストールし、新規プロジェクトで動作させたら動いたという顛末です…
---
JavaScriptの基本を学習せずにツクールのプラグインやスクリプトを使って横着してゲームを作ろうとしている人間です。
そのような者なので、適当な投稿をするかも知れません。
他の方の投稿を信用してください。
辛味噌
記事: 71
登録日時: 2016年10月02日(日) 23:33

Re: スキル実行前にアニメーションを再生するプラグイン

投稿記事by 辛味噌 » 2020年3月16日(月) 00:35

私もムノクラ様と全く同じことで悩んでます^^


ムノクラ様の方法、早速試してみたところ無事に起動しました!
敵が使用する場合にエラーが出てしまいましたが…

(あと、発動前コモンのアニメーションが終わるまでスキルアニメーションの再生をウェイトさせたかったのですが、ATBで単純にウェイトさせるとアクターコマンド閉じてしまったりして対処方法がわからなかったです泣)

引き続きWatchしていきたいと思いますm(_ _)m
アバター
ムノクラ
記事: 2011
登録日時: 2018年2月23日(金) 11:41
連絡を取る:

Re: スキル実行前にアニメーションを再生するプラグイン

投稿記事by ムノクラ » 2020年3月16日(月) 12:33

辛味噌 さんが書きました:私もムノクラ様と全く同じことで悩んでます^^


ムノクラ様の方法、早速試してみたところ無事に起動しました!
敵が使用する場合にエラーが出てしまいましたが…

(あと、発動前コモンのアニメーションが終わるまでスキルアニメーションの再生をウェイトさせたかったのですが、ATBで単純にウェイトさせるとアクターコマンド閉じてしまったりして対処方法がわからなかったです泣)

引き続きWatchしていきたいと思いますm(_ _)m


プラグインを作ってくださる方が出てきそうもないので、諦めて記事にしようか検討中です。
(なんか、このカテゴリに合ってない内容になってきた…)

取り急ぎ、発動前コモンで動かす形をお伝えします。

アクターに再生するスクリプトと敵キャラに再生するスクリプトとは全く異なります。
また、発動前コモンの仕様(行動前に実行…行動前コモンの方が実態に近いかも)から、使用スキル等を事前に取得して条件分岐することが出来ません。
※本当はできるのでしたら、どなたか、ご指導ください。

このため、アクターと敵キャラのスキルを別々に作成し、それぞれにコモンイベントを関連付ける(メモタグをつける)必要があります。

$gameVariables.value(11)は変数ID11の値を取得していますが、これは発動前コモンのデフォルトで、使用者のインデックスを代入しているので、そのまま使用しています。
プラグインパラメーターで別変数を指定した場合、IDに合わせて変更してください。
敵キャラのインデックスは発動前コモンの仕様でインデックスに1000足されるので、実行時に引いています。

再生後にウェイトを入れると、アニメーションの再生完了まで次の動作に進みません。
ウェイト0はスクリプトでないと指定できないので、入れてみましたが、どうでしょう?
ATBは全く分からないので、ご容赦のほど。
アクターはウェイトを1は入れないと歩きながらアニメーション再生されてしまいますね。

コモンイベント:アクターにアニメーションを再生(51は強化1)

コード: 全て選択

$gameParty.members()[$gameVariables.value(11)].startAnimation(51,false,0);
this.wait(1);


コモンイベント:敵キャラにアニメーションを再生(52は強化2)

コード: 全て選択

this.iterateEnemyIndex($gameVariables.value(11) - 1000, function(enemy) {
if (enemy.isAlive()) {
enemy.startAnimation(52, true, 0);
}
}.bind(this));
this.wait(0);



上記の通り、発動前コモンでYEP Battle Engine Core に近い(アニメーションのタイミングが合わせられない)動作をさせるには、下記の問題が残ります。

1.敵とアクターとで同じスキルであっても、別々に作成する必要がある。
2.発動前のため条件分岐する情報が得られず、全て別々のコモンイベントを作成する必要がある。

例えば、YEPでは必中、物理攻撃、魔法攻撃の直前にアニメーションが再生できるよう設定できますが、これを上記で組もうとすると、
1.コモンイベント6個
2.攻撃1つでもアクター用と敵用のスキルを別に作成
3.対象スキル全てにタグを設定
が必要になります。

というわけで、この煩雑な状況を打開できるプラグインを希望しております。
※発動前コモンで行動予定のスキル等の情報を得る方法でも構いません。

問題点
MOG Battler Motion で敵キャラのスキルにタグを付けている場合、上記で設定したアニメーションは再生されますが、MOG Battler Motion で指定した攻撃時動作を2回繰り返してしまうという不具合が見つかっています。
https://fungamemake.com/archives/5502
---
JavaScriptの基本を学習せずにツクールのプラグインやスクリプトを使って横着してゲームを作ろうとしている人間です。
そのような者なので、適当な投稿をするかも知れません。
他の方の投稿を信用してください。
アバター
ムノクラ
記事: 2011
登録日時: 2018年2月23日(金) 11:41
連絡を取る:

Re: スキル実行前にアニメーションを再生するプラグイン

投稿記事by ムノクラ » 2020年3月16日(月) 21:52

http://newrpg.seesaa.net/article/473606958.html#spell

で実現できるという情報をいただきました。
実験して使用方法が確立できましたら、この件は解決となります。

しばしお待ち下さい。
---
JavaScriptの基本を学習せずにツクールのプラグインやスクリプトを使って横着してゲームを作ろうとしている人間です。
そのような者なので、適当な投稿をするかも知れません。
他の方の投稿を信用してください。
アバター
うなぎおおとろ
記事: 60
登録日時: 2017年7月16日(日) 13:38

Re: スキル実行前にアニメーションを再生するプラグイン

投稿記事by うなぎおおとろ » 2020年3月16日(月) 22:11

試作品ですが...。
スキルのメモ欄に、
<BeforeAnimation id=スキルID>
と入力するとスキル発動前に使用者にアニメーションを表示します。
例えば、ファイアのスキル欄に<BeforeAnimation id=117>と記述すると、
ファイア発動前にアニメーション117を再生できます。

【BeforeAnimation.js】

コード: 全て選択

{
    Game_Item.prototype.beforeAnimationId = function() {
        if (this._beforeAnimationId === undefined) {
            const matchData = this.object().note.match(/<BeforeAnimation id=(\d+)>/);
            if (matchData) {
                this._beforeAnimationId = parseInt(matchData[1]);
            } else {
                this._beforeAnimationId = null;
            }
        }
        return this._beforeAnimationId;
    };

    Game_Action.prototype.beforeAnimationId = function() {
        return this._item.beforeAnimationId();
    };

    BattleManager.processTurn = function() {
        const subject = this._subject;
        const action = subject.currentAction();
        if (action) {
                if (action.beforeAnimationId() && !this._showbeforeAnimationFinish) {
                    this.startBeforeAnimation();
                    this._showbeforeAnimationFinish = true;
                } else {
                    action.prepare();
                    if (action.isValid()) {
                            this.startAction();
                    }
                    subject.removeCurrentAction();
                    this._showbeforeAnimationFinish = false;
                }
        } else {
                subject.onAllActionsEnd();
                this.refreshStatus();
                this._logWindow.displayAutoAffectedStatus(subject);
                this._logWindow.displayCurrentState(subject);
                this._logWindow.displayRegeneration(subject);
                this._subject = this.getNextSubject();
        }
    };

    Window_BattleLog.prototype.startBeforeAnimation = function(subject, action, targets) {
        this.push("showAnimation", subject, targets.clone(), action.beforeAnimationId());
        this.push("wait");
    };

    const _initMembers = BattleManager.initMembers;
    BattleManager.initMembers = function() {
        _initMembers.call(this);
        this._showbeforeAnimationFinish = false;
    };

    BattleManager.startBeforeAnimation = function() {
        const subject = this._subject;
        const action = subject.currentAction();
        const targets = [subject];
        this._logWindow.startBeforeAnimation(subject, action, targets);
    };

};

辛味噌
記事: 71
登録日時: 2016年10月02日(日) 23:33

Re: スキル実行前にアニメーションを再生するプラグイン

投稿記事by 辛味噌 » 2020年3月17日(火) 00:26

おお、なんか反響が…^^

>ムノクラ様

発動前コモンの件、アクター用とエネミー用と二重にスキル設定するのはなかなか大変ですね…
ウェイトかける方法、0でも1でも試してみましたが、やはりATBでは時間も停止してしまうようです。
アクターコマンド開いているときはウェイトのタイミングで閉じられちゃいます…

一方でご紹介いただいたNRP_DynamicAnimation.jsの件、少し弄ってみましたが
魔法発動(spell)という機能で確かに実現できそうです。
やってみたら発動前のアニメーションはいい感じにウェイトかかって動いたのですが、
代わりに本丸のアニメーションが消えてしまったので再度検証中です。
引き続き確認してみます。


>おおとろ様

なんと、わざわざ試作いただき有難うございます!
早速試してみたのですが、私の環境ではうまく稼働せず。。。
競合確認など十分できていないのですが、後日改めて試してみます!
辛味噌
記事: 71
登録日時: 2016年10月02日(日) 23:33

Re: スキル実行前にアニメーションを再生するプラグイン

投稿記事by 辛味噌 » 2020年3月17日(火) 01:18

NRP_DynamicAnimation.jsの件、メモタグを</D-Animation>で閉じてなかっただけでした…
引き続き検証してみます^^
アバター
ムノクラ
記事: 2011
登録日時: 2018年2月23日(金) 11:41
連絡を取る:

Re: スキル実行前にアニメーションを再生するプラグイン

投稿記事by ムノクラ » 2020年3月17日(火) 12:10

おおとろ さんが書きました:試作品ですが...。
スキルのメモ欄に、
<BeforeAnimation id=スキルID>
と入力するとスキル発動前に使用者にアニメーションを表示します。
例えば、ファイアのスキル欄に<BeforeAnimation id=117>と記述すると、
ファイア発動前にアニメーション117を再生できます。

【BeforeAnimation.js】

コード: 全て選択

{
    Game_Item.prototype.beforeAnimationId = function() {
        if (this._beforeAnimationId === undefined) {
            const matchData = this.object().note.match(/<BeforeAnimation id=(\d+)>/);
            if (matchData) {
                this._beforeAnimationId = parseInt(matchData[1]);
            } else {
                this._beforeAnimationId = null;
            }
        }
        return this._beforeAnimationId;
    };

    Game_Action.prototype.beforeAnimationId = function() {
        return this._item.beforeAnimationId();
    };

    BattleManager.processTurn = function() {
        const subject = this._subject;
        const action = subject.currentAction();
        if (action) {
                if (action.beforeAnimationId() && !this._showbeforeAnimationFinish) {
                    this.startBeforeAnimation();
                    this._showbeforeAnimationFinish = true;
                } else {
                    action.prepare();
                    if (action.isValid()) {
                            this.startAction();
                    }
                    subject.removeCurrentAction();
                    this._showbeforeAnimationFinish = false;
                }
        } else {
                subject.onAllActionsEnd();
                this.refreshStatus();
                this._logWindow.displayAutoAffectedStatus(subject);
                this._logWindow.displayCurrentState(subject);
                this._logWindow.displayRegeneration(subject);
                this._subject = this.getNextSubject();
        }
    };

    Window_BattleLog.prototype.startBeforeAnimation = function(subject, action, targets) {
        this.push("showAnimation", subject, targets.clone(), action.beforeAnimationId());
        this.push("wait");
    };

    const _initMembers = BattleManager.initMembers;
    BattleManager.initMembers = function() {
        _initMembers.call(this);
        this._showbeforeAnimationFinish = false;
    };

    BattleManager.startBeforeAnimation = function() {
        const subject = this._subject;
        const action = subject.currentAction();
        const targets = [subject];
        this._logWindow.startBeforeAnimation(subject, action, targets);
    };

};



試作いただき、ありがとうございます。

新規プロジェクトでテストした状態では、アクター・敵キャラとも共通のスキルを使用しても同じアニメーションを再生することが出来ました。

MOG_BattlerMotion と同時使用しても、問題は発生しませんでした。

追加希望してもよろしければ、
現状:アクター・敵キャラが前に出る前にアニメーションが再生される。
追加:アクター・敵キャラが前に出てから、アニメーションが再生される。
の両方を切り替えられるパラメーターがあったら嬉しいと思いました。

現状でも、最初の希望は十分に満たされています。
正式版の公開をお待ちいたします。
---
JavaScriptの基本を学習せずにツクールのプラグインやスクリプトを使って横着してゲームを作ろうとしている人間です。
そのような者なので、適当な投稿をするかも知れません。
他の方の投稿を信用してください。

“MV:プラグイン素材のリクエスト” へ戻る