プログラミング・動画編集 備忘録

プログラミングや動画編集についての備忘録です

AviUtlで編集時に音ズレする

事象:通常のプレイヤーでは音ズレしていないのに、編集時に途中から音ズレする。
解決:「VFRをCFRに変換する方法」を実施

【参考にした情報】
aviutl.info

動画編集を行う上で重要な事柄のようですが、こういった知識というのは問題にぶち当たって、解決していかないと身につかないものですよね・・・

以下、音ズレしている動画と解決後の動画です。

音ズレするバージョン
gaming.youtube.com


音ズレしないバージョン
gaming.youtube.com


※このブログはSkyrimのMod開発について語るつもりが、そのための題材として「ソフィーのアトリエ」のゆっくり実況動画を始めたことで、動画編集に関わる記事も備忘録として書いていましたが、さらに寄り道でPC版テラリアの縛りプレイまで同時並行で始めてしまい、動画編集に凝りだした事でこのようなことになっています。

GIMPのScript-Fuで画像の切り取りを自動化する

はじめに

画像編集にて、複数の画像の特定の範囲を繰返し切り抜く事があるかと思います。
この記事はGIMPスクリプトであるScript-Fuを使用して、画像の切取りを自動化する方法について解説します。

Script-Fuについては次のサイトの情報を参照してください。
2. Script-Fu スクリプトを使用

スクリプトのテンプレート

(define (
	{スクリプト名}
	img
	drawable
	)

	;Undoグループの開始
	(gimp-undo-push-group-start img)

	;キャンバスサイズの変更
	(gimp-image-resize img {Width} {Height} -{X} -{Y})

	;アルファチャンネルの追加
	(gimp-layer-add-alpha drawable)

	;範囲選択
	(gimp-rect-select img 0 0 0 0 REPLACE FALSE 0)
	(gimp-rect-select img {X} {Y} {Width} {Height} ADD FALSE 0)

	;削除
	(gimp-edit-clear drawable)

	;選択範囲の解除
	(gimp-selection-none img)

	;undoグループの終了
	(gimp-undo-push-group-end img)

	; 出力
	(gimp-displays-flush)
)

(script-fu-register
	"{スクリプト名}"
	"<Image>/Script-Fu/{コマンド名}"
	"{説明}"
	"{作者}"
	"{コピーライト}"
	"{日付}"
	"{動作可能なモード}"
	SF-IMAGE "Image" 0
	SF-DRAWABLE "Drawable" 0
)

{ } の部分を書き換えます。

ポイント

gimp-image-resizeでまず特定の範囲にキャンバスサイズを変更します。
さらに不要な部分を透明化するため、gimp-rect-selectで選択を行い、その後選択範囲を削除します。
この部分を必要なだけ追加すればいいです。

範囲選択用のスクリプトを生成する

最初に1回手動で範囲選択を行う必要がありますが、その選択範囲のマスク画像から範囲選択用のスクリプトを生成します。
マスク画像は、GIMPにて範囲選択がチャンネル保存して、作成するなどし、BMPと保存します。
保存したBMPを自作ツールのRMaskToScript-Fuにてドロップして表示されたテキストと上記のテンプレートを組み合わせて利用します。

ツールのソースコード説明

説明らしいことは書いていませんが、プログラミング主体の話題はこちらに書いていますので。
qiita.com

スクリプトの使用例

以下のスクリプトはテラリアというゲームのインベントリ内を切り取るものです。

