Hệ thống đối thoại vì sự thống nhất

Hệ thống đối thoại trong games ​​là một cơ chế cho phép các cuộc trò chuyện mang tính tương tác và sống động giữa người chơi và các nhân vật trong thế giới trò chơi. Nó đóng vai trò như một kênh liên lạc mà qua đó người chơi có thể tương tác với nhân vật không phải người chơi (NPC) hoặc các thực thể khác, cung cấp phương tiện để kể chuyện, tiến triển nhiệm vụ, phát triển nhân vật và xây dựng thế giới.

Mục tiêu chính của hệ thống đối thoại là tạo ra trải nghiệm năng động và hấp dẫn cho người chơi bằng cách cho phép họ đưa ra lựa chọn, tác động đến câu chuyện của trò chơi và định hình mối quan hệ của họ với các nhân vật trong trò chơi. Một hệ thống đối thoại được thiết kế tốt có thể nâng cao sự hòa nhập của người chơi, đầu tư cảm xúc và khả năng chơi lại.

Khi nói đến phát triển trò chơi trong Unity, việc tạo một hệ thống đối thoại hoàn chỉnh từ đầu có thể khá phức tạp nhưng bạn có thể bắt đầu bằng một ví dụ đơn giản hóa để bắt đầu. Ví dụ bên dưới sẽ đề cập đến hệ thống đối thoại dựa trên văn bản cơ bản sử dụng hệ thống C#Unity UI. Hãy nhớ rằng đây chỉ là điểm khởi đầu và có thể được mở rộng và tùy chỉnh dựa trên nhu cầu cụ thể.

Tạo Trình quản lý đối thoại

  • Tạo một tập lệnh mới, gọi nó là "DialogueManager", sau đó dán đoạn mã bên dưới vào trong tập lệnh đó:
using System.Collections;
using UnityEngine;
using UnityEngine.UI;

public class DialogueManager : MonoBehaviour
{
    public Text dialogueText;
    public Button choice1Button;
    public Button choice2Button;
    public Button nextButton;

    private Dialogue currentDialogue;
    private int currentLineIndex = 0;

    void Start()
    {
        // You can load your dialogue data from an external source (e.g., JSON, XML) or create it programmatically.
        // For simplicity, we'll create a sample dialogue here.
        currentDialogue = CreateSampleDialogue();

        // Set up event listeners for buttons
        choice1Button.onClick.AddListener(OnChoice1Selected);
        choice2Button.onClick.AddListener(OnChoice2Selected);
        nextButton.onClick.AddListener(OnNextButtonClicked);

        // Start the dialogue
        StartDialogue();
    }

    private void StartDialogue()
    {
        currentLineIndex = 0;
        DisplayLine(currentDialogue.lines[currentLineIndex]);
    }

    private void DisplayLine(DialogueLine line)
    {
        dialogueText.text = line.text;
        choice1Button.gameObject.SetActive(line.hasChoice);
        choice2Button.gameObject.SetActive(line.hasChoice);
        nextButton.gameObject.SetActive(!line.hasChoice);
    }

    private void OnNextButtonClicked()
    {
        currentLineIndex++;
        if (currentLineIndex < currentDialogue.lines.Length)
        {
            DisplayLine(currentDialogue.lines[currentLineIndex]);
        }
        else
        {
            // Dialogue is over
            EndDialogue();
        }
    }

    private void OnChoice1Selected()
    {
        HandleChoice(currentDialogue.lines[currentLineIndex].choice1);
    }

    private void OnChoice2Selected()
    {
        HandleChoice(currentDialogue.lines[currentLineIndex].choice2);
    }

    private void HandleChoice(Choice choice)
    {
        // Handle the chosen choice (e.g., change variables, trigger events)
        Debug.Log("Selected Choice: " + choice.text);

        // Advance to the next line
        currentLineIndex++;
        DisplayLine(currentDialogue.lines[currentLineIndex]);
    }

    private void EndDialogue()
    {
        // Reset the dialogue UI or close the dialogue box
        Debug.Log("End of Dialogue");
    }

