個人的な記録

sou_sitaku

ユーザー
キャラクター作成ジェネレータをよく使うので、この際、公式で出されている素材を全部買って、全部投入した。
すると画像ファイルが上書きされたのか、顔グラとSVキャラクターが食い違って表示されてしまった。
原因を調べたところ「ファンタジージェネレーター - 防具パーツセット」に原因があるらしく、
ファイル名から読み取られる番号が重なっているらしかった。
そのため、次のような対策を取った。

1)「Generator」フォルダの初期化のため、一旦、RPGツクールMZをアンインストール→再インストール。(この際後付けのファイルが残るので、「RPGMZ」フォルダ内は主導ですべて削除して空にする)

2)「ファンタジージェネレーター - 防具パーツセット」の画像ファイル名の「icon_Clothing_p55.png」などのファイル名をすべて「icon_Clothing_p555.png」という風に番号に500足す形ですべて変更。

3)改めて購入したジェネレータ素材集をすべて適用する。

今のところ、これで不具合はなくなったと思われる。
 
SVキャラ同士を戦わせるプラグインを探していたが結局、このスレッドを参考に「VisuStella」というプラグインシリーズを考えている。
やりたいことが大体できているが、敵SVキャラは基本的に武器が「素手」で表示されてしまうのが課題。
 
標的となるキャラクターを狙撃するイベントを考えてみた。
1714694419576.png

【狙撃ポイントのイベント】
・透明画像で、プライオリティは「通常キャラの下」、トリガーは「決定ボタン」
・スクリプト「$gameMap.event(①).x == ④ && $gameMap.event(②).y == ⑤」
 ・「$gameMap.event(13).x == 18 && $gameMap.event(13).y == 10」
  の意図するところとしては「イベント番号013のイベントが(18,10)の座標に来ているかどうか
  という条件。
 ・①と②はイベント番号を入れるのだけど表示が「013」でもその通りに入れるとうまくいかない。
  「13」と入れる。
 ・④と⑤はマップのX座標、Y座標を入れる。マップの左上隅が(x,y)=(0,0)。
  作成画面の右下あたりに表示されているのでそれ見て設定するのが楽。

◆アニメーションの表示:【照準イベント】, 銃撃/単発
◆条件分岐:スクリプト:$gameMap.event(13).x == 18 && $gameMap.event(13).y == 10
■当たった時の処理

:それ以外のとき
■外れたときの処理

:分岐終了

【照準イベント】
・透明でプライオリティが「下」
・あとは特になし。

【標的イベント】
・自立移動を「カスタム」とし、適当なルートを設定する。(照準ルートを必ず通るようにする)
・【照準イベント】で当たった時のイベントのスイッチで銃撃で倒れた後の画像に切り替える。
 
「キャラクターが倒れる」という表現を移動ルートの画像変更でしたい場合のメモ。

移動ルートの「画像の変更」でホコグラを設定する場合、スクリプトを使わなければピンポイントな画像に変更することができない。
この画像の変更を行った場合は
「キャラクターの向き」で縦方向の、
スクリプトによるID指定で横方向の画像を指定することができる。

1714697930975.png
 
上記の「標的となるキャラクターを狙撃するイベント」には穴があった。
標的イベントや照準イベントは、単なる指定するためのイベントで中身はほぼ空。

だいたいは「狙撃ポイント」のイベントで、標的との会話などを表現するんだが、もちろん標的と話している間や標的を撃った時には、標的には動いてほしくない。
でも上記のイベント設定だと、「標的」の移動ルート設定が生きていて、イベントの間中も動き回ってしまう。
狙撃して、倒れた姿勢でも自律歩行ルート通りに動いてしまうのだからお粗末すぎる。

それでも上記の時点でうまくいって見えていたのは「VisuStella」シリーズのプラグインのうち、「EventMoveCore」というプラグインのおかげだったらしい(後で気付いた)。
「イベントをやっている間、自動的な動きは止める」
「会話の間は、自動的な動きは止める」みたいな項目があり。それが上手く働いていたようだ。