(define (
	インベントリ切取り
	img
	drawable
	)

	;Undoグループの開始
	(gimp-undo-push-group-start img)

	;キャンバスサイズの変更
	(gimp-image-resize img 545 234 -20 -20)

	;アルファチャンネルの追加
	(gimp-layer-add-alpha drawable)

	;範囲選択
	(gimp-rect-select img 0 0 0 0 REPLACE FALSE 0)
	(gimp-rect-select img 0 0 7 2 ADD FALSE 0)
	(gimp-rect-select img 37 0 17 2 ADD FALSE 0)
	(gimp-rect-select img 84 0 18 2 ADD FALSE 0)
	(gimp-rect-select img 132 0 17 2 ADD FALSE 0)
	(gimp-rect-select img 179 0 18 2 ADD FALSE 0)
	(gimp-rect-select img 227 0 18 2 ADD FALSE 0)
	(gimp-rect-select img 275 0 17 2 ADD FALSE 0)
	(gimp-rect-select img 322 0 18 2 ADD FALSE 0)
	(gimp-rect-select img 370 0 17 2 ADD FALSE 0)
	(gimp-rect-select img 417 0 18 2 ADD FALSE 0)
	(gimp-rect-select img 465 0 80 2 ADD FALSE 0)
	(gimp-rect-select img 0 2 3 1 ADD FALSE 0)
	(gimp-rect-select img 41 2 9 1 ADD FALSE 0)
	(gimp-rect-select img 88 2 10 1 ADD FALSE 0)
	(gimp-rect-select img 136 2 9 1 ADD FALSE 0)
	(gimp-rect-select img 183 2 10 1 ADD FALSE 0)
	(gimp-rect-select img 231 2 10 1 ADD FALSE 0)
	(gimp-rect-select img 279 2 9 1 ADD FALSE 0)
	(gimp-rect-select img 326 2 10 1 ADD FALSE 0)
	(gimp-rect-select img 374 2 9 1 ADD FALSE 0)
	(gimp-rect-select img 421 2 10 1 ADD FALSE 0)
	(gimp-rect-select img 469 2 76 1 ADD FALSE 0)
	(gimp-rect-select img 0 3 2 4 ADD FALSE 0)
	(gimp-rect-select img 42 3 7 4 ADD FALSE 0)
	(gimp-rect-select img 89 3 8 4 ADD FALSE 0)
	(gimp-rect-select img 137 3 7 4 ADD FALSE 0)
	(gimp-rect-select img 184 3 8 4 ADD FALSE 0)
	(gimp-rect-select img 232 3 8 4 ADD FALSE 0)
	(gimp-rect-select img 280 3 7 4 ADD FALSE 0)
	(gimp-rect-select img 327 3 8 4 ADD FALSE 0)
	(gimp-rect-select img 375 3 7 4 ADD FALSE 0)
	(gimp-rect-select img 422 3 8 4 ADD FALSE 0)
	(gimp-rect-select img 470 3 75 4 ADD FALSE 0)
	(gimp-rect-select img 44 7 3 227 ADD FALSE 0)
	(gimp-rect-select img 91 7 4 227 ADD FALSE 0)
	(gimp-rect-select img 139 7 3 227 ADD FALSE 0)
	(gimp-rect-select img 186 7 4 227 ADD FALSE 0)
	(gimp-rect-select img 234 7 4 227 ADD FALSE 0)
	(gimp-rect-select img 282 7 3 227 ADD FALSE 0)
	(gimp-rect-select img 329 7 4 227 ADD FALSE 0)
	(gimp-rect-select img 377 7 3 227 ADD FALSE 0)
	(gimp-rect-select img 424 7 4 227 ADD FALSE 0)
	(gimp-rect-select img 472 7 73 78 ADD FALSE 0)
	(gimp-rect-select img 0 37 2 17 ADD FALSE 0)
	(gimp-rect-select img 42 37 7 17 ADD FALSE 0)
	(gimp-rect-select img 89 37 8 17 ADD FALSE 0)
	(gimp-rect-select img 137 37 7 17 ADD FALSE 0)
	(gimp-rect-select img 184 37 8 17 ADD FALSE 0)
	(gimp-rect-select img 232 37 8 17 ADD FALSE 0)
	(gimp-rect-select img 280 37 7 17 ADD FALSE 0)
	(gimp-rect-select img 327 37 8 17 ADD FALSE 0)
	(gimp-rect-select img 375 37 7 17 ADD FALSE 0)
	(gimp-rect-select img 422 37 8 17 ADD FALSE 0)
	(gimp-rect-select img 470 37 75 17 ADD FALSE 0)
	(gimp-rect-select img 2 41 1 9 ADD FALSE 0)
	(gimp-rect-select img 41 41 9 9 ADD FALSE 0)
	(gimp-rect-select img 88 41 10 9 ADD FALSE 0)
	(gimp-rect-select img 136 41 9 9 ADD FALSE 0)
	(gimp-rect-select img 183 41 10 9 ADD FALSE 0)
	(gimp-rect-select img 231 41 10 9 ADD FALSE 0)
	(gimp-rect-select img 279 41 9 9 ADD FALSE 0)
	(gimp-rect-select img 326 41 10 9 ADD FALSE 0)
	(gimp-rect-select img 374 41 9 9 ADD FALSE 0)
	(gimp-rect-select img 421 41 10 9 ADD FALSE 0)
	(gimp-rect-select img 469 41 76 9 ADD FALSE 0)
	(gimp-rect-select img 3 42 4 7 ADD FALSE 0)
	(gimp-rect-select img 37 42 17 7 ADD FALSE 0)
	(gimp-rect-select img 84 42 18 7 ADD FALSE 0)
	(gimp-rect-select img 132 42 17 7 ADD FALSE 0)
	(gimp-rect-select img 179 42 18 7 ADD FALSE 0)
	(gimp-rect-select img 227 42 18 7 ADD FALSE 0)
	(gimp-rect-select img 275 42 17 7 ADD FALSE 0)
	(gimp-rect-select img 322 42 18 7 ADD FALSE 0)
	(gimp-rect-select img 370 42 17 7 ADD FALSE 0)
	(gimp-rect-select img 417 42 18 7 ADD FALSE 0)
	(gimp-rect-select img 465 42 80 7 ADD FALSE 0)
	(gimp-rect-select img 7 44 538 3 ADD FALSE 0)
	(gimp-rect-select img 0 84 2 18 ADD FALSE 0)
	(gimp-rect-select img 42 84 7 18 ADD FALSE 0)
	(gimp-rect-select img 89 84 8 18 ADD FALSE 0)
	(gimp-rect-select img 137 84 7 18 ADD FALSE 0)
	(gimp-rect-select img 184 84 8 18 ADD FALSE 0)
	(gimp-rect-select img 232 84 8 18 ADD FALSE 0)
	(gimp-rect-select img 280 84 7 18 ADD FALSE 0)
	(gimp-rect-select img 327 84 8 18 ADD FALSE 0)
	(gimp-rect-select img 375 84 7 18 ADD FALSE 0)
	(gimp-rect-select img 422 84 8 18 ADD FALSE 0)
	(gimp-rect-select img 470 84 75 1 ADD FALSE 0)
	(gimp-rect-select img 470 85 12 1 ADD FALSE 0)
	(gimp-rect-select img 503 85 16 1 ADD FALSE 0)
	(gimp-rect-select img 540 85 5 1 ADD FALSE 0)
	(gimp-rect-select img 470 86 9 1 ADD FALSE 0)
	(gimp-rect-select img 506 86 10 1 ADD FALSE 0)
	(gimp-rect-select img 543 86 2 1 ADD FALSE 0)
	(gimp-rect-select img 470 87 8 3 ADD FALSE 0)
	(gimp-rect-select img 507 87 8 3 ADD FALSE 0)
	(gimp-rect-select img 544 87 1 148 ADD FALSE 0)
	(gimp-rect-select img 2 88 1 10 ADD FALSE 0)
	(gimp-rect-select img 41 88 9 10 ADD FALSE 0)
	(gimp-rect-select img 88 88 10 10 ADD FALSE 0)
	(gimp-rect-select img 136 88 9 10 ADD FALSE 0)
	(gimp-rect-select img 183 88 10 10 ADD FALSE 0)
	(gimp-rect-select img 231 88 10 10 ADD FALSE 0)
	(gimp-rect-select img 279 88 9 10 ADD FALSE 0)
	(gimp-rect-select img 326 88 10 10 ADD FALSE 0)
	(gimp-rect-select img 374 88 9 10 ADD FALSE 0)
	(gimp-rect-select img 421 88 10 10 ADD FALSE 0)
	(gimp-rect-select img 469 88 9 2 ADD FALSE 0)
	(gimp-rect-select img 3 89 4 8 ADD FALSE 0)
	(gimp-rect-select img 37 89 17 8 ADD FALSE 0)
	(gimp-rect-select img 84 89 18 8 ADD FALSE 0)
	(gimp-rect-select img 132 89 17 8 ADD FALSE 0)
	(gimp-rect-select img 179 89 18 8 ADD FALSE 0)
	(gimp-rect-select img 227 89 18 8 ADD FALSE 0)
	(gimp-rect-select img 275 89 17 8 ADD FALSE 0)
	(gimp-rect-select img 322 89 18 8 ADD FALSE 0)
	(gimp-rect-select img 370 89 17 8 ADD FALSE 0)
	(gimp-rect-select img 417 89 18 8 ADD FALSE 0)
	(gimp-rect-select img 465 89 13 1 ADD FALSE 0)
	(gimp-rect-select img 465 90 12 7 ADD FALSE 0)
	(gimp-rect-select img 508 90 6 144 ADD FALSE 0)
	(gimp-rect-select img 7 91 470 4 ADD FALSE 0)
	(gimp-rect-select img 469 97 8 1 ADD FALSE 0)
	(gimp-rect-select img 470 98 7 4 ADD FALSE 0)
	(gimp-rect-select img 472 102 5 132 ADD FALSE 0)
	(gimp-rect-select img 477 111 1 12 ADD FALSE 0)
	(gimp-rect-select img 507 111 8 12 ADD FALSE 0)
	(gimp-rect-select img 478 114 1 6 ADD FALSE 0)
	(gimp-rect-select img 506 114 10 6 ADD FALSE 0)
	(gimp-rect-select img 543 114 2 6 ADD FALSE 0)
	(gimp-rect-select img 479 115 3 4 ADD FALSE 0)
	(gimp-rect-select img 503 115 16 4 ADD FALSE 0)
	(gimp-rect-select img 540 115 5 4 ADD FALSE 0)
	(gimp-rect-select img 482 116 63 2 ADD FALSE 0)
	(gimp-rect-select img 0 132 2 17 ADD FALSE 0)
	(gimp-rect-select img 42 132 7 17 ADD FALSE 0)
	(gimp-rect-select img 89 132 8 17 ADD FALSE 0)
	(gimp-rect-select img 137 132 7 17 ADD FALSE 0)
	(gimp-rect-select img 184 132 8 17 ADD FALSE 0)
	(gimp-rect-select img 232 132 8 17 ADD FALSE 0)
	(gimp-rect-select img 280 132 7 17 ADD FALSE 0)
	(gimp-rect-select img 327 132 8 17 ADD FALSE 0)
	(gimp-rect-select img 375 132 7 17 ADD FALSE 0)
	(gimp-rect-select img 422 132 8 17 ADD FALSE 0)
	(gimp-rect-select img 470 132 7 17 ADD FALSE 0)
	(gimp-rect-select img 2 136 1 9 ADD FALSE 0)
	(gimp-rect-select img 41 136 9 9 ADD FALSE 0)
	(gimp-rect-select img 88 136 10 9 ADD FALSE 0)
	(gimp-rect-select img 136 136 9 9 ADD FALSE 0)
	(gimp-rect-select img 183 136 10 9 ADD FALSE 0)
	(gimp-rect-select img 231 136 10 9 ADD FALSE 0)
	(gimp-rect-select img 279 136 9 9 ADD FALSE 0)
	(gimp-rect-select img 326 136 10 9 ADD FALSE 0)
	(gimp-rect-select img 374 136 9 9 ADD FALSE 0)
	(gimp-rect-select img 421 136 10 9 ADD FALSE 0)
	(gimp-rect-select img 469 136 8 9 ADD FALSE 0)
	(gimp-rect-select img 3 137 4 7 ADD FALSE 0)
	(gimp-rect-select img 37 137 17 7 ADD FALSE 0)
	(gimp-rect-select img 84 137 18 7 ADD FALSE 0)
	(gimp-rect-select img 132 137 17 7 ADD FALSE 0)
	(gimp-rect-select img 179 137 18 7 ADD FALSE 0)
	(gimp-rect-select img 227 137 18 7 ADD FALSE 0)
	(gimp-rect-select img 275 137 17 7 ADD FALSE 0)
	(gimp-rect-select img 322 137 18 7 ADD FALSE 0)
	(gimp-rect-select img 370 137 17 7 ADD FALSE 0)
	(gimp-rect-select img 417 137 18 7 ADD FALSE 0)
	(gimp-rect-select img 465 137 12 7 ADD FALSE 0)
	(gimp-rect-select img 7 139 470 3 ADD FALSE 0)
	(gimp-rect-select img 477 144 1 13 ADD FALSE 0)
	(gimp-rect-select img 507 144 8 13 ADD FALSE 0)
	(gimp-rect-select img 478 147 1 7 ADD FALSE 0)
	(gimp-rect-select img 506 147 10 7 ADD FALSE 0)
	(gimp-rect-select img 543 147 2 7 ADD FALSE 0)
	(gimp-rect-select img 479 148 3 5 ADD FALSE 0)
	(gimp-rect-select img 503 148 16 5 ADD FALSE 0)
	(gimp-rect-select img 540 148 5 5 ADD FALSE 0)
	(gimp-rect-select img 482 149 63 3 ADD FALSE 0)
	(gimp-rect-select img 477 178 1 12 ADD FALSE 0)
	(gimp-rect-select img 507 178 8 12 ADD FALSE 0)
	(gimp-rect-select img 0 179 2 18 ADD FALSE 0)
	(gimp-rect-select img 42 179 7 18 ADD FALSE 0)
	(gimp-rect-select img 89 179 8 18 ADD FALSE 0)
	(gimp-rect-select img 137 179 7 18 ADD FALSE 0)
	(gimp-rect-select img 184 179 8 18 ADD FALSE 0)
	(gimp-rect-select img 232 179 8 18 ADD FALSE 0)
	(gimp-rect-select img 280 179 7 18 ADD FALSE 0)
	(gimp-rect-select img 327 179 8 18 ADD FALSE 0)
	(gimp-rect-select img 375 179 7 18 ADD FALSE 0)
	(gimp-rect-select img 422 179 8 18 ADD FALSE 0)
	(gimp-rect-select img 470 179 8 11 ADD FALSE 0)
	(gimp-rect-select img 478 181 1 6 ADD FALSE 0)
	(gimp-rect-select img 506 181 10 6 ADD FALSE 0)
	(gimp-rect-select img 543 181 2 6 ADD FALSE 0)
	(gimp-rect-select img 479 182 3 4 ADD FALSE 0)
	(gimp-rect-select img 503 182 16 4 ADD FALSE 0)
	(gimp-rect-select img 540 182 5 4 ADD FALSE 0)
	(gimp-rect-select img 2 183 1 10 ADD FALSE 0)
	(gimp-rect-select img 41 183 9 10 ADD FALSE 0)
	(gimp-rect-select img 88 183 10 10 ADD FALSE 0)
	(gimp-rect-select img 136 183 9 10 ADD FALSE 0)
	(gimp-rect-select img 183 183 10 10 ADD FALSE 0)
	(gimp-rect-select img 231 183 10 10 ADD FALSE 0)
	(gimp-rect-select img 279 183 9 10 ADD FALSE 0)
	(gimp-rect-select img 326 183 10 10 ADD FALSE 0)
	(gimp-rect-select img 374 183 9 10 ADD FALSE 0)
	(gimp-rect-select img 421 183 10 10 ADD FALSE 0)
	(gimp-rect-select img 469 183 76 2 ADD FALSE 0)
	(gimp-rect-select img 3 184 4 8 ADD FALSE 0)
	(gimp-rect-select img 37 184 17 8 ADD FALSE 0)
	(gimp-rect-select img 84 184 18 8 ADD FALSE 0)
	(gimp-rect-select img 132 184 17 8 ADD FALSE 0)
	(gimp-rect-select img 179 184 18 8 ADD FALSE 0)
	(gimp-rect-select img 227 184 18 8 ADD FALSE 0)
	(gimp-rect-select img 275 184 17 8 ADD FALSE 0)
	(gimp-rect-select img 322 184 18 8 ADD FALSE 0)
	(gimp-rect-select img 370 184 17 8 ADD FALSE 0)
	(gimp-rect-select img 417 184 18 8 ADD FALSE 0)
	(gimp-rect-select img 465 184 80 1 ADD FALSE 0)
	(gimp-rect-select img 465 185 17 1 ADD FALSE 0)
	(gimp-rect-select img 7 186 472 1 ADD FALSE 0)
	(gimp-rect-select img 7 187 471 3 ADD FALSE 0)
	(gimp-rect-select img 465 190 12 2 ADD FALSE 0)
	(gimp-rect-select img 469 192 8 1 ADD FALSE 0)
	(gimp-rect-select img 470 193 7 4 ADD FALSE 0)
	(gimp-rect-select img 477 211 1 23 ADD FALSE 0)
	(gimp-rect-select img 507 211 8 23 ADD FALSE 0)
	(gimp-rect-select img 478 214 1 20 ADD FALSE 0)
	(gimp-rect-select img 506 214 10 20 ADD FALSE 0)
	(gimp-rect-select img 543 214 2 20 ADD FALSE 0)
	(gimp-rect-select img 479 215 3 19 ADD FALSE 0)
	(gimp-rect-select img 503 215 16 19 ADD FALSE 0)
	(gimp-rect-select img 540 215 5 19 ADD FALSE 0)
	(gimp-rect-select img 482 216 63 18 ADD FALSE 0)
	(gimp-rect-select img 0 227 2 7 ADD FALSE 0)
	(gimp-rect-select img 42 227 7 7 ADD FALSE 0)
	(gimp-rect-select img 89 227 8 7 ADD FALSE 0)
	(gimp-rect-select img 137 227 7 7 ADD FALSE 0)
	(gimp-rect-select img 184 227 8 7 ADD FALSE 0)
	(gimp-rect-select img 232 227 8 7 ADD FALSE 0)
	(gimp-rect-select img 280 227 7 7 ADD FALSE 0)
	(gimp-rect-select img 327 227 8 7 ADD FALSE 0)
	(gimp-rect-select img 375 227 7 7 ADD FALSE 0)
	(gimp-rect-select img 422 227 8 7 ADD FALSE 0)
	(gimp-rect-select img 470 227 75 7 ADD FALSE 0)
	(gimp-rect-select img 2 231 1 3 ADD FALSE 0)
	(gimp-rect-select img 41 231 9 3 ADD FALSE 0)
	(gimp-rect-select img 88 231 10 3 ADD FALSE 0)
	(gimp-rect-select img 136 231 9 3 ADD FALSE 0)
	(gimp-rect-select img 183 231 10 3 ADD FALSE 0)
	(gimp-rect-select img 231 231 10 3 ADD FALSE 0)
	(gimp-rect-select img 279 231 9 3 ADD FALSE 0)
	(gimp-rect-select img 326 231 10 3 ADD FALSE 0)
	(gimp-rect-select img 374 231 9 3 ADD FALSE 0)
	(gimp-rect-select img 421 231 10 3 ADD FALSE 0)
	(gimp-rect-select img 469 231 76 3 ADD FALSE 0)
	(gimp-rect-select img 3 232 4 2 ADD FALSE 0)
	(gimp-rect-select img 37 232 17 2 ADD FALSE 0)
	(gimp-rect-select img 84 232 18 2 ADD FALSE 0)
	(gimp-rect-select img 132 232 17 2 ADD FALSE 0)
	(gimp-rect-select img 179 232 18 2 ADD FALSE 0)
	(gimp-rect-select img 227 232 18 2 ADD FALSE 0)
	(gimp-rect-select img 275 232 17 2 ADD FALSE 0)
	(gimp-rect-select img 322 232 18 2 ADD FALSE 0)
	(gimp-rect-select img 370 232 17 2 ADD FALSE 0)
	(gimp-rect-select img 417 232 18 2 ADD FALSE 0)
	(gimp-rect-select img 465 232 80 2 ADD FALSE 0)

	;削除
	(gimp-edit-clear drawable)

	;選択範囲の解除
	(gimp-selection-none img)

	;undoグループの終了
	(gimp-undo-push-group-end img)

	; 出力
	(gimp-displays-flush)
)

