Unity用対話システム (1) 基本設定と機能紹介


序文

この Dialogue System ダイアログ システムは、ゲーム内の複雑なダイアログ ロジックの解決、複数言語のサポート、プロセスの保存、視覚化、およびその他の機能に使用されます。一般的な一行の話ならこれを使う必要はなく、自分で書いてください。

さらに、このシステムは、コーディング方法がわからない開発者でも、マルチブランチで複雑なストーリー プロセス (視覚化、複数の衝突ボタンなどの統合機能) を作成するのに役立ちます。最初に以下のプロセスを紹介します。・このプラグインとの時間の接触 深く(事実は似ています)行く方法、つまり、新しいプラグインに引き継ぎ、切り込むための思考プロセスを入れます。

このプラグインを自分の独立したゲームに使用することを計画しており、すでに使用を開始しています. 関連する質問がある場合は、メッセージを残して、お互いに喜んで話し合ってください.

1. インストール


プラグインをインポートし
1. Editor Default Resources フォルダーには、エディター スクリプトで使用されるデフォルトのリソースが含まれています。

2. Gizmos フォルダーには、Gizmos.DrawIcon メソッドで使用されるテクスチャとアイコンのリソースが格納されます。

3、本体
ここに画像の説明を挿入

その後、ポップアップ ウィンドウが表示されます。必要に応じて確認できます。ここでは TMP (TextMeshPro) を選択しました。

4. ディレクトリの下にドキュメントがありますが、その中のコンテンツの一部は古いバージョンであり、時間内に更新されるべきではありません。ドキュメントには次のものが含まれます。

Text_Table_Manual - テキスト テーブル マニュアル

Save_System_Manual - システムマニュアルを保存

Input_Device_Manager_Manual - 入力デバイス マネージャー マニュアル

2.機能分析

1.公式基本機能ガイド

Demo シーンを見つけて、Dialogue Manager オブジェクトで同じ名前のスクリプトの boot 関数をクリックします。
ここに画像の説明を挿入

2. データファンデーション

独自の対話データ リソースを選択することです。[新規作成] ボタンをクリックすると、新しいリソースを作成できます。つまり、マネージャーは一意にすることができますが、その中のコンテンツとストーリーは、複数のリソースを事前設定し、前後に切り替えることができます。(ここまではこんな感じ)
ここに画像の説明を挿入

3. ダイアログ UI プレハブ

ここでダイアログ UI を割り当てることができます。Plugins/Pixel Crushers/Dialogue System/Prefabs/Standard Ul Prefabs でビルド済みの UI を見つけることができます。UI シーン オブジェクトを指定することもできます。文字通りの意味は、UI プレハブを指定することです。この UI プレハブを開き、ダイアログ アイコンを変更してデモを実行すると、すべてのダイアログ ボックスが変更されていることがわかります。これは本当に素晴らしいことです。
ここに画像の説明を挿入

4. ローカライズされた言語

ここに画像の説明を挿入
多言語テキスト形式については、前半で述べたドキュメントを参照してください。具体的な使用方法は次のとおりです。

図のようなテキストフォームを作成
ここに画像の説明を挿入
ダブルクリックしてフォームを開くと言語リストとフィールドリストの2つのリストがあるのでフィールドリストのドロップダウンメニューに入力してみましょう ちなみにここのフォームはエクスポート可能
ここに画像の説明を挿入
ここに画像の説明を挿入
ですよくわからない方のためにCSV形式に 企画に使ってインポートするというのは冗談ですが、実はエクセル表の企画の多言語管理の便宜のためです。
ここに画像の説明を挿入
次に、
フォームをドラッグし、最初の言語で設定したばかりの言語を記述し、ゲーム中に切り替えることができます。その後、対応するダイアログ管理制御システムもテキスト フォームを追加することがわかりました。これは、これがガイドは非常に使いやすく、非常に快適です。
ここに画像の説明を挿入

ローカリゼーション システムをクリックすると、シーンのダイアログ マネージャーがより多くの管理スクリプトで事前に作成され、特定の設定が明確になっていることがわかります。必要なフォントとフォームをクリックまたはドラッグできます。Additonal は追加の意味で、ゲームが別の地域に分岐している場合でも、これは必要だと思います。
ここに画像の説明を挿入
最後に、これらをコードで取得したい場合が多い場合はどうすればよいでしょうか?下の図1は、テキストテーブルのみを使用する場合、フィールドマークを入力することで対応するテキストを取得できることを示しています。

