###### tags: `Unity對話`
# Dialogue System
[toc]
# 基礎設定
## import Dialogue System
Asset store登入下載
## Dialogue Manager
大部分跟對話有關的內容都靠Dialogue Manager來管理調整,所以先將此物件拉出來。

## 建立DB
還沒建立前,可以在Dialogue Manager點這個位置建立

or
直接在project建立

P.S. 如果已經有舊DB,最好不要新創,因為兩者無法同時使用!!!
# 調整prefab UI


# 資料庫
進入資料庫,對DB按Edit,會跳出Dialogue Database的視窗。

裡面有不同的標籤可以進行調整

## Conversations標籤
顧名思義就是用來建立聊天的,按下+可以新增新的對話

- **Title**可以更改名稱

對著橘色按下去的子節點為一般對話

節點右邊Inspector的資訊個別為
- **Actor:** 演出這段對話的演員,即是說這句話的人
- **Conversant:** 聆聽這句話的人
- **Dialogue Text:** 這句話的內容 (台詞打在這)
- **Sequence:** 說這句台詞時會播放的動畫 (相機不同角度拍攝...etc)
- **Condictions:** 放入條件,條件為true才會執行這段對話。
- **Script:** 進行對話時會執行的程式碼

### sequence
#### 以對話時相機拍攝的角度為例

**Subject:** 放想觀察的對象
**Camera Angle Collection:** 產生出來的角度(空物件)存放在Hierachy的哪裡

按下「+」可以新增角度空物件

為了方便聊解目前的角度長怎樣,==我們將空物件新增一個子物件的相機給他==

1. 先將相機的位置reset
2. 調整好角度
由於相機是空物件的子物件,因此我們直接調整空物件就可以讓相機跟著移動旋轉。而我們最主要是需要子物件的相機視角,這樣才知道目前的角度長怎樣
3. 將相機刪除
4. 打開對話,將合適的對話Node的sequence欄位打上
```csharp=
Camera(角度空物件名稱);
{{default}}
```

#### 延遲幾秒鐘
```csharp=
Delay(3)
```
#### 播放Timeline
建立timeline時,一定要在Hierarchy建立一個空物件,並加上component `Playable Diretor`,並且把`.playable`檔放上該元件。
==必須注意的是,如果Dialogue System有設定「離NPC過遠就終止對話」可能會導致,NPC在播放動畫時離玩家太遠而讓動畫中斷。==
```csharp=
Timeline(play,Timeline在Hierarchy的物件名稱)
```
### condition - 以隨機對話內容為例
作用很像寫程式的if-else。
直接參考下方連結講得清楚明瞭,而且我懶惰。
[隨機對話內容](https://www.pixelcrushers.com/phpbb/viewtopic.php?t=374)
### Events - 達到類似ButtonClick的功能
1. 新增一空物件、以及一物件並將程式碼掛在底下

**ScriptsTest:** 的作用是將程式碼掛在該物件底下

**Empyt:** 能否將此物件關閉,可以的話代表事件(event)觸發成功。
就真的是空物件所以底下啥都沒有。

2. 將寫好的程式碼掛在物件底下
為了測試點選選項後是否有用,我們設定點了選項後可以將某個物件關閉
```csharp=
public GameObject Empty;
public void TTTTClick()
{
Empty.SetActive(false);
}
```

3. Dialogue Conversations新增事件
- 點選Add Scene Event

- 新增事件
**On Execute(GameObject):** 如果有成功運行就會執行底下的內容。言下之意就是如果這個選項有被選才會去執行底下的內容。
OnExecute一定要選這個,不能選上面沒有GameObject的,上面的是直接掛著程式碼,但不知為何無法選擇Function。
On Execute(GameObject)則可以掛著物件,所以我將程式碼掛在物件下,再把該物件掛在On Execute(GameObject)。

- 空格的欄位放入物件(ScriptTest)
因為ScriptTest底下掛有程式碼。


- 選擇我們剛剛寫的Function

- 執行結果

# 觸發對話
- 必須有Collider
- component新增Dialogue System Trigger

根據不同的觸發對話需求有不同的trigger

## OnUse trigger
Add Action > start conversaction

選擇conversaction

將角色選擇好

將可以「點及觸發對話」的物件掛上Usable component
Max Use Distance:為觸發的最大範圍

最後將player的物件掛上Selector Scripts

可透過Selector Scripts 修改用哪個按鍵觸發

# 以程式碼開啟對話
[以程式碼開啟對話(有效)](https://www.pixelcrushers.com/phpbb/viewtopic.php?t=1603)
```csharp=
using PixelCrushers.DialogueSystem;
[ConversationPopup] public string conversation;
public Transform actor;
public Transform conversant;
...
void StartMyConversation()
{
DialogueManager.StartConversation(conversation, actor, conversant);
}
```