(script-fu-register
	"インベントリ切取り"
	"<Image>/Script-Fu/テラリア/インベントリ切取り"
	"テラリアのインベントリ表示部分を切り取る"
	"R"
	"Copyright 2017, R"
	"May 28, 2017"
	""
	SF-IMAGE "Image" 0
	SF-DRAWABLE "Drawable" 0
)

このファイルをGIMP%UserProfile%\.gimp-2.8\scriptsに置けば利用できるようになります。

ツールの紹介動画

ニコニコ動画
www.nicovideo.jp

YouTube
youtu.be

以上

AviUtlでウィンドウ移動時の吸着がうざったい

AviUtiでウィンドウを動かした際に、他のウィンドウがスナップしてくっついてきます。
これが少々うざったかったので、環境設定でOFFにしました。

[ファイル]-[環境設定]-[システムの設定]
f:id:rrryutaro:20170416102106p:plain

これまでYukkuriMovieMakerの方で編集して、AviUtlではただ出力していただけでしたが、最近編集に凝りはじめたので、AviUtlメインで編集し、声についてはYukkuriMovieMakerで編集するようになってきました。

そうなると、AviUtlでの操作を色々と覚えていく必要がありますが、機能が多すぎて中々手がつきません。

環境設定などもまだまだ色々といじるところはありそうです。