    // Sample dialogue data (you can replace this with loading from an external source)
    private Dialogue CreateSampleDialogue()
    {
        Dialogue dialogue = new Dialogue();

        dialogue.lines = new DialogueLine[]
        {
            new DialogueLine("Hello there! Welcome to the Unity dialogue system example.", false),
            new DialogueLine("What would you like to do?", true, new Choice("Go on an adventure"), new Choice("Stay here")),
            new DialogueLine("Great choice! Have a fantastic adventure!", false),
            new DialogueLine("That's okay. Sometimes staying in one place can be just as exciting!", false),
            new DialogueLine("Thanks for trying out the Unity dialogue system example!", false)
        };

        return dialogue;
    }
}

[System.Serializable]
public class Dialogue
{
    public DialogueLine[] lines;
}

[System.Serializable]
public class DialogueLine
{
    public string text;
    public bool hasChoice;
    public Choice choice1;
    public Choice choice2;

    public DialogueLine(string text, bool hasChoice, Choice choice1 = null, Choice choice2 = null)
    {
        this.text = text;
        this.hasChoice = hasChoice;
        this.choice1 = choice1;
        this.choice2 = choice2;
    }
}

[System.Serializable]
public class Choice
{
    public string text;

    public Choice(string text)
    {
        this.text = text;
    }
}

Để thiết lập các đối tượng Nút và Văn bản UI trong Unity cho tập lệnh DialogueManager, hãy làm theo các bước bên dưới:

  • Trong trình chỉnh sửa Unity, nhấp chuột phải vào cửa sổ Phân cấp và chọn "UI -> Text" để tạo đối tượng Văn bản giao diện người dùng mới.
  • Đổi tên đối tượng Văn bản UI thành "DialogueText."
  • Tương tự, tạo ba đối tượng Nút giao diện người dùng: một cho Lựa chọn 1, một cho Lựa chọn 2 và một cho nút "Next" (để chuyển tiếp đoạn hội thoại).
  • Đặt tên cho các nút lần lượt là "Choice1Button," "Choice2Button," và "NextButton".
  • Định vị Văn bản và Nút giao diện người dùng trên khung vẽ theo bố cục ưa thích của bạn. Bạn có thể muốn đặt Văn bản giao diện người dùng ở giữa màn hình và các nút bên dưới hộp văn bản.
  • Điều chỉnh phông chữ, kích thước, màu sắc và các thuộc tính khác của Văn bản giao diện người dùng để phù hợp với phong cách hình ảnh của trò chơi của bạn.
  • Tùy chỉnh giao diện của Nút giao diện người dùng, chẳng hạn như thay đổi màu sắc và nhãn văn bản của chúng.
  • Trong trình chỉnh sửa Unity, chọn "DialogueManager" GameObject (tập lệnh bạn đã tạo để attach tập lệnh).
  • Trong cửa sổ Thanh tra, bạn sẽ thấy thành phần tập lệnh "Dialogue Manager". Kéo và thả các đối tượng Nút và Văn bản Giao diện người dùng từ cửa sổ Phân cấp đến các trường công khai tương ứng trong thành phần tập lệnh.
  • Bằng cách chỉ định các tham chiếu này, tập lệnh DialogueManager có thể truy cập Văn bản và Nút giao diện người dùng trong cảnh, cho phép tập lệnh cập nhật nội dung văn bản và kiểm soát khả năng hiển thị của chúng nếu cần trong suốt cuộc hội thoại.
  • Lưu cảnh để lưu các thay đổi biến.

Khi chạy trò chơi hoặc tương tác với trình kích hoạt hội thoại, DialogueManager sẽ có thể hiển thị văn bản hội thoại và các lựa chọn bằng cách sử dụng các thành phần giao diện người dùng được tham chiếu trên canvas.

Phần kết luận

Hệ thống đối thoại hiệu quả trong trò chơi mang lại cho người chơi quyền tự chủ, tác động và cảm giác được tham gia vào thế giới ảo, giúp trải nghiệm chơi trò chơi trở nên phong phú và hấp dẫn hơn. Khi các câu chuyện trong trò chơi và cách kể chuyện tương tác trở nên phức tạp hơn, hệ thống đối thoại ngày càng đóng vai trò quan trọng trong việc định hình hành trình của người chơi và tạo ra những trải nghiệm chơi game đáng nhớ.

Bài viết được đề xuất
Triển khai hệ thống Parkour trong Unity
Hướng dẫn sử dụng đèn pin cho Unity
Bộ điều khiển FPS thống nhất
Bộ điều khiển trình phát RTS và MOBA cho Unity
Cách thực hiện điều khiển cần cẩu trong Unity
Bộ điều khiển ô tô cho Unity
Bộ điều khiển máy bay cho Unity