シーン内のラベルにジャンプするテスト用プラグイン

はじめに

今実行しているシナリオ内のラベルに自由に飛べたらテストするとき便利かと思い、そういうプラグインを作りました。
下の画像のようにショートカットキーを押すと、今のシーン(ksファイル)のラベルの一覧が表示されます。
クリックしたらそのラベルの行にジャンプする感じです。
注意としては途中の処理もすっ飛ばしてジャンプするので、途中で変数の処理とか挟んでいたらそれもスキップしてしまいます。
jumpタグと同じような挙動です。
なので、長い会話だけのシーンを飛ばすときや、シーンの最初に戻ってもう一度演出などをチェックしたいときなどに使うと良いかと思います。
ラベル以外にもシーンの最初と最後にも飛べるようにしてあります。

ラベルリスト

ティラノスクリプト バージョン475cで動作を確認しています。

プラグインダウンロードと設置

ダウンロードはこちら
過去作ったプラグインがいろいろ入っていますがlabelJumperというフォルダが今回のプラグインです。
そのフォルダをティラノスクリプトのdata/others/pluginフォルダ内に配置します。

first.ksファイルの以下の箇所にプラグイン読み込みタグを追加します。

1
;ゲームで必ず必要な初期化処理はこのファイルに記述するのがオススメ
2
[plugin name=labelJumper]

プレイ中にQキーを押すと一覧が表示されます。
また、0から9はショートカットキーになっているので、Qキーを押してウィンドウを開かずとも操作可能です。

テスト用のプラグインなので公開するときは外してください。

ライセンス

Released under the MIT license

最近制作した細かいプラグイン

最近依頼の過程で制作した細かいプラグインの公開の許可が取れたので公開します。

ピクチャ名だけ変えるプラグイン

ピクチャの位置やサイズなどをそのままにファイル名だけを変えるプラグイン。
UIボタンの色違いに変えるときとか。

PictureChange.js

ピクチャ番号を変えるプラグイン

PictureCopy.js

メニューのシャットダウンでゲーム終了させるプラグイン

メニューのシャットダウンをタイトルじゃなくてゲーム終了させるプラグイン。

MenuGameEnd.js

アルファ付きの動画を有効にするプラグイン

そもそもMVはwebmの動画を再生するとたまにフリーズする現象があり、結局使いませんでした。

EnableVideoAlpha.js

敵グループの敵の重なり順を定義するプラグイン

デフォだとy座標が上の敵はレイヤーが下になります。
通常それで問題ありませんが、敵の上に乗っている敵みたいなのを表現しようとするとできません。

TroopLayerOrder.js

ライセンス

Released under the MIT license

Laravelでのマルチ認証実装時のRedirectIfAuthenticated

概要

Laravel5.8でuserとadminを分けるマルチ認証を実装しました。
その際、adminで認証済みのユーザがログインページに遷移した時に、認証済みであるにも関わらず、ログインページが表示されていました。
本来、認証済みであるならばログインページに遷移せず、ログイン後のページに遷移するのが正しいです。

この処理はapp/Http/Middleware/RedirectIfAuthenticated.phpに記載されていますが、調査すると引数の$guestがnullであることがわかりました。
nullだとconfig/auth.phpで定義されたdefaultsのguardをチェックするので、正しいチェックになりません。

解決

ログインページはroute定義でmiddlewareにguestを定義していますが、その際、パラメータでadminを渡していなかったことが原因でした。
以下のようにして解決。

1
Route::group(['prefix' => 'admin', 'middleware' => 'guest:admin'], function () {
2
    Route::get('login', 'Admin\AdminLoginController@showLoginForm')->name('admin.login');
3
    Route::post('login', 'Admin\AdminLoginController@login');
4
});

AnimatorのCulling Modeでハマった話

概要

UnityのAnimatorの設定にCulling Modeというものがあります。
Animatorコンポーネントをつけたときは、Always Animateに設定されており、基本的にいじることはないと思います。
しかし、Asset Storeで購入したアセットによってはこれがCull Update TransformsCull Compltelyに設定されてることがあり、それを認識していなくてハマりました。
これらはカメラに映っていないときでもアニメーションするかどうかの設定です。
カメラに映っていないときにアニメーションを止めれば負荷が抑えられるのでこういった設定があります。

Animator

サンプル

極端な例ですが、Cubeを左右に動かすアニメーションを作ります。

Animation

Always Animateで動かすとこうなります。