以上

SkyrimのModをプログラムで生成する

このブログではSkyrimのMod開発について書いているわけですが、その中の記事で次の内容や
rrryutaro.hatenablog.com

ファイルフォーマットの解説など
rrryutaro.hatenablog.com

プログラミングでModを作ることについて書いていたりします。
プログラミングでの具体的なソースコードなどについては、別サイトであるQiita(プログラミングに関する知識を記録・共有するためのサービス)で書いています。

そこでは、Skyrim以外のことも話題としていて、単純に知識共有できる内容はそっちに書くようにしています。

ファイルフォーマットの解説と合わせて、それを利用するC#のプログラムの説明を書いていましたが、一応一段落したので、こちらでも紹介です。
ソースコード一式もGitHubにアップしてあります。

ソースコード一式
github.com

Qiitaへの投稿
SkyrimのModをプログラムで生成する - 1 - 基本のデータ構造など - Qiita
SkyrimのModをプログラムで生成する - 2 - グループを扱う - Qiita
SkyrimのModをプログラムで生成する - 3 - レコードを扱う - Qiita
SkyrimのModをプログラムで生成する - 4 - フィールドを扱う - Qiita
SkyrimのModをプログラムで生成する - 5 - Modファイルを扱う - Qiita
SkyrimのModをプログラムで生成する - 6 - セル情報とワールド情報を扱う - Qiita
SkyrimのModをプログラムで生成する - 7 - ストリングテーブルを扱う - Qiita
SkyrimのModをプログラムで生成する - 8 - 実際にModファイルを読み取ってみる - Qiita