図 2 は公式の Manager の使用を示しています. 初期言語に入力された内容は、テキスト テーブル内の対応するマークされたフィールドを表示します. 変更したい場合は、UILocalizationManager.instance.currentLanguage を使用できます. この API を使用すると、管理スクリプトで [クリア] をクリックします. 言語をデフォルトの言語に初期化できます. その他の使用方法については、このローカリゼーション システムのソース コードを参照してください。
`PixelCrushers を使用します。

public TextTable textTable;

void Start()
{
    string str = textTable.GetFieldTextForLanguage("问候语", "EN");
    Debug.Log(str);
}
-------------------------------------------------------------------------------
void Start()
{
    string str= UILocalizationManager.instance.GetLocalizedText("问候语");
    Debug.Log(str);
}

5. 字幕表示モード

ここに画像の説明を挿入
NPC Subtitles Durign Line: NPC が話すと、台詞の字幕が表示されます. プロジェクトにリップ シンクがある場合は、クリックしないでください. 余裕がないので、これをクリックしました (笑)。

応答メニューあり: 「プレイヤー応答」メニューに最後の NPC サブタイトルを表示する場合にチェックします。これは、プレイヤーに彼らの反応が何であるかを思い出させるのに役立ちます。一般的にチェックします。

PC 字幕: PC 字幕。チェックすると、PC が話すときに PC 字幕が表示されます。別のメニュー テキストとダイアログ テキストを使用する場合にチェックを入れます。それ以外の場合は、チェックを外したままにすることができます。

Chars/Second: 1 秒あたりの文字出力量。Dotween のテキスト出力アニメーションに似ています。このナレーションとゲームを追加するのは良いことだと思いますが、より迅速にコンテキストの変更を追跡するか、クリックして直接最後にジャンプできるようにする方が良いでしょう (下の [続行] ボタンを参照)。

Min Seconds: 字幕表示の最小時間。

続行ボタン: 続行ボタンは、多くのイベントに対応します。ここでは、デモを実行するために [常に] を選択し、さらにボタンがあり、ワンクリックで完了することを確認します。他の説明は次のとおりです。実際、試してみるとわかります。

  • 応答メニューの前に表示しない: プレーヤーの応答メニューが次の場合は表示しません。「なし」以外の設定では、UI に「続行」ボタンが含まれている必要があります。

  • オプションのビフォア レスポンス メニュー: 表示されますが、プレーヤーのレスポンス メニューが次に表示される場合はクリックする必要はありません。

リッチ テキスト: リッチ テキストには UI サポートが必要です。チェックすることにしました。

6.カメラ、カットシーン(カットシーン)

My Sister Li はカットシーンのアニメーションで、プレイヤーが NPC に話しかける際には、通常、視点の変換や移動などのニーズがあります (リップ言語の連携も含まれますが、そのような作業を行う人はおそらくこのガイドを読まないでしょう) ) 一般的な意味は、シーケンスの手段を使用して、カメラのさまざまな属性変換を実現することです。

ここには一時的に保存する必要のある詳細がたくさんあり、後で新しいファイルが開かれます。

7. 入力方式

対応するドキュメントがあり、入力システムに関連する設定と、unity からの新しい入力システムである新しい入力システムが説明されています。'

素晴らしい説明: 自動管理、マウスまたはハンドルの自動検出、およびカーソルの非表示などのさまざまな構成は、まだ非常に完成度が高いです。新旧の入力システムをサポートし、非常に便利な書き方を提供します:

bool InputDeviceManager.IsButtonDown(“button name”)
bool InputDeviceManager.IsButtonUp(“button name”)
bool InputDeviceManager.IsKeyDown(KeyCode)
float InputDeviceManager.GetAxis(“axis name”)
Vector3 InputDeviceManager.GetMousePosition()

特定の API ドキュメント
新しいシステムを使用している場合は、スクリプト シンボル USE_NEW_INPUT を定義する必要があります (ウェルカム ページで新しいシステムをチェックして自動的に追加すると、ツール/ピクセル クラッシャー/ダイアログ システム/ウェルカム ウィンドウでインターフェイスが開きます。 )。以下はサンプル コードです (スクリプトはさまざまなアクションを登録し、別の場所で呼び出すことができます)。

using UnityEngine;
using UnityEngine.InputSystem;
using PixelCrushers;
public class RegisterMyControls : MonoBehaviour
{
    
    
 protected static bool isRegistered = false;
 private bool didIRegister = false;
 private Controls controls;
 void Awake()
 {
    
    
 controls = new MyControls();
 }
 void OnEnable()
 {
    
    
 if (!isRegistered)
 {
    
    
 isRegistered = true;
 didIRegister = true;
 controls.Enable();
 InputDeviceManager.RegisterInputAction("Back", controls.Gameplay.Back);
 InputDeviceManager.RegisterInputAction("Interact", controls.Gameplay.Interact);
 }
 }
 void OnDisable()
 {
    
    
 if (didIRegister)
 {
    
    
 isRegistered = false;
 didIRegister = false;
 controls.Disable();
 InputDeviceManager.UnregisterInputAction("Back");
 InputDeviceManager.UnregisterInputAction("Interact");
 }
 }
}

上記のコードは、登録を開始し、ログアウトを終了します. ここではあまり説明しません.

構成: (実際には、コードを記述しないことも可能です。ブート インターフェイスには、次の 2 つの設定モジュールが含まれています)

プレイヤー応答メニュー: プレイヤー応答メニュー

Always Force Menu: 常にメニューにフォーカスし、応答メニューを強制する場合にチェックします。チェックを外すと、プレーヤーが有効な応答を 1 つしか持っていない場合、Ul は応答メニューを表示せずにその応答を自動的に選択します。これは単純に、プレイヤーが NPC と話した後に離れるオプションを選択する必要があることを意味します。

無効なエントリを含める: 無効なエントリ (エンティティ) を含めます。チェックすると、メニューに誤ったエントリが含まれ、ボタンは表示されますが、選択できなくなります。これは、ゲーム内のいくつかの対話が必要であることを意味します (例: 強度が 20 に達した場合にのみ、対話で他の人を脅かすことができます。それはあなたの V (強度 20) であり、クラス 2077 の対話は選択できません)。

タイマー: 応答時間。これは緊急オプションです. 10 秒を選択するようにチェックすると、10 秒以内に選択しない場合、必要な操作が実行されます. ドロップダウン メニューのデフォルトでは、時間切れになると最初の項目が選択されます.

クイック タイム イベント (QTE) トリガー ボタン: イベント ボタンをすばやくトリガーします (特定のコンテンツは、プレハブの [表示設定] の下の [入力設定] で変更できます。高度なポイントについては、OverrideDisplaySettings スクリプトを追加して設定を書き換えることができます)

ラインのキャンセル: ラインのボタン、名前などをキャンセルします。これは、対話を中断することを意味します。この名前は、スクリプトから便利に呼び出すことができます。

会話のキャンセル: 会話のボタン、名前などをキャンセルします。これは、会話をキャンセルすることを意味します。

8.アラーム

ここに画像の説明を挿入
会話を許可: 会話にアラートを表示できるようにするには、チェックマークを付けます。マークされていない場合、会話が終了するまでアラートは表示されません。

アラートの監視: アラートを監視し、Lua の値を常に監視します。

Chars/Second: アラームの時刻を表示します。0 の場合、字幕の属性がデフォルトで使用されます。

Min Seconds: アラートを表示する最小時間。0 はデフォルトの字幕の最小時間です。

Bricks は、デフォルトについて心配する必要はないことを示唆しています。とにかく、私のプロジェクトでは必要ありません。

9. システムを保存する

このシステムは、データを保存し、シナリオ全体で変更を記録します。
ここに画像の説明を挿入
保存システムについては前編のドキュメントを参照してください.具体的な使い方は以下の通りです.

1. まず、システムの保存スクリプトをシーンの Dialogue Manager に追加します。

2. Json Data Serializer、データシリアライゼーションスクリプトを追加します。

3. PlayerPrefs Saved Game Data Storer または Disk Saved Game Data Storer を追加します; これらはそれぞれ 2 種類のストレージです。

よし、栗をください。ゲームの設定メニューには、ゲームの保存とロードにそれぞれ対応する 2 つのボタンがあります. 次に、SaveSystem.SaveGameToSlot と SaveSystem.LoadGameFromSlot を使用して 2 つのボタンをバインドできます. シーンをロードする必要がある場合は、SaveSystem も提供します.LoadScene メソッドを追加するか、SaveSystemMethods スクリプトをプレハブに追加します。その中で、Demo シーンで Demo Menu を検索して上記のスクリプトを表示し、継承された DemoMenu にジャンプして、次のように彼も同じように記述していることを確認します。

   {
    
    
      private void SaveGame()
        {
    
    
            var saveSystem = FindObjectOfType<SaveSystem>();
            if (saveSystem != null)
            {
    
    
                SaveSystem.SaveToSlot(1);
            }
            else
            {
    
    
                string saveData = PersistentDataManager.GetSaveData();
                PlayerPrefs.SetString("SavedGame", saveData);
                Debug.Log("Save Game Data: " + saveData);
            }
            DialogueManager.ShowAlert("Game saved.");
        }

        private void LoadGame()
        {
    
    
            PersistentDataManager.LevelWillBeUnloaded();
            var saveSystem = FindObjectOfType<SaveSystem>();
            if (saveSystem != null)
            {
    
    
                if (SaveSystem.HasSavedGameInSlot(1))
                {
    
    
                    SaveSystem.LoadFromSlot(1);
                    DialogueManager.ShowAlert("Game loaded.");
                }
                else
                {
    
    
                    DialogueManager.ShowAlert("Save a game first.");
                }
            }
            else
            {
    
    
                if (PlayerPrefs.HasKey("SavedGame"))
                {
    
    
                    string saveData = PlayerPrefs.GetString("SavedGame");
                    Debug.Log("Load Game Data: " + saveData);
                    LevelManager levelManager = FindObjectOfType<LevelManager>();
                    if (levelManager != null)
                    {
    
    
                        levelManager.LoadGame(saveData);
                    }
                    else
                    {
    
    
                        PersistentDataManager.ApplySaveData(saveData);
                        DialogueManager.SendUpdateTracker();
                    }
                    DialogueManager.ShowAlert("Game loaded.");
                }
                else
                {
    
    
                    DialogueManager.ShowAlert("Save a game first.");
                }
            }
        }


        private void ClearSavedGame()
        {
    
    
            var saveSystem = FindObjectOfType<SaveSystem>();
            if (saveSystem != null)
            {
    
    
                if (SaveSystem.HasSavedGameInSlot(1))
                {
    
    
                    SaveSystem.DeleteSavedGameInSlot(1);
                }
            }
            else if (PlayerPrefs.HasKey("SavedGame"))
            {
    
    
                PlayerPrefs.DeleteKey("SavedGame");
                Debug.Log("Cleared saved game data");
            }
            DialogueManager.ShowAlert("Saved Game Cleared");
        }
}

要約すると、ドキュメントを呼び出すメソッドを自分で記述できます。それ以外の場合は、対応する記述されたスクリプトを追加します。上記のコンポーネント スクリプトを除いて、残りは次のとおりです。
ここに画像の説明を挿入
ここに画像の説明を挿入

まずはこれを理解して、対応する専用モジュールの例を後で追加しましょう。

10. 設定の概要

対話情報データ、UI テンプレート、表示字幕方法、応答メニュー、応答時間、アラームの許可、システムの保存を含む、以前に設定された概要ページ。
ここに画像の説明を挿入

11. 対話システムの例

データベース: 基本的なデータ情報
ここに画像の説明を挿入
アクター: プレーヤー自体を含むアクター クエスト
ここに画像の説明を挿入
: タスクの
ここに画像の説明を挿入
場所: 場所、ポジショニング
ここに画像の説明を挿入
変数: 変数
ここに画像の説明を挿入
会話: ダイアログ
ここに画像の説明を挿入
テンプレート: テンプレートに
ここに画像の説明を挿入
は基本的に、変数、キャラクター、タスク、ダイアログ テキスト、およびその他のさまざまな設定が含まれます。 clear 学習したい場合は、デモを自由に変更できます。

要約する

プラグインに付属しているブートシステムを分析することで、プラグイン全体に含まれる設定を学びました.さまざまなシステムはまだ非常に包括的です.自分で開発すると、多くの時間がかかります. 次の記事では、直接始めて、最初から最後までデモを作成し、大火をプロジェクトに統合する方法を説明します。一般的に言えば、これはプラグインのすべての機能概念を列挙することであり、役に立たないと考える人もいるかもしれませんが、多くの場合、プラグインの概念を頭に入れておくことは非常に重要です。丸暗記せずに柔軟に操作でき、さまざまな機能を簡単に組み合わせることができます。

基本的な機能については、ステーション b に移動して、YouTube でコードを使用しない対話システムを検索できます; 次の実用的な記事ですが、数日で出てくるという保証はありません。自分の仕事があります。

おすすめ

転載: blog.csdn.net/qq_41912124/article/details/127904958