一方、Cull Compltelyにすると、カメラ外にCubeが移動するとそこでアニメーションが止まります。

シーンビューとの注意点

さらに注意しないといけない点があり、Cull Compltelyに設定していてもシーンビューに映っていれば、アニメーションが止まらないのです。
これがあるため、条件が複雑になり「たまにアニメーションが動かないことがある?」となり、ハマったという話でした。

確認バージョン

Unity 2018.4.12f1

ツクールのピクチャ番号の扱いについて

概要

ツクールのピクチャ番号の扱いについて解説します。
デフォルトではMVはピクチャは1から100まで使用できますが、マップと戦闘では同じピクチャ番号で別の画像を表示できます。
マップでピクチャを表示していても、戦闘が始まったら消えますし、戦闘が終われば戦闘で使ったピクチャはマップに持ち越しません。
このあたりについて、内部的にどうなっているかを解説したいと思います。

ピクチャと実際の表示の関係

まず2つの要素を抑えておく必要があります。

Sprite・・・実際に画面に表示する画像
ピクチャ・・・画像ファイル名、座標、拡大率などの情報をまとめたデータ(内部的には$gamePicture)

Spriteはマップ、戦闘表示時にピクチャ番号分、生成され、ピクチャの情報を使って画面に画像を表示します。
ピクチャはセーブに含まれるので、ロードしても画像を復元できるようになっています。
プラグイン制作でよくあるケースなのですが、画面に表示しているSpriteをいじるだけだとセーブ・ロードでその内容が消えてしまいます。

マップと戦闘のピクチャ番号について

戦闘時に使われるピクチャ番号は内部的には101から200になっています。
以下のコードの箇所で、バトル時だけピクチャ番号にピクチャの最大枚数(100)を足して、ピクチャ番号を変換しています。
マップや戦闘以外でもピクチャを扱うようなプラグインではさらに201から300を扱うなどの対応をしているものがあります。

1
Game_Screen.prototype.realPictureId = function(pictureId) {
2
    if ($gameParty.inBattle()) {
3
        return pictureId + this.maxPictures();
4
    } else {
5
        return pictureId;
6
    }
7
};

コンソールに$gameScreen._picturesと入力すると使っているピクチャの情報が出力されます(どのピクチャ番号が使われているかを見るのにも便利だったりします)。
マップと戦闘時にピクチャ10番に表示すると以下のように10と110に設定されているのがわかります。

実際に中身を確認

ちなみに戦闘が終わってもこの101から200のピクチャは残り続け、次の戦闘の開始時に初期化されます。
(セーブファイルも多少大きくなるし、無駄な気がするのですが・・・。)

そのため、ピクチャ最大数を変更するプラグインを使う場合、マップ画面で戦闘のピクチャにアクセスしてしまうなどのバグが発生するケースがあります。
プラグインAではピクチャの最大数が150だと認識しているが、プラグインBではデフォルトの100が最大数だと認識している場合などといったケースです。

GAEのサブディレクトリでWordPressを動かす

サービスの分割

GAEでLaravelを動かしていますが、そこにブログの機能を追加したい要望が出ました。
その際、/blogのサブディレクトリで動かすことが条件でした。
Laravelのpublicフォルダ下にWordPressを設置することもできますが、メンテナンスも考えて今回は分離して運用します。
GAEはサービスという単位でディレクトリごとに復数のプロダクトを動かすことができます。
以下のドキュメントが詳しいです。
dispatch.yaml 構成ファイル | App Engine スタンダード環境での PHP 7.2 に関するドキュメント
ドキュメントに従い、dispatch.yamlを以下のように記述し、デプロイしました。
これで、wpというservice名でblog配下を配信できる準備ができました。

1
dispatch:
2
  - url: "*/blog*"
3
    service: wp

WordPressプロジェクトのダウンロード

以下のドキュメントに従い、ダウンロード、インストールしていきます。手順通り実行すれば、GAEで動作するように設定されたWordPressがダウンロードされます。
このドキュメントはルート直下にインストールすることを前提にしているのでダウンロード後に設定を変えます。  

Run WordPress on Google App Engine standard environment

wp-config.phpの修正

まず、wp-config.phpです。サイトのURLとホームを/blogありにします。

1
//元々
2
define('WP_SITEURL', $protocol_to_use . HTTP_HOST);
3
define('WP_HOME', $protocol_to_use . HTTP_HOST);
4
5
6
7
// /blog/を追加
8
define('WP_SITEURL', $protocol_to_use . HTTP_HOST. '/blog/');
9
define('WP_HOME', $protocol_to_use . HTTP_HOST. '/blog/');