以上

Skyrim Mod ファイルフォーマット解説 - 3

はじめに

この記事ではSkyrimのModのファイルフォーマットについて解説しています。
SkyrimのModのファイルフォーマットについてはTes5Mod:Mod File Format - The Unofficial Elder Scrolls Pages (UESP)が詳しいですが、ここでは、これまで自分なりに解析してきた内容や、必要な部分なども踏まえて解説していきます。
また、同時にプログラミングで利用する情報なども合わせて解説したいと思いますが、プログラミングについての主な情報は別サイトで記事にいていきます。

前回はグループについて記載しましたので、今回は主にレコードについてです。

レコード

武器データのレコードを見てみることにします。武器の情報はWEAPです。

f:id:rrryutaro:20170410215906p:plain
選択部分はグループヘッダーです。

次の、範囲がレコードヘッダーです。
f:id:rrryutaro:20170410220010p:plain

レコードヘッダーの情報は次のようになっています。

項目名 byte数 byte数合計 説明
Signature string 4 4 どのような情報を扱うかを識別する記号。
DataSize uint 4 8 ヘッダーサイズを含まないレコードの全体サイズ。
RecordFlags uint 4 12 あまり気にしない。詳細はUESPのRecordsのflags参照。
FormID uint 4 16 mod内でデータを一意に識別するためのID。
VersionControlInfo1 uint 4 20 あまり気にしない。詳細はUESPのRecordsのrevision参照。
FormVersion ushot 2 22 あまり気にしない。詳細はUESPのRecordsのversion参照。
VersionControlInfo2 ushot 2 24 あまり気にしない。詳細はUESPのRecordsのdata参照。