よー考えてみたら、会話イベントは顔を出しているだけでイベントも指定していないのに、移動が止まるなんてプラグインなしだとおかしい話だったんだな。

実は「VisuStella」はいろいろ不都合が見えてきて、採用を諦めようとしているので頭が痛い。「EventMoveCore」だけでも採用しようか。
しかしそれはそれで、影響が大きすぎて他のイベントの妨げになりそうな気もする。
 
『「VisuStella」はいろいろ不都合が見えてきて』の部分について。

VisuStella」と多言語対応で使っている「chimaki-lang」との相性です。ほかの部分だと気にならないのだけど、戦闘画面だとこの通り。全く対応しているとはいえない。
VisuStella」はスクリプトを覗いてみたけど、とても作者じゃない人がいじれる可読性がない。
VisuStella」を諦めるか、「chimaki-lang」を諦めるかの二者択一。多言語対応はしたいので、バトルシステムについては「VisuStella」を諦める方向になりそう。

↑の方で検討していた「SVキャラ同士を戦わせるプラグイン」は「VisuStella」以外はMZに対応してないらしい(一応試したけど必ずどこかでつまずく)ので、戦闘システムついては別途アイデアを考えるしかないかと思っている。

1715261809140.png
 
SVキャラ同士を戦わせるプラグインを探していたが結局、このスレッドを参考に「VisuStella」というプラグインシリーズを考えている。
やりたいことが大体できているが、敵SVキャラは基本的に武器が「素手」で表示されてしまうのが課題。
ちなみにこの「素手」で表示されてしまうのが課題については個人的には回答を出した。
(といっても方向性だけ)

エネミーキャラは装備を「素手」に設定されてるらしく、下記の『[SV]攻撃モーション』項目の「素手」を参照してモーションや画像が設定されているため、このモーションや画像を変更すれば、「VisuStella」のバトルシステムでエネミーに剣を振らせたりすることは可能。これはこの項目で変更してみて確かめた。
この素手のモーションや画像を変更できるスクリプトはそんなに難しくないと思うので、バトル内イベントの冒頭でそのスクリプトを実行するようにすればエネミーごとに違う武器を持たせるとかもできるのではないか、と思います。

1715262328311.png
 
会話中(イベント中)に自律移動を止めてくれない」件については解決した。

要するに、離れているからと言って、足元のイベント(狙撃ポイント)でイベント処理をしなければいい。

【狙撃ポイント】のイベントではスクリプトを使って、スイッチ(セルフスイッチ)を入れるだけ。
処理は【標的】のイベント内で行う。条件をスイッチを指定し、トリガーを「自動実行」にしておけば、スイッチを入れれば普通に話しかけたときみたいに、自律移動を止めてくれるということ。

1715433921561.png
 
離れたイベントのセルフスイッチを分岐条件にするときのスクリプト。
$gameSelfSwitches.value([this._mapId,this._eventId,"A or B or C or D"])==true
 
自律移動でカスタムルートを設定していると、イベントを起こした段階でリセットされるらしく、想定した範囲外のところまで歩いて行ってしまうことがある。
そこで、スクリプトで条件を設定し、今イベントがいる位置で判定してどこに歩くか決めるスクリプトがこちら。