gae-app.phpの修正

次にgae-app.phpを修正します。GAEで動かした際にまずこのファイルにアクセスが割り振られます。
このWordPressはURL的には/blog配下ですが、サービス的にはルート直下にインストールされるので、その差を修正します。

1
//元々
2
$file = get_real_file_to_load($_SERVER['REQUEST_URI']);
3
4
5
6
// リクエストは /blogつきでくるが、サーバ上のファイルは/blogはないので、消す
7
$uri = preg_replace('/\/blog/', '', $_SERVER['REQUEST_URI'], 1);
8
$file = get_real_file_to_load($uri);

app.yamlの修正

最後にapp.yamlを以下のように修正します。

1
2
# App Engine runtime configuration
3
runtime: php72
4
5
#デプロイ先の指定
6
service: wp
7
8
entrypoint: serve gae-app.php
9
10
#それぞれのurlに/blogを追加します
11
handlers:
12
- url: /blog/(.*\.(htm|html|css|js))
13
  static_files: \1
14
  upload: .*\.(htm|html|css|js)$
15
16
- url: /blog/wp-content/(.*\.(ico|jpg|jpeg|png|gif|woff|ttf|otf|eot|svg))
17
  static_files: wp-content/\1
18
  upload: wp-content/.*\.(ico|jpg|jpeg|png|gif|woff|ttf|otf|eot|svg)$
19
20
- url: /blog/(.*\.(ico|jpg|jpeg|png|gif|woff|ttf|otf|eot|svg))
21
  static_files: \1
22
  upload: .*\.(ico|jpg|jpeg|png|gif|woff|ttf|otf|eot|svg)$
23
24
- url: /blog/wp-includes/images/media/(.*\.(ico|jpg|jpeg|png|gif|woff|ttf|otf|eot|svg))
25
  static_files: wp-includes/images/media/\1
26
  upload: wp-includes/images/media/.*\.(ico|jpg|jpeg|png|gif|woff|ttf|otf|eot|svg)$

デプロイ

あとはドキュメントどおり、 gcloud app deploy app.yaml cron.yaml すればOKでした。

余談ですが、Laravel側でWordPressの記事を表示したいとの要望があり、その連携はAPIを作って、連携しています。

キャラ名を変数に保存するプラグイン

はじめに

1
#あかね
2
もしかして、ノベルゲームの開発に興味があるの?

このように#キャラ名で会話で表示するキャラを設定しますが、ここで設定したキャラ名を変数として扱いたいという要望がありました。
ここのキャラ名を変数で扱えれば、その後の画像表示などを共通処理ですっきりできるというニーズです。

ティラノスクリプト バージョン475cで動作を確認しています。

プラグインダウンロードと設置

ダウンロードはこちら
過去作ったプラグインがいろいろ入っていますがsaveCharaNameというフォルダが今回のプラグインです。
そのフォルダをティラノスクリプトのdata/others/pluginフォルダ内に配置します。

first.ksファイルの以下の箇所にプラグイン読み込みタグを追加します。

1
;ゲームで必ず必要な初期化処理はこのファイルに記述するのがオススメ
2
[plugin name=saveCharaName]

実際に使う場合はこんな感じです。変数のcharaNameに最後に呼ばれた#キャラ名の値が入っています。

1
テスト-[emb exp="f.charaName"][p]

もし、charaNameという変数名が気に入らなかったら、プラグインのフォルダのmain.jsの6行目のcharaNameを好きに替えてください。

1
if(pm.name) this.kag.stat.f.charaName = pm.name;

ライセンス

Released under the MIT license

容量の大きい音声ファイルをロードするとクラッシュする

発生条件

RPGツクールMVで以下のようなスペックのPCで10MB、15分という巨大なBGS(BGMでも同様)を使用したところ、fpsが非常に低下しました。
その状態でそのBGSを使用しているマップの出入りなどをたくさんするとクラッシュしました。

1
Windows 7 Home Premium 32-bit 
2
Core(TM) i5 CPU M 520
3
Intel(R) HD Graphics

再生までに時間が非常にかかるので、デコード処理でおそらく重くなっていると考えられます。
マップの出入りをたくさんすると、前の音声ファイルの読み込みが終わる前に次の巨大なBGSを読み込もうとするので、さらに重くなりクラッシュします。