※項目名はSSEEditでの表示名称を使用

では、実際のデータに当てはめて見て見ます。

項目名 バイナリ上での表示
Signature WEAP f:id:rrryutaro:20170410220922p:plain
DataSize 422 f:id:rrryutaro:20170410220946p:plain
RecordFlags 0 f:id:rrryutaro:20170410221017p:plain
FormID 00017288 f:id:rrryutaro:20170410221110p:plain
VersionControlInfo1 10 2C 1E 00 f:id:rrryutaro:20170410221353p:plain
FormVersion 44 f:id:rrryutaro:20170410221448p:plain
VersionControlInfo2 03 00 f:id:rrryutaro:20170410221517p:plain

SSEEditで見ると次のようになっています。
f:id:rrryutaro:20170410221632p:plain

ちなみに、最初のファイルヘッダーにあたるTES4はグループヘッダーが無く、このレコードヘッダーの部分からはじまっています。

以降のDataSize分のデータがフィールドのデータになります。
f:id:rrryutaro:20170410222056p:plain


以上、今回はここまで。

Skyrim Mod 製作日記 - 20 - ダンジョンを自動生成する (5)

ウィザードリィ#1のマップを利用したダンジョン生成について、前回は敵の配置について記載しました。
前回まではただ配置していただけで、最初から敵対状態としてありましたのでダンジョンに入った瞬間、敵が動き出してうるさかったです。
そこで、近付いたら敵対するように変更を加えます。