JavaScript:
if($gameMap.event(13).x == 21 && $gameMap.event(13).direction() == 6){$gameMap.event(13).turn180()}
if($gameMap.event(13).x == 21 && $gameMap.event(13).direction() == 4){$gameMap.event(13).moveForward()}
if($gameMap.event(13).x == 21 && $gameMap.event(13).direction() == 2){$gameMap.event(13).turnRight90()}
if($gameMap.event(13).x == 20 && $gameMap.event(13).direction() == 6){$gameMap.event(13).moveForward()}
if($gameMap.event(13).x == 20 && $gameMap.event(13).direction() == 4){$gameMap.event(13).moveForward()} 
if($gameMap.event(13).x == 20 && $gameMap.event(13).direction() == 2){$gameMap.event(13).turnLeft90()}
if($gameMap.event(13).x == 19 && $gameMap.event(13).direction() == 6){$gameMap.event(13).moveForward()}
if($gameMap.event(13).x == 19 && $gameMap.event(13).direction() == 4){$gameMap.event(13).moveForward()} 
if($gameMap.event(13).x == 19 && $gameMap.event(13).direction() == 2){$gameMap.event(13).turnLeft90()}
if($gameMap.event(13).x == 18 && $gameMap.event(13).direction() == 6){$gameMap.event(13).moveForward()}
if($gameMap.event(13).x == 18 && $gameMap.event(13).direction() == 4){$gameMap.event(13).moveForward()}
if($gameMap.event(13).x == 18 && $gameMap.event(13).direction() == 2){$gameMap.event(13).turnRight90()}
if($gameMap.event(13).x == 17 && $gameMap.event(13).direction() == 4){$gameMap.event(13).moveForward()} 
if($gameMap.event(13).x == 17 && $gameMap.event(13).direction() == 6){$gameMap.event(13).moveForward()}  
if($gameMap.event(13).x == 17 && $gameMap.event(13).direction() == 2){$gameMap.event(13).turnRight90()}
if($gameMap.event(13).x == 16 && $gameMap.event(13).direction() == 4){$gameMap.event(13).moveForward()}
if($gameMap.event(13).x == 16 && $gameMap.event(13).direction() == 6){$gameMap.event(13).moveForward()} 
if($gameMap.event(13).x == 16 && $gameMap.event(13).direction() == 2){$gameMap.event(13).turnRight90()}
if($gameMap.event(13).x == 15 && $gameMap.event(13).direction() == 4){$gameMap.event(13).turn180()}
if($gameMap.event(13).x == 15 && $gameMap.event(13).direction() == 6){$gameMap.event(13).moveForward()}
if($gameMap.event(13).x == 15 && $gameMap.event(13).direction() == 2){$gameMap.event(13).turnLeft90()}

設定としてはイベントID(13)(x=18,y=10)のキャラクターがx=15~21の間を水平方向にうろうろさせたい。
そのため、
・x=18で、下を向いている($gameMap.event(13).direction() == 2)とき、「右に90度ターンさせる(左を向かせる)」
・x=18で、左を向いている($gameMap.event(13).direction() == 4)とき、「前進する(x=17に移動)」
 ……
・x=15で、左を向いている($gameMap.event(13).direction() == 4)とき、「180度ターンする(右に向かせる)」
・x=15で、右を向いている($gameMap.event(13).direction() == 4)とき、「前進する(x=16に移動)」
・x=16で、右を向いている($gameMap.event(13).direction() == 4)とき、「前進する(x=17に移動)」
という感じのスクリプト。

話しかけたときにプレイヤーの方に向くのは自律移動の邪魔にならないらしく、それは考慮に入れなくてよかった。(つまり、向いている方向はすべての方向を想定しなくてよかった)
イベント内でキャラクターの向く方向を指定した場合は、改めて自律移動で方向を指示しなければならなかった。そのため、イベントの都合で下の方向を向かせることがあるため、すべてのX座標で「下を向いていたら、左(もしくは右)を向く」というスクリプトを入れている。
 
記述の効率化や、汎用性を考えて、処理を全部スクリプトで書いてみたりしたんですけど、このスレッドの内容でずっと引っかかっていました。スクリプトで一気にコードを記述するの、難しいんですね……。

AI(CiCi)にカッコがちゃんと閉じられているかのチェックとか、インデントの整備をお願いしたら、やたら非同期処理がどうのこうのってawaitとかPromiseとかいれようと提案してきたので面倒くさいな、と思ってたら、JavaScript自体がそういう仕様なのか……。プラグインも作ったことあるのに全然意識したことなかった……。

タイトルなし.png



参考URL:
JavaScriptの待機処理を理解しよう!タイミング制御の基本から実践まで | Learning Next
 
Back
トップ