UE4フォーラムページ:
https://forums.unrealengine.com/unreal-engine/mark...
フレームワークに関する質問がある場合は、お問い合わせページからご連絡ください。
バージョン 301 での変更点:
テキストがリッチ テキストとして表示されるようになりました。テキスト内で <b>bold<</>、または<iitalic</>引数を使用して>、太字または斜体にすることができます。山かっこ<>は現在リッチテキストの目的のために予約されていますのでご注意ください
テキスト校正システムでは、テキストライターエフェクト中にテキストボックスの側面で単語が分割されるのを防ぎます。これは VN Framework に追加する非常に複雑な機能であり、最初にゲームを起動したときに最初に調整するには数秒が必要です。
引数区切り記号は、フレームワーク全体で正規化され、特定の順序で分類されます。最初にすべての引数は [_] で区切られ、[*]、次に [~]、次に [^] で区切られます。その後、[,]。
フレームワークのバージョン間でスクリプトデータテーブルを移動する場合は、新しい区切り記号で SpecialEvents と SpecialEffects を更新する必要があります。
選択コードは、循環および入れ子になった選択肢内でのエラーの可能性を減らすために大幅にリファクタリングされています。
循環の選択肢をマークするには、次に、diamondbackChoice ポイントではなく、開始の選択肢行に_Cycle引数を追加する必要があります。例:選択肢
3*4_Cycle
Scene_DTの流れが変わりました。NextLevel と NextSublevel の列が[持続レベル]と[サブレベル]に変更され、次のシーンではなく現在のシーンのレベルが反映されるようになりました。
プレイヤーはDパッドの「L」または「アップ」を押して、これまでのシーンでテキストのログを表示できるようになりました
シーンは、通常のテキスト ボックスの代わりに連続した縦書きテキストを表示する NVL モードにすることができます。
ライン中に一時停止する新機能があります。{w=2} は、テキストを 2 秒間一時停止します。中かっこは、この目的のために予約されているか、テキスト内の変数を表示するために予約されています。
「NextLine」スペシャルイベントで複数の行でテキストを継続できます。
目次
このフレームワークの重要な概念
The Global_BP
マスター選択ログ
ゲームプレイモード
永続データ
インポート用のスクリプトの準備
文字設定
スプライトのインポート
キャラクターレイヤー
サイドポートレートレイヤー
コスチュームが上書き
文字の定義
シーンでのキャラクタの表示
シーンのセットアップと起動
シーンの定義
シーンの起動
シーン データテーブルを埋める
シーンブランチ
シーンの選択肢
ネストされた選択肢
サイクリングの選択肢
統計システム
CG の表示
特殊効果
カメラ
条件付きシーン
レベル
Main_Persistentレベルの説明
レベルのナビゲート
他
ギャラリーシステム
音(音楽、声の演技など)を使用する
テキスト効果(一時停止、変数)
リッチテキスト
ラインキャリブレーション
The Global_BP
私は、これらの手順の「Global_BP」を頻繁に参照しますが、VN Framework の設計図でよく使用されます。Global_BPは、このVN_Frameworkに使用されるグローバルゲームインスタンスと呼ばれるものです。保存、読み込み、レベルの変更、ゲームプレイモードの切り替えなど、カスタマイズされたコードがたくさん含まれています。
新しいアクターでGlobal_BPへの独自の参照を作成する必要がある場合は、ノード"ゲームインスタンスの取得" を表示します。戻り値を「キャスト」にドラッグしてGlobal_BPします。キャストの戻りノードを使用して、変数をプルするか、Global_BPを通して関数を実行します。
マスター選択ログ
MasterChoiceLog は、ゲーム内で行われたすべての選択を自動的に追跡するGlobal_BPに格納される大きな配列です。デフォルトでは、この配列の長さは 200 です。この長さを変更するには、Global_BPを開いて NewGame 関数を展開します。これは、明確なマスターチョイスログが最初に作成される場所です。
シーン内の分岐が正しく機能するためには、MasterChoiceLog の最初のインデックス 0 が常に 0 のままでいることが重要です。それ以外の場合は、1~200の選択肢を追跡できます。その選択項目に割り当てるオプションには、自動的に 1 から 5 の値が割り当てられます。プレイヤーが最初のオプションを選択すると、値 1 はマスターチョイスログの割り当てられたインデックスに保存されます。
ゲームに選択肢をコーディングする場合は、いつでも、マスターチョイスログにストレージのインデックス値を入力する必要があります。私は、各インデックスに割り当てたストーリーの選択肢をリストする別のドキュメントを保持したいと思います。後で、MasterChoiceLog 値を参照して、プレイヤーの決定に基づいてブランチを作成したり、シーンを変更したりできます。
ゲームプレイモード
この VN Framework は、クリックスルー テキスト以外のゲームプレイ要素を持つプロジェクトに使用できます。シーンが開始したか終了したかによって自動的に変更されるようにモードを設計しました。しかし、私はあなたがあなた自身の目的のためにそれらを変更したい場合に備えて、ここであなたに異なるモードを説明します。
メニューモード
このモードは、画面上でウィジェットが作成されるときに有効になります。これは、WD_Menu_Parentの下に作成したファミリによって自動的にトリガーされます。メニューモードで発生する事柄を次に示します。
メニューモードと呼ばれるGlobal_BP内の変数?True に設定されます
プレイヤーコントローラは、(VN_Framework >の設計図で見られる)ウィジェットコントローラと呼ばれるポーンを所有しています。ウィジェットコントローラには、キーボード、マウス、またはゲームパッドでメニューをナビゲートするために使用されるコードが含まれています。
イベント MenuMode トリガーは、BPI_Modes インターフェイスを持つ任意のアクター
メニューモードが有効な場合に、独自のアクターに何かをさせたい場合は、インタフェースBPI_Modes(VN_Framework >Blueprints >インタフェース)へのアクセス権を与えます。インターフェイスは、[クラス設定]メニューのブループリントに追加できます。BPI_Modesインターフェイスは、開始されたときにイベント MenuMode をトリガーします。
メニュー モードでの動作の詳細を表示するには、Global_BPを開き、イベント SetMenuMode を検索します。
通常/ゲームプレイモード
これは、ビジュアルノベルシーンの外の世界をナビゲートするために使用される独自のカスタムゲームプレイモードと考えることができます。この VN フレームワーク用に作成した例では、通常モードでは FirstPersonCharacter (VN_Framework >ブループリントにあります) を制御し、3D 空間を歩き回ることができます。必要に応じて、これを自分のプレイヤーコントローラーに変更できます。
ノーマルモードでの動作の内訳を次に示します。
メニューモードと呼ばれるGlobal_BP内の変数?偽に設定されます
プレイヤー コントローラは、最初の Person 文字を所有しています。
イベント GameplayMode は、BPI_Modes インターフェイスを持つ任意のアクターに対してトリガーされます。
通常モードで使用するプレーヤーコントローラを変更する場合は、Global_BPを開いて PlayerClass の変数を見つけます。カスタム コントローラに合わせて変更します。ただし、完全なコントローラスイッチは本質的にフレームワークでサポートされていないので、他のいくつかの場所でVN Frameworkのコードを変更し続ける場合にのみこれを行うことをお勧めします。VN フレームワークで FirstPersonCharacter への他の参照を検索し、独自の文字に置き換える必要があります。FirstPersonCharacter ブループリントには、vN フレームワークで動作するように設計されたコード (TouchClickActor_BP ファミリのアクターとの対話やオプション メニューの開くなど) も含まれています。
通常モードが有効な場合に独自のアクターに反応させたい場合は、インターフェイス BPI_Modes (VN_Framework >ブループリント>インターフェイス) へのアクセス権を付与します。インターフェイスは、[クラス設定]メニューのブループリントに追加できます。BPI_Modesインターフェイスは、起動時にイベント GameplayMode をトリガーします。
通常モードでの動作の詳細を表示するには、Global_BPを開き、イベント SetNormalMode を検索します。
シーンモード
名前が示すように、シーンの再生中にこのモードがトリガーされます。簡単な内訳を次に示します。
シーンプレイングと呼ばれるGlobal_BPの変数?True に設定されます
プレイヤーコントローラはウィジェットコントローラを所有しています
BPI_SceneTriggers インタフェースを持つアクターのイベント SceneStart トリガー
ノーマル モードでの動作の詳細を表示するには、Global_BPを開いてイベント SceneMode を検索します。
インポート用のスクリプトの準備
必要に応じて、ST_ScriptLines構造体を使用して新しいデータテーブルを作成することで、すべてのスクリプトを直接 UE4 で作成できます。しかし、現実的には、ほとんどのライターは、独自のワープロソフトウェアでスクリプトを書き、後でスクリプトをアップロードすることを好みます。インポート用の外部スクリプトを準備する手順をいくつか示します。
OptionA: 私が作成したPythonスクリプトを使用して、ダイアログ.txtファイルを互換性のある.csvファイルに自動的に再フォーマットします。あなたはここでそれをダウンロードすることができます:
https://github.com/jgibbons25/spreadsheetAuto、ここでそれを使用する方法のビデオです:
OptionB: 何らかの理由で私のオートメーションスクリプトを使用したくない場合は、スクリプトを手動で変換するためのステップバイステップのプロセス
https://youtu.be/bN6s24dwb2Y
オプションC:以下の指示に従ってください。
今後の例では、次の形式でスクリプトを記述すると仮定します。
CHARACTER1:ここでいくつかの対話です!
CHARACTER2:ここに機知に富んだカムバックがあります!
また、UE4 への最後のインポートステップに進む前に、スクリプトを個々のシーンに分割することをお勧めします。これにより、VN Framework 内で各シーンを個別にトリガーできます。
変換時間が近づくと、次の手順に従ってスクリプトを準備します。
[CHARACTER1: ] のすべてのインスタンスを検索し、[;文字 1;何もない;;]。セミコロンは、スプレッドシート内の空白になる列を表します。[CHARACTER1: ] を検索すると、意図的に空白を含め、検索処理によって削除されます。置換する場合は、VN Framework プロジェクトの列挙文字リストに一致する文字名のバージョンを使用する必要があります。
ナレーターを含む、スクリプトで話すすべての文字に対して手順 1 を繰り返します。
各改行を検索し (一部のテキスト エディターでは [$] 記号を使用して改行を検索します)、次に [;;;\ で置き換える]n].
ドキュメントを.txtファイルとして保存する
保存したファイルを参照し、接尾辞を.txtから.csvに変更します。
選択したスプレッドシートソフトウェアで.csvファイルを開きます
以下に示すように、列のタイトルを設定します:
スピーカー式サウンドテキスト特殊イベント特殊効果 CharHorizontal CharScale 1 最初の列ヘッダーが意図的に空白のままであることに注意してください。これは自動的に UE4 の行名に使用される列です
最左の列 (ヘッダーなし) を上から下に番号付けします (上記の 1 から始まります)。この列は UE4 によって行名として解釈され、空白にすることはできません。整数は必要ありませんが、便利な追跡に推奨されます。行名に関係なく、スクリプトは上から下に読み込まれます。
準備ができたら、ドキュメントを.csvとして再度保存します。最後のフィールド区切り文字としてコンマ (,) を使用することが重要です。
最後に、.csvファイルを閉じます。UE4 に直接ドラッグするか、プロジェクトのコンテンツ ブラウザから[インポート]ボタンを押します。選択すると、UE4 は構造を選択するように求めます。[ST_ScriptLines] を選択します。そして、ボイラ、あなたはあなたのスクリプトをインポートしました!
キャラクターの作成
ゲームに新しいキャラクターを追加する準備ができたら、テンプレートのキャラクターを定義するために必要な手順がいくつかあります。
以下の個々の手順に従うか、このチュートリアルビデオに従ってください。
この 2 番目のチュートリアルでは、スプライトをトリミングする方法、ウィジェットのパディング情報を設定する方法、およびテクスチャ メモリを節約するためにスプライト シートを作成する方法について説明します。
キャラクタスプライトをインポートする
このVNフレームワークは、ゲームの効率と多様性のために多数のスプライト層を処理するように設定されています。ただし、レイヤーが多いキャラクタを作成したくない場合は、それも問題ありません。各キャラクターに対して、必要な数のレイヤーを使用できます。
参考までに、私が「フレームワークチュートリアル」で Jessica で使用したスプライトを見ることができます。VN_Framework >アートアセット>キャラクター>ジェシカに行き、彼女のすべてのスプライトを見てください。
キャラクタ レイヤーの設定を開始する前に、使用可能な [式] の最初のリストを確認してください。列挙型>式VN_Framework >で確認できます。これは、必要に応じて使用または編集できる基本リストです。選択する式の数を減らす場合は、右端の 「x」 を選択して行を削除します。新しい式を追加する場合は、右上の [新規] ボタンを押して、新しい式名を入力します。
次のレイヤーを選択する場合は、各文字式に使用できます。
ボディ スプライト – これはスプライトのベースボディです。あなたは、完全な層システムを使用している場合は、このボディは、衣服や頭を含めるべきではありません。
服 - キャラクターの服は、この層に行きます.キャラクターがゲーム全体で衣装を変更した場合、このレイヤーはフレームワーク内の変数を使用して別のスプライトに切り替えることができます。
Head – このレイヤーは、通常、髪のない、キャラクターの頭のためのものです。システムを意図したとおりに使用するには、異なる式に異なるヘッド スプライトを使用します。
ヘアフロント – これは、キャラクタのヘアのメイン レイヤーです。ほとんどのキャラクターにとって、これは髪を表示するために必要な唯一のレイヤーです。ただし、キャラクターの髪が長い場合は、衣服や体の後ろを流れる後ろ髪用の別のレイヤーを作成する必要があります。その場合は、次のレイヤーを使用できます。
ヘアバック – この層は、髪の後ろの層の体と服の後ろに行きます.
ワイルドカード – 他のレイヤーがニーズに対応できない場合に、このレイヤーを使用する場合があります。たとえば、このレイヤーを使用して、キャラクターにネックレスやメガネを追加できます。このレイヤーを使用する場合は、必要に応じて ParentActor で Z オーダーを調整し、WD_Dia必要があります。
BlinkFB – このレイヤーでは、キャラクターの目が点滅するアニメーションフリップブックを作成できます。画面上にある限り、ランダムな間隔で自動的に点滅し続けます。
MouthFB – キャラクターの口の動きのためのフリップブックを作成することもできます。VN フレームワークは、キャラクタが話している間、このレイヤーを使用するように設定されています。ライン上にオーディオクリップがある場合、オーディオクリップの間は口が動き続けます。ゲーム内の口のアニメーションはランダムなフレームを使用して移動することに注意してください。実際には、フォワードループでフリップブックを再生するわけではありません。フリップブックからフレームをプルし、ランダムに再生します。
スプライトを作成するには、コンテンツ ブラウザで[インポート]を押すか、ファイルエクスプローラからファイルをドラッグして、テクスチャ(おそらく.pngファイル)をインポートします。次に、テクスチャを右クリックし、[スプライト アクション]を選択>スプライトを抽出します。代わりに[スプライトを作成]を使用することもできますが、スプライトシートを作成するのに便利な各テクスチャの周りの透明度が自動的に切り取られますので、Extractを好みます。
スプライトの設定
デフォルトでは、ParentActor (各キャラクタの表示に使用される基本ブループリント アクター) は、スプライトのマテリアルを TranslucentUnlitSpriteMaterial に設定します。これを変更する場合は、ParentActor のビューポートで調整したり、特定のキャラクタ用にカスタムの子アクターを作成したりできます。
最良の結果を得るには、スプライト レイヤーの新しいテクスチャを読み込むたびに、テクスチャ(スプライトではなくテクスチャ)に入ります。ダブルクリックして詳細を開き、MipGenSettings を NoMipMaps に変更します。そうしないと、スプライト レイヤーがゲームに最初に表示されるときにぼやけて見えます。
キャラクターレイヤーの定義
スプライト レイヤーをプロジェクトにインポートしたので、フレームワークにそれらの処理を指示する必要があります。これを行うには、キャラクタ スプライト情報を含むデータテーブルを作成する必要があります。
ポーズデータテーブル
VN Framework に表示する内容を伝えるために、主に 2 つのデータテーブルを作成します。1つ目は「Pose」データテーブルと呼ばれるもので、各キャラクタポーズの情報が含まれています。必要な場合は、Pose1(デフォルト)を使用するだけで、他のどれも使用できません。
[VN_Framework >] に移動します。キャラクタ用の新しいフォルダを作成します。フォルダを開きます。
空の領域を右クリックし、[その他の>データテーブル] を選択します。構造を選択するように求めるプロンプトが表示されます。[ST_PoseData] を選択します。最適な組織化のために、DT_CharName_Poses_0のような名前を付けます。最後の「0」は、このデータテーブルがデフォルトのコスチューム、値0に使用されることを思い出させます。後で他のコスチューム用に新しいポーズデータテーブルを作成することもできます。
新しいデータテーブルを開きます。
新しい行を作成します。これを行うには、[行エディター] ウィンドウを見つけて、プラス記号 + を選択します。
ここでは行名は重要ではありません (デフォルトでは、UE4 の場合は NewRow という名前が付けられます)。個人的には、私はこれを数字に変更するのが好きですが、それは完全にあなた次第です。
[ポーズ] 列で、[VN_Framework > ポーズ] の一覧から選択します。ポーズが 1 つだけの場合は、デフォルトの Pose1 の行を作成するだけです。ポーズを増やしたい場合は、ポーズごとに行を追加します。
各行に対して、使用する各ポーズの適切な列にスプライトをドロップします。
そのポーズを使用する各エクスプレッションごとに、VN フレームワークは最初に PoseDT からスプライトを取り込み、次に ExpressionDT で塗りつぶされたレイヤーでスプライトを上書きします。この方法を使用すると、式を作成するときに多くの情報を繰り返す必要はありません。
式データテーブル
VN_Framework >で、キャラクターに合ったフォルダに移動します (または新しいフォルダを作成します)。
空の領域を右クリックし、[その他の>データテーブル] を選択します。構造を選択するように求めるプロンプトが表示されます。ST_PoseLayersを選択します。最適な組織を作成するには、DT_CharName_Cost0のような名前を付けます。最後の「Cost0」は、このデータテーブルがベースの衣装、値0に使用されることを思い出させます。他のコスチューム用に、後で新しい式データテーブルを作成することもできます。
新しいデータテーブルを開きます。
新しい行を作成します。これを行うには、[行エディター] ウィンドウを見つけて、プラス記号 + を選択します。
ここでは行名は重要ではありません (デフォルトでは、UE4 の場合は NewRow という名前が付けられます)。個人的には、私はこれを数字に変更するのが好きですが、それは完全にあなた次第です。
新しい行をクリックし、[行の値] ウィンドウを展開します。ここでは、行の各列を編集できます。
Pose – これは、キャラクタがその表現に使用するポーズです。VN フレームワークは、最初に PoseDT のスプライトを使用し、その式の式 DT にリストするスプライトで上書きします。ポーズを使用していない場合は、必要に応じて、ExpressionDT ですべてのスプライトを定義できます。
式 – ここで定義する最初の式を選択します。式ごとに新しい行を作成します。私はキャラクターのデフォルトの状態であるNormal式から始めるのが好きです。
残りの列については、必要に応じて、キャラクタにインポートしたレイヤーをドロップします。レイヤーを使用しない場合は、空白のままにします (なし)。たとえば、レイヤーシステムをまったく使用していない場合は、BodySprite 列に完全な文字スプライトを入力し、残りを空白のままにします。
式の列挙型リスト内のすべての式に対して一意の行を作成します。すべての式に新しいスプライトがない場合でも、その式が呼び出された場合にフレームワークが使用するレイヤーを定義する必要があります。
サイドポートレートレイヤーの作成
VN Framework のバージョン 1.2 以降では、サイドポートレートを表示するために別々のスプライトを作成する必要はありません。VN フレームワークは、PoseDT および ExpressionDT で指定したデータを使用して、サイド ウィジェットにキャラクタを表示します。
コスチュームが上書き
場合によっては、キャラクターに衣装を変更させたいことがあります!このような状況では、他のコスチュームのレイヤー情報を保持する追加のデータテーブルを作成できます。
コスチュームを上書きするには:
この手順を繰り返して、交換するコスチューム レイヤーを使用して、新しい PoseDT とオプションの ExpressionDT を作成します。あなただけの元の衣装を上書きしたいレイヤーを埋める必要があります。変更されないスプライトは空白のままでいることができます
キャラクタのレイヤー DT フォルダ (VN_Framework > CharData > Jessica_DTsなど) を開きます。
新しい PoseDT を作成し (以前のように、構造体ST_PoseDataを使用します)、サフィックスを変更して新しいコスチュームを表すようにDT_CharName_Poses_1
特定の式が PoseDT にリストされているスプライトとは異なるスプライトを使用する場合にのみ、新しい ExpressionDT を作成する必要があります。新しい ExpressionDT を作成し (以前のように、構造体ST_PoseLayersを使用する)、サフィックスを変更して新しいコスチュームを表すような接尾辞を変更DT_CharName_Cost1
キャラクタ データテーブル用に作成したフォルダに移動します。空の領域を右クリックし、[その他の>データテーブル] を選択します。構造を選択するように求めるプロンプトが表示されます。ST_LayerOverwritesを選択します。
新しいデータテーブルにDT_CharName_CostOW(OWは上書きの略)などの名前を付けます。フレームワークの例は、CharData > Jessica_DTs > VN_Framework >DT_Jess_CostOW
データテーブルに 4 つの新しい行を作成します。次の行名を指定します。
コスチューム(ここは衣装の表現DTが行く場所です)
髪(これは髪の表現DTが行く場所です)
ポーズコスチューム(コスチュームのPoseDTが行く場所です)
PoseHair (この場合、ヘアの PoseDT が行く)