近付いたら敵対するようにする

色々と方法があるのかもしれませんが、配置時はAI DataのAggressionをUnaggressiveにして、TriggerでのScriptで、Very Aggressiveにするという方法をとりました。

Aggression (攻撃性)
Faction Relationships (派閥関係)と関連付け、 Actor がいつ戦闘を開始するのかを決定します。

タイプ 説明
Unaggressive(平和的) 0 戦闘に入りません。
Aggressive(攻撃的) 1 敵を見つけると攻撃します。
Very Aggressive(非常に攻撃的) 2 敵対者及び中立関係の者を見つけると、攻撃します。
Frenzied(凶暴) 3 視界に入った者は誰でも攻撃します。 Actor は、標準で Frenzied 設定になっていることは希です。通常、魔法や特殊効果(例えば激昂の呪文など)の結果でしかこの状態にはなりません。

※以下のサイトより抜粋
AI Data Tab/ja - Creation Kit

敵配置用のActorの設定を変更します。
f:id:rrryutaro:20170410203405p:plain
[Template Data]の[Use AI Data]のチェックを外して、変更できるようにします。
[AI Data]タブより、[Aggression]のコンボボックスから一番上の"Unaggressive"を選択します。

Scriptは以下のdefaultSetMultiAVTriggerScriptを利用することにしました。

ScriptName defaultSetMultiAVTriggerScript extends ObjectReference
{Sets the specified actor value on the actor(s) to the specified value when the player enters the trigger.}

import game
import debug

