テキストプリンター
テキストプリンターは、テキストメッセージを表示するアクターです。メッセージは時間をかけて徐々に表示できます。
プリンターの動作は、Naninovel -> Configuration -> Text Printers エディターメニューを使用して構成できます。利用可能なオプションについては、構成ガイド を参照してください。プリンターのリソースマネージャーには、Naninovel -> Resources -> Text Printers エディターメニューを使用してアクセスできます。
シナリオスクリプトでは、テキストプリンターは主に @print および @printer コマンドで制御されます。
; 「Dialogue」プリンターをデフォルトにします
@printer Dialogue
; 「Fullscreen」プリンターをデフォルトにします
@printer Fullscreen
; デフォルトのプリンターを使用してフレーズを表示します
@print text:"吾輩は猫である。名前はまだ無い。"
; 上記と同じですが、汎用テキスト行を使用します
吾輩は猫である。名前はまだ無い。
; 上記と同じですが、キャラクター「Felix」に関連付けられています
Felix: 吾輩は猫である。名前はまだ無い。組み込みプリンターはUIとして実装されていますが、依然としてアクターであり、すべてのアクター関連の可視性の変更(表示/非表示アニメーション)は、対応するコマンドまたはアクター構成で設定された時間を使用することに注意してください。たとえば、@showPrinter コマンドの time パラメーターは表示アニメーションの時間を制御し、指定されていない場合は、プリンターアクター構成プロパティの Change Visibility Duration がデフォルトの時間として使用されます。この場合、プリンターUIプレハブのルートにある Fade Time プロパティは無視されます。
オートプレイ
オートプレイ機能により、入力待ち(クリックで続行)イベントでスクリプトの実行を自動的に継続できます。
入力待ちコマンド([-] コマンド)は、プレイヤーが Continue 入力をアクティブにするまでスクリプトの実行を停止します。これらは通常、テキストメッセージを表示した後に使用されます。オートプレイモードの場合、[-] コマンドは代わりに一定期間スクリプトの実行を停止してから完了し、次のコマンドが実行されるようにします。停止時間は、最後に表示されたテキストメッセージの長さによって異なり、ゲーム設定の「Auto delay」によってさらに調整されます。
オートプレイモードは、AutoPlay 入力(デフォルトでは A キー)またはコントロールパネルの「AUTO」ボタンを使用して切り替えることができます。
テキストのスキップ
テキストのスキップ機能により、@print コマンドの実行を早送りして、テキストの表示プロセスを実質的にスキップできます。
スキップモードは、Skip 入力(デフォルトでは Ctrl キー)を押し続けている間有効になるほか、ToggleSkip 入力(デフォルトでは Tab キー)またはコントロールパネルの「SKIP」ボタンで切り替えることもできます。
デフォルトでは、スキップモードは過去にすでに実行されたコマンドを実行しているときにのみ使用できます。たとえば、これから表示されるテキストをプレイヤーがまだ読んでいない場合、スキップモードは使用できません。これは、ゲーム設定の「Skip mode」設定を使用して変更できます。
プリンターバックログ
プリンターバックログは、プレイヤーが以前に表示されたテキストを読み直したり、選択した選択肢を確認したり、ボイスのある行を再生し直したり、(オプションで)ログに記録されたメッセージにロールバックしたりできる機能です。
バックログは、メインゲームループ中にいつでも ShowBacklog 入力(デフォルトでは L キー)をアクティブにするか、コントロールパネルの「LOG」ボタンを押すことで表示できます。
さまざまなバックログUIプロパティは、プレハブのルートにアタッチされたコンポーネントを介してカスタマイズ可能です。それぞれが何を制御するかについては、プロパティのツールチップを参照してください。
UIのカスタマイズと構成方法の詳細については、組み込みUIのカスタマイズガイド を参照してください。
プリンターアクター構成の Add To Backlog プロパティを無効にすることで、特定のテキストプリンターがメッセージをバックログに追加するのを防ぐことができます。
メッセージテンプレート
メッセージテンプレートを使用して、テキストメッセージの追加処理を自動化できます。処理は、実行時に @format コマンドを使用するか、エディターでプリンターパネルUIの Default Templates プロパティを使用して、各テキストプリンターに対して個別に構成されます。たとえば、以下は組み込みの Fullscreen プリンターのデフォルトのフォーマットテンプレートです。
任意のテキストフォーマットタグまたは文字を指定でき、%TEXT% はメッセージテキストに、%AUTHOR% は話者の表示名に置き換えられます。たとえば、次のテンプレートを考えてみましょう:“%TEXT%” — <i>%AUTHOR%</i>。このテンプレートは、表示されるメッセージを引用符で囲み、その後にダッシュとイタリック体の話者名を続けます。たとえば、そのようなテンプレートで処理された Kohaku: 吾輩は猫である。 は次のようになります。
割り当てられたテンプレートは順番に適用され、Author プロパティを使用すると、表示されるメッセージの話者に基づいて適用するテンプレートをフィルタリングできます。話者(キャラクターアクター)IDを指定するとテンプレートはその特定の話者にのみ適用され、+ を指定すると話者のあるすべてのメッセージに、- を指定すると話者のないメッセージに、* を指定するとすべてのメッセージに適用されます。
Dialogueプリンター
Dialogueプリンターは、高さが可変のウィンドウ内にテキストを表示します。最初は画面サイズの約3分の1を占め、コンテンツがより多くのスペースを必要とする場合は高さを増やします。Dialogueプリンターは、関連付けられたキャラクター名もテキストウィンドウの上のラベルに表示します。
Wideプリンター
WideプリンターはDialogueプリンターと非常によく似ていますが、パネルレイアウトの一部がワイドディスプレイ向けに調整されています。Wideプリンターは キャラクターアバター 機能もサポートしています。
Fullscreenプリンター
Fullscreenプリンターは、固定サイズのウィンドウ内にテキストを表示します。画面の大部分を占め、大量のテキストを表示することを目的としています(別名「NVL」モード)。
Fullscreenプリンターは、デフォルトでは連続する各printコマンドでテキストをリセットしません。代わりに、必要に応じて @resetText コマンドを使用してプリンターの内容をクリアします。これは、プリンターアクター構成メニューで Auto Reset を有効にすることで変更できます。
Fullscreenプリンターによって処理される各printコマンドは、デフォルトでは、表示するテキストの前に2つの改行を追加します(プリンターの現在の内容が空の場合を除く)。これは、プリンタープレハブの Revealable Text Printer Panel コンポーネントで Auto Line Breaks をゼロに設定することで無効にできます。
以下は、Fullscreenプリンターの使用例です。
; Fullscreenプリンターをアクティブにします。
@printer Fullscreen
; 次の行は同じウィンドウに表示され、2つの改行で区切られます。
吾輩は猫である。名前はまだ無い。
どこで生れたかとんと見当がつかぬ。何でも薄暗いじめじめした所でニャーニャー泣いていた事だけは記憶している。
吾輩はここで始めて人間というものを見た。
; プリンターの内容をクリアします。
@resetText
; さらに行を表示します。
しかもあとで聞くとそれは書生という人間中で一番獰悪な種族であったそうだ。
...Chatプリンター
Chatプリンターは、モバイルメッセンジャーアプリのように、縦方向にスクロールできるウィンドウ内のメッセージバブルにテキストを表示します。表示エフェクトの期間中は、メッセージを1文字ずつ表示する代わりに「話者が入力中」のアニメーションを表示し、その後メッセージを即座に表示します。Chatプリンターは キャラクターアバター 機能をサポートしています。
Chatプリンター内に選択肢を埋め込むには、ChatReply 選択肢ハンドラーを参照してください。Chat Printer Panel コンポーネントにある Choice Handler Id プロパティを介してカスタムハンドラーを指定することもできます。
Bubbleプリンター
Bubbleプリンターは、マンガ/コミックスタイルのテキスト表示(「吹き出し」とも呼ばれる)に使用できます。
組み込みのBubbleプリンターは、「Left」と「Right」の2つの外観をサポートしており、キャラクターのどちら側に配置されるかに応じてプリンターの向きを合わせるために使用できます。
@printer Bubble.Left pos:42,80 !visible time:0
@show Bubble
Misaki: 吾輩は猫である!
@char Nanikun.Happy
@printer Bubble.Right pos:53,55 !visible time:0
@show Bubble
Nanikun: Integer nec maximus elit, eget posuere risus.一度に複数のBubble(またはその他の)プリンターを表示するには、カスタムプリンターを追加します。
バブルアンカー
Bubbleプリンターを多用する場合、毎回手動で位置を指定するのは面倒です。代わりに、アクターアンカーを使用して、Naninovelがバブルをそれぞれのキャラクターに合わせて自動的に配置するようにします。
この機能を有効にするには、キャラクターアクター 内でアンカー位置を指定します。方法は2つあります。
- キャラクターメタデータで、
Anchorsリストを使用し、BubbleIDとアクターのゲームオブジェクト内のローカル位置を持つレコードを追加します。 - キャラクターがプレハブ(たとえば、レイヤー、汎用、またはLive2D)の場合、プレハブ内に空のゲームオブジェクトを作成し、
Actor Anchorコンポーネントをアタッチし、BubbleをアンカーIDとして割り当てます。
正しく構成されると、Naninovelはプリンターをアンカーの位置に配置するだけでなく、そのままでは画面からはみ出す場合には反転させます。プリンターが反転しているかどうかに応じてより正確に配置するために、キャラクターごとに複数のアンカーを指定できます。以下はサポートされているアンカーIDです。
| アンカーID | 説明 |
|---|---|
Bubble | 他のどれも適合しない場合のデフォルトまたはフォールバックアンカー。 |
Bubble/TopLeft | バブルが左上隅に配置されている場合に使用されます。 |
Bubble/Top | バブルが上端に配置されている場合に使用されます。 |
Bubble/TopRight | バブルが右上隅に配置されている場合に使用されます。 |
Bubble/Left | バブルが左端に配置されている場合に使用されます。 |
Bubble/Right | バブルが右端に配置されている場合に使用されます。 |
Bubble/BottomLeft | バブルが左下隅に配置されている場合に使用されます。 |
Bubble/Bottom | バブルが下端に配置されている場合に使用されます。 |
Bubble/BottomRight | バブルが右下隅に配置されている場合に使用されます。 |
すべてを指定する必要はありません。Naninovelは、完全に一致するものがない場合でも、最適なものを選択します。たとえば、左上に配置されているが Bubble/TopLeft がない場合、Bubble/Left、次に Bubble/Top を確認し、最後に Bubble にフォールバックします。
以下は、4つのアンカー(コーナーごとに1つ)を指定する例です。
例
キャラクターメタデータとプレハブ内の両方を介してバブルアンカーを設定する例については、サンプルプロジェクト の Content/Characters にある Hiyori および Senko Live2Dキャラクターを確認してください。
カスタムBubbleプリンターを作成する場合、反転と配置の動作は Floating Printer プロパティで構成できます。各プロパティが動作にどのように影響するかについては、ツールチップを参照してください。
アンカーによる自動配置を使用している場合でも、バブルを手動で配置したい場合があります。これは @printer コマンドを使用して行うことができます。コマンドで明示的な位置が指定されている場合、自動配置は一時的に無効になります。再度有効にするには、anchor! フラグを使用します。
; 自動配置を無効にし、バブルを手動で配置します
@printer Bubble pos:50,50
...
; 自動配置を再度有効にします
@printer Bubble anchor!カスタムプリンターの追加
組み込みテンプレートに基づいてカスタムテキストプリンターを追加したり、ゼロから新しいプリンターを作成したりできます。たとえば、組み込みの Dialogue テンプレートをカスタマイズしてみましょう。
Create -> Naninovel -> Text Printer -> Dialogue アセットコンテキストメニューを使用して、Naninovelパッケージの外部(例:Assets/TextPrinters フォルダー)にDialogueプリンターのプレハブを作成します。
プレハブを編集します:フォント、テクスチャの変更、アニメーションの追加など。利用可能なUI構築ツールの詳細については、uGUIのUnityドキュメント を参照してください。UIのカスタマイズガイド には、uGUIの操作に関するいくつかのチュートリアルビデオとサンプルプロジェクトもあります。
Naninovel -> Resources -> Text Printers エディターメニューからアクセスできるプリンターマネージャーGUIを使用して、プレハブをエンジンリソースに公開します。+(プラス)ボタンを使用して新しいレコードを追加し、アクターID(プレハブ名と異なっていてもかまいません)を入力し、レコードをダブルクリックしてアクター設定を開きます。プリンタープレハブを Resource フィールドにドラッグアンドドロップします。
これで、@printer コマンドを介してアクティブ化し、マネージャーで設定したアクターIDを指定することで、新しいテキストプリンターを使用できます。
@printer MyNewPrinter例
カスタムプリンターを追加する例については、サンプルプロジェクト を確認してください。プレハブは Content/Printers/Demo/Prefabs/DemoPrinter.prefab として保存されています。
ITextPrinterActor インターフェースを手動で実装して、ゼロからプリンターを作成することも可能です。詳細については、カスタムアクターの実装 に関するガイドを参照してください。
テキスト表示エフェクト
表示されるテキストメッセージの表示進行度は、UnityのTMPro Textをラップし、同じ機能をすべてサポートする Revealable Text コンポーネントによって管理されます。そのために、現在の表示進行度に応じて最大表示文字数を制限する Reveal Clipper などの独立したコンポーネントが使用されます。ほとんどの組み込みプリンターには Reveal Fader コンポーネントも適用されており、表示される文字にグラデーション状の不透明度フェードを追加します。
表示エフェクトの強度(フェードがどこまで伸びるか)を変更するには、Length プロパティを変更します。
Slack Opacity が1未満の場合、最後の追加の前に表示されたテキストの不透明度は、Slack Duration 秒かけて指定された値にフェードします(これは、組み込みの Fullscreen プリンターでデフォルトで有効になっています)。
テキストプリンターの寸法が一定で、さまざまなメッセージの長さやフォントサイズに対応できない場合は、TMProのテキストオーバーフローモードを「page」に設定し、Reveal Paginator コンポーネントを追加します。これにより、現在表示されているページが表示進行度と同期されます。設定例については、組み込みの Fullscreen プリンターを参照してください。
テキストスタイル
テキスト内に配置されたリッチテキストタグを使用するか、@format コマンドを使用して、さまざまなテキストスタイルを適用できます。
; 「吾輩」を太字で、「猫」を青とイタリック体で表示します。
Kohaku: <b>吾輩</b>は<color=#0000FF><i>猫</i></color>である。利用可能なタグについては、TMProリッチテキストドキュメント を参照してください。
ヒント
特定のキャラクターまたはプリンターによるすべてのメッセージに特定のテキストフォーマットまたはスタイルを適用したい場合は、メッセージテンプレート 機能を確認してください。
ルビ(ふりがな)
ルビ 文字のサポートは、カスタム <ruby> タグを介してNaninovelの Naninovel TMPro Text コンポーネント(Revealable Text はこれに基づいています)によって提供されます。上にルビ文字を配置するテキストをルビタグで囲み、タグ内にルビテキストを指定します。例:
吾輩は<ruby="ねこ">猫</ruby>である。名前はまだ無い。— 実行時にメッセージが表示されると、「ねこ」ルビテキストが「猫」という文字のすぐ上に表示されます。
注意
他のタグと <ruby> を組み合わせる場合は、書式崩れを防ぐために、先にルビタグを指定してください。例:
吾輩は<ruby="ねこ"><tip="TipID">猫</tip></ruby>である。名前はまだ無い。プリンタープレハブで使用される Naninovel TMPro Text コンポーネントのプロパティを変更することで、ルビテキストのサイズと垂直方向の行オフセットを追加で制御できます。
Ruby Size Scale はメインテキストに対するルビテキストのフォントサイズの比率を設定し、Ruby Vertical Offset はルビテキストの垂直方向の行オフセットを設定します(使用できる単位は em、px、%)。Revealable Text コンポーネントにはさらに Reveal Ruby Instantly プロパティ(デフォルトで有効)があり、ルビテキストを1文字ずつ表示する代わりに即座に表示します。
以下は、動作中のルビタグのビデオデモンストレーションです。
右から左(アラビア語)テキスト
RTLテキストの表示エフェクトのサポートは、すべての組み込みプリンターで有効にできます。
プリンターでRTLテキストを使用するには、次の手順を実行します。
- 任意の組み込みテンプレートからカスタムテキストプリンターを作成します。
- プリンター内の
Revealable TextコンポーネントでEnable RTL Editorプロパティを設定します。 - 同じコンポーネント(「Naninovel Settings」ドロップダウンの下)で
Fix Arabic Textプロパティを有効にします。
互換性のあるフォント とアトラス構成を使用することを忘れないでください。以下はその例です。
Font Size: Auto Sizing
Font padding: 5
Packing Method: Optimum
Atlas res: 1024x1024
Character Set: Unicode Range (Hex) with this Sequence:
20-7E,600-603,60B-615,61B,61E-61F,621-63A,640-65E,660-6DC,6DF-6E8,6EA-6FF,750-76D,FB50-FBB1,FBD3-FBE9,FBFC-FBFF,FC5E-FC62,FD3E-FD3F,FDF2,FDFC,FE80-FEFC
Font Render Mode: Distance Field 16例
右から左(アラビア語)テキストをサポートするカスタムTMProプリンターの設定の完全な例については、RTLサンプル を参照してください。
注意
Unityはアラビア語テキストをネイティブにサポートしていません。アラビア語をサポートする必要があるテキストラベル(プリンター以外)には、Naninovel TMPro Text コンポーネントを使用することを検討してください。
CJK言語
中国語、日本語、韓国語には固有の文字が数多くありますが、ゲームで通常必要なのはそのごく一部だけです。生成されるフォントアトラスのサイズを最適化するために、TMProにはSDFテクスチャを作成する対象の文字セットを指定するオプションがあります。
Naninovelによって表示される文字を調べるには、Naninovel -> Tools -> Character Extractor エディターメニューからアクセスできるCharacter Extractorユーティリティを使用します。
ツールは、指定されたフォルダー(すべてのサブフォルダーを含む)内のシナリオスクリプトと管理テキストドキュメントの両方を調べるため、プリンターで表示されるすべてのテキスト、UIラベル、アンロック可能なヒントなど、Naninovelがプレイヤーに表示するすべてのテキストの文字を取得できます。
例
日本語ロケール用にカスタムTMProフォントアトラスを使用する例については、ローカライズサンプル を確認してください。日本語が選択されるとフォントが自動的に切り替わり、他の言語が選択されるとデフォルトのアトラスに戻ります。
テキスト表示音
表示エフェクトをサポートする組み込みプリンター(Chat を除くすべて)の場合、文字が表示されたときに再生するSFXをオプションで設定できます。
上記の「カスタムプリンターの追加」ガイドに従って、組み込みプリンターのいずれかを基にカスタムプリンターを作成します。次に、プレハブのルートオブジェクトにアタッチされた Revealable Text Printer Panel コンポーネント(Bubbleプリンターでは Floating Text Printer Panel)を見つけ、Chars Sfx プロパティで文字の表示時に再生するSFXを設定します。選択できるSFXは、Naninovel -> Configuration -> Audio エディターメニューの「Manage SFX Resources」ボタンから追加したSFXリソースに基づきます。
次の図は、すべての文字に「Keystroke1」SFX(Characters フィールドが空のため)、文字 .、,、!、? に「Keystroke2」、文字 * に「Explosion」が再生される設定を表しています。1つの文字が複数の要素に一致する場合は、それらのSFXがすべて再生されます。
あるいは、キャラクター構成で Message Sound を設定して、そのキャラクターがメッセージの話者である間にテキストが表示されるときに、キャラクター固有のサウンドを再生できます(どのテキストプリンターがメッセージを表示しているかに関係なく)。
テキスト表示音は非常に頻繁に再生され(メッセージの表示速度に応じて)、同じ音が連続して再生されると途中で切られるため、対応するオーディオクリップが非常に短く鋭い(冒頭に間や無音がない)ことを確認してください。
表示音がうまく機能しない場合(たとえば、各文字の表示ごとに再生するには音が十分に短くない場合)、ITextPrinterManager エンジンサービス の OnPrintStarted および OnPrintFinished イベントを使用して、それに応じてサウンドのループを開始/停止することを検討してください。
表示イベント
特定の文字が表示されたときのイベントにフックして、任意のアクションを実行することが可能です。表示されるテキスト内でイベントを呼び出す位置を <@...> タグで指定します。たとえば、「名前」が表示された後に「foo」ペイロードを持つ表示イベントをトリガーするには:
吾輩は猫である。名前<@foo>はまだ無い。プリンタープレハブの表示可能テキストオブジェクトにアタッチされた Reveal Broadcaster コンポーネントを使用して、イベントをリッスンします。すべての組み込みプリンターにはこのコンポーネントがすでにアタッチされているため、リスナーを接続するだけで済みます。
組み込みプリンターでは、Play Command オプションも有効になっています。これにより、コンポーネントはイベント本体(@ の後の部分)をコマンドとして解析して実行しようとします。たとえば、次は「名前」が表示されたときに背景の色合いを変更します。
吾輩は猫である。名前<@back tint:blue>はまだ無い。インラインコマンド の代わりにイベントタグを使用すると、コマンドを ローカライズドキュメント に公開でき、選択されたロケールに応じて実行されるコマンドを翻訳者がオーバーライドできるようになります。
注意
表示イベントは一時的なトラック上でコマンドを実行し、メイントラックには影響を与えられないため、それらを待機することはできません(wait! フラグは無視されます)。また、「入力待ち」(CTC)を発生させることもできません。
表示式
場合によっては、生成されたローカライズドキュメントに シナリオ式 を含めたり、言語(ロケール)が変更されたときに式の再評価を強制したりする必要があります。
プロセスは 表示イベント に似ていますが、@ の代わりに : タグを使用します。
吾輩は猫である。<:random(text1, text2)>名前はまだ無い。— random(text1, text2) 式は、言語が変更された場合を含め、テキストがプリンターに割り当てられるたびに再評価され、text1 と text2 という スクリプトテキスト変数 が現在アクティブなロケールと同期した状態に保たれます。この式はローカライズドキュメントにも含まれ、特定の言語ごとに変更できます。
表示式は、翻訳者が注入された値の順序を変更できるようにするのにも役立ちます。言語によって、さまざまな品詞の順序/優先順位に関するルールが異なるのが一般的であるためです。
Hello, <:MC>! How's <:AC> doing?— ここで、MC と AC 変数(プレイヤーが指定したキャラクター名が含まれていると思われる)の両方が生成されたローカライズドキュメントに公開され、翻訳者は必要に応じて順序を変更できます。
警告
未定義の動作を引き起こす可能性があるため、ゲーム状態を変更する式やゲーム状態に依存する式でこの機能を使用することは控えてください。たとえば、結果がローカル変数 foo に依存する式があり、この式を含むメッセージがある時点で表示され、バックログに保持されているとします。プレイヤーがロケールを変更すると、式はロケールが変更されたときの foo の値を使用して再評価されますが、これは最初に表示されたときとは異なる場合があります。
選択タグ
表示式 の一般的な使用例は、セレクターとして使用することです。たとえば、プールからのランダムなテキストや、代名詞に依存する言い回しなど、プレイヤーの選択に依存するテキストを含めたい場合があります。
これがシナリオで広く行われている場合、毎回完全な式構文を繰り返すのは面倒になる可能性があります。このような場合は、選択タグの使用を検討してください。
; ランダムな色を選択します。
My favorite color is </red/blue/green>.
; プレイヤーの選択に基づいて選択します。
Select your pronouns.
@choice "He/Him" set:selector=0
@choice "She/Her" set:selector=1
@choice "They/Them" set:selector=2
...
</He/She/They> </was/was/were> magnificent.</x/y> タグに注目してください。これらは選択タグです。/ 文字の間のテキストはオプションと呼ばれます。デフォルトでは、ランダムなオプションが返されます。ただし、selector 変数をインデックスに設定すると、タグはそのインデックス(0ベース)を持つオプションを返します。
より柔軟な選択ロジックが必要な場合は、select エイリアスを持つカスタム 式クエリ を作成し、params string[] を受け入れて string を返すようにします。選択タグがコンパイルされるたびに、そのクエリを使用して結果が評価されます。以下はカスタム選択クエリの例です。最初のオプションで選択の種類を指定し、最初のオプションが空の場合はランダム選択にフォールバックします。
[ExpressionQuery("select")]
public static string Select (params string[] args)
{
var kind = args[0];
var options = args[1..];
return kind switch {
"p" => SelectPronoun(options),
"t" => SelectTemper(options),
_ => options[Random.Range(0, options.Length)]
};
}その後、次のようにシナリオで使用できます。
; 代名詞に基づいて選択します。
</p/his/her/their>
; 気質に基づいて選択します。
</t/smiling/frowning/poker face>
; ランダムに選択します。
<//green/red>選択タグはローカライズドキュメントにも公開され、翻訳者は必要に応じてその構造を対象の文化に合わせて調整できます。