通常、こんな大きなBGSを使用することはないはずですが、公式で販売されているものがそうだったらしいので容量、音声ファイルの長さには注意が必要です。

Firebaseのstorageにformの画像をアップロードする

概要

type='file'指定したinputから画像を選択し、formがsubmitされたときにFirebaseのstorageにその画像をアップロードします。
その際、複数画像のアップロードにも対応します。

storageのルール

ルールは以下のようにします。
バケットの/form-uploaded 配下にのみアップロードを許可し、MAX20MBの画像ファイルを許可する設定です。

1
rules_version = '2';
2
service firebase.storage {
3
  match /b/{bucket}/o {
4
    match /form-uploaded/{id} {
5
      allow write : if request.resource.size < 20 * 1024 * 1024
6
                   && request.resource.contentType.matches('image/.*');
7
    }
8
  }
9
}

htmlとjs

htmlとjsは以下です。

1
<html>
2
<head></head>
3
<body>
4
  <form>
5
    <input type='file' accept='image/*' multiple='multiple' name='imgs[]'>
6
    <button type='submit'>送信</button>
7
  </form>
8
9
  <script src='https://www.gstatic.com/firebasejs/7.5.0/firebase-app.js'></script>
10
  <script src='https://www.gstatic.com/firebasejs/7.5.0/firebase-storage.js'></script>
11
  <script>
12
13
    //firebase初期化
14
    var firebaseConfig = {
15
      apiKey: 'xxxxx',
16
      projectId: 'yyyyy',
17
      storageBucket: 'zzzzzz',
18
    }
19
    firebase.initializeApp(firebaseConfig);
20
21
    //formのsubmitにイベント設定
22
    var form = document.querySelector('form');
23
    form.addEventListener('submit', function (e) {
24
      e.preventDefault();
25
      var imgs = form.querySelector('input');
26
      var uploads = [];
27
      for (var file of imgs.files) {
28
          //選択したファイルのファイル名を使うが、場合によってはかぶるので注意
29
        var storageRef = firebase.storage().ref('form-uploaded/' + file.name);
30
        uploads.push(storageRef.put(file));
31
      }
32
      //すべての画像のアップロード完了を待つ
33
      Promise.all(uploads).then(function () {
34
        console.log('アップロード完了');
35
      });
36
    });
37
  </script>
38
39
</body>
40
</html>

テストのレポートを作るプラグイン

テストのレポート

ゲームのテストをしたときにバグや良かったところとか報告をします。
しかし、画面のキャプチャをしたりセーブファイルを添付したり、結構大変ですし、そういう作業をしながらでは、ゲームに集中できません。
そこでレポート作成を楽にできるプラグインを制作しました。

レポート作成ウィンドウ

ゲーム本体側に影響を与えず、すぐにレポートを書けることを重視して、レポート作成画面は別ウィンドウで自動起動します。
以下の画面のような構成です。

レポート作成ウィンドウ

レポートのHTML

レポートは以下の画像のようにHTMLで出力されます。

以下の2つのセーブが添付されます。

  1. 最後にプレイヤーが実際にセーブした時点のセーブファイル
  2. レポートを送信した時点のセーブファイル

2に関しては場合によっては正しくないセーブファイルになります。
例えば、イベント途中でレポートを書いた場合、イベントを途中まで実行しているので中途半端なデータになりかねません。
使用するときは注意が必要です。

使い方

動作バージョン: RPGツクールMV1.6以上

以下よりzipをダウンロードし、解凍します。解凍した中身のTestReportフォルダとTestReport.jsの両方をjs/pluginsフォルダに配置します。
https://github.com/kido0617/rpgmakerMV-plugin/raw/master/TestReportSet.zip

プラグインをONにすれば起動時にウィンドウが表示されます。
作成されたレポートはエディタだとプロジェクトファイル直下のreportフォルダに、デプロイ後だとwwwフォルダ内に作られます。

制限事項など

書いているつもりがレポート生成されてなかったら大変なので、テスト時に「レポートを開く」リンクからレポートが正常に生成されているか確認してください。
レポートを削除するときはreportフォルダを削除してください。
製品リリース時に残らないよう気をつけてください。

ライセンス

Released under the MIT license
フォルダ内のbootstrap.min.cssはMITライセンスによりTwitter社が配布しています。https://github.com/twbs/bootstrap/blob/v4.1.3/LICENSE