ObjectReference property Actor1 Auto
ObjectReference property Actor2 Auto
ObjectReference property Actor3 Auto
ObjectReference property Actor4 Auto
ObjectReference property Actor5 Auto

String property ActorValueName Auto
int property ActorValueValue Auto
bool property onlyOnce = True Auto
bool property evalPackageAfterwards = True Auto
bool property onlyPlayer = True Auto


auto State Waiting
	Event onTriggerEnter(ObjectReference obj)
		if (!onlyPlayer || obj == GetPlayer())
			if (Actor1 != None)
				(Actor1 as Actor).SetAV(ActorValueName, ActorValueValue)
			EndIf
			if (Actor2 != None)
				(Actor2 as Actor).SetAV(ActorValueName, ActorValueValue)
			EndIf
			if (Actor3 != None)
				(Actor3 as Actor).SetAV(ActorValueName, ActorValueValue)
			EndIf
			if (Actor4 != None)
				(Actor4 as Actor).SetAV(ActorValueName, ActorValueValue)
			EndIf
			if (Actor5 != None)
				(Actor5 as Actor).SetAV(ActorValueName, ActorValueValue)
			EndIf
			
			if (evalPackageAfterwards)
				if (Actor1 != None)
					(Actor1 as Actor).EvaluatePackage()
				EndIf
				if (Actor2 != None)
					(Actor2 as Actor).EvaluatePackage()
				EndIf
				if (Actor3 != None)
					(Actor3 as Actor).EvaluatePackage()
				EndIf
				if (Actor4 != None)
					(Actor4 as Actor).EvaluatePackage()
				EndIf
				if (Actor5 != None)
					(Actor5 as Actor).EvaluatePackage()
				EndIf
			EndIf
			
			if (onlyOnce)
				GoToState("AllDone")
			EndIf
		EndIf
	EndEvent
EndState

State AllDone
	Event OnTriggerEnter(ObjectReference obj)
		;Do nothing.
	EndEvent
EndState

アクター5人まで、任意のアクターバリューの設定を変更できるので、中々に汎用的なスクリプトではあると思います。
こうして使えそうなスクリプトを駆使するのも面白みはありますが、やりたい事がすんなり出来ないのでもどかしいですね。

次に、このスクリプトを利用するActivatorを登録します。
f:id:rrryutaro:20170410204758p:plain

プロパティはデフォルトで次の設定をしておきます。
f:id:rrryutaro:20170410204927p:plain

後は、マップ設定で、Triggerとして配置する位置と関連付けする敵の設定をします。
f:id:rrryutaro:20170410205132p:plain
これまでは、ただ単に向きを数値指定していただけでしたが、Triggerの配置は先頭に"T"を付けて、後は連番で、配置する向きは":"で区切って向きの数値。
敵の配置はそのまま向きの数値の後に、":"で区切って、Triggerの配置の"T"を除いた数値。
同じ場所に複数配置する場合、"/"で区切るとしました。
わかりづらいなぁと思いますが、まぁおいおいと最適化していきます。

この例だと、右下の部屋は部屋のドアの前に"T1"で1番目のTriggerを北側(1)に配置。
部屋にいる敵は南側(4)を向き、1番目のTriggerに関連付けています。

CKで見ると次のような感じです。
f:id:rrryutaro:20170410205647p:plain

スクリプトのプロパティは次のように配置した敵のFormIDを設定してあります。
f:id:rrryutaro:20170410210538p:plain

これで、扉に近付いた際に敵が敵対して動き出すようにできました。
本当は扉を開いた瞬間に動かすようにしたかったのですが、うまくできそうなスクリプトを発見できませんでした。
また、他の仕組みもまだよくわかっていません。

ちなみに、公開した後に気づきましたが、次のように結構Triggerの幅が狭いため、ギリギリ扉を開ける位置で開くと、感知しないため、遠距離での先制攻撃が出来てしまいます。
f:id:rrryutaro:20170410210828p:plain


今回の対応で、大体やりたいことは出来ました。
PS4版でフォロワーがうまくテレポートできなかったり、敵の反応方法を改善したりなど、そもそも敵の配置や種類の調整などやった方がいい事は多々ありますが、自動生成の仕組み作りとしてはほぼOKかなと思います。
今後改善するなら、よりウィザードリィらしい要素を加えたりなどで、より遊べるModになるでしょうか。

もっともソースコードはかなり汚くなったので、もしツールとして公開するなら、マップの仕組みなども含めて全体的に見直していかなければいけません。

そう考えるとまだまだ未完成ですね・・・


以上。

【2017/04/22 追記】
Mod製作についての動画を作成しました。
www.nicovideo.jp