首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >统一中的NPC对话系统

统一中的NPC对话系统
EN

Stack Overflow用户
提问于 2019-02-24 00:16:09
回答 1查看 2K关注 0票数 1

在过去的几天里,我一直在努力让一个对话系统工作,但是我遇到了一些问题。第一个问题是,在输入文本时,我需要按下一个按钮,以便在进入下一个句子之前立即完成,当我尝试时,出现了一些奇怪的错误,所以我恢复了它。我一直遇到的第二个问题是,当我复制全国人民代表大会,改变第二届全国人民代表大会的对话时,他们都只是说第一届全国人民代表大会的对话是什么。

目前,我有一个对撞机围绕着播放器的侧面,当玩家的侧面对撞机碰到NPC的,而空格键被按下,它就触发了对话。这是我的代码:

播放器脚本:

代码语言:javascript
复制
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Player : Character
{
    public BasicNPCPrototype NPCPrototype;
    private bool nearNPC = false;

    // Use this for initialization
    protected override void Start()
    {
        // This needs to be here because the Override normally would override the Character Start function so we have this here to tell the Character Start function to go
        base.Start();
    }

    // Update is called once per frame
    protected override void Update() // Because the parent script (The Character script) is using protected virtual update it will Override the local update function (This one) so you have to write protected override to make sure they both run
    {
        // Call the GetInput Function
        GetInput();

        CheckIfNear();

        // This needs to be here because the Override normally would override the Character Update function so we have this here to tell the Character Update function to go
        base.Update();
    }

    void GetInput()
    {
        // If the player is active (playerActive is a protected bool in the "Character" script)
        if(playerActive)
        {
            // Normalize "direction" so moving in both directions won't speed up the character (May not be nessisary when using Input.GetAxis, Needs testing)
            direction = Vector2.zero;

            // Get the horizontal Axis and put in the X value of "direction"
            direction.x = Input.GetAxisRaw("Horizontal");
            // Get the Vertical Axis and put in the Y value of "direction"
            direction.y = Input.GetAxisRaw("Vertical");
        }    
    }

    // When the players trigger collider touches somthing
    void OnTriggerEnter2D(Collider2D collision)
    {
        // Check to see if it has the "NPC" tag
        if(collision.tag == "NPC")
        {
            // Set "nearNPC" bool to tue
            nearNPC = true;             
        }
    }

    // When the players trigger collider exits somthing
    void OnTriggerExit2D(Collider2D collision)
    {
        // Check to see if it has the "NPC" tag
        if (collision.tag == "NPC")
        {
            // Set "nearNPC" bool to false
            nearNPC = false;
        }
    }

    private void CheckIfNear()
    {
        // If nearNPC bool is true
        if (nearNPC == true)
        {
            // If the "Jump" Keybind is press
            if (Input.GetButtonUp("Jump"))
            {
                // Call the Speak function in the NPCPrototype script
                NPCPrototype.Speak();
            }
        }
    }
}

NPC脚本

代码语言:javascript
复制
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class BasicNPCPrototype : MonoBehaviour
{
    public Dialogue dialogue;

    // Use this for initialization
    void Start ()
    {

    }

    // Update is called once per frame
    void Update ()
    {

    }

    public void Speak()
    {
        // Call the "StartDialogue" function in the DialogueManager and pass in our dialogue variable
        FindObjectOfType<DialogueManager>().StartDialogue(dialogue);
    }
}

这是我的对话经理:

代码语言:javascript
复制
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class DialogueManager : MonoBehaviour
{
    public float waitBeforeDisable = 1f;
    public GameObject dialogueBox;
    public Text nameText;
    public Text dialogueText;

    public Animator animator;

    private Queue<string> sentences;

    private bool conversationActive = false;

    // Use this for initialization
    void Start()
    {
        //dialogueBox.SetActive(false);
        sentences = new Queue<string>();       
    }

    public void StartDialogue(Dialogue dialogue)
    {

        if (conversationActive == false)
        {
            dialogueBox.SetActive(true);

            conversationActive = true;

            animator.SetBool("isOpen", true);

            nameText.text = dialogue.name;

            sentences.Clear();

            foreach (string sentence in dialogue.sentences)
            {
                sentences.Enqueue(sentence);
            }

            DisplayNextSentence();
        }

        if (conversationActive == true)
        {
            DisplayNextSentence();
        }

    }

    public void DisplayNextSentence()
    {
        if (sentences.Count == 0)
        {
            EndDialogue();
            return;
        }

        string sentence = sentences.Dequeue();
        StopAllCoroutines();
        StartCoroutine(TypeSentence(sentence));
    }

    void EndDialogue()
    {
        animator.SetBool("isOpen", false);
        StartCoroutine("DisableDialogueBox");
        conversationActive = false;
    }

    IEnumerator TypeSentence(string sentence)
    {
        dialogueText.text = "";

        foreach (char letter in sentence.ToCharArray())
        {
            dialogueText.text += letter;
            yield return null;
        }
    }

    IEnumerator DisableDialogueBox()
    {
        yield return new WaitForSeconds (waitBeforeDisable);
        dialogueBox.SetActive(false);
    }

}

我对编码非常陌生,如果我能得到一些帮助,那就太好了!如果你对我的问题有疑问,请随便问。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-02-24 03:50:57

您不会更改您的NPCPrototype引用

您在哪里设置NPCPrototype的值?- Draco18s @Draco18s在检查员中- Ultra Gamer

因为您在检查器中设置了它(没有其他地方),所以它永远不会改变。如果希望对话框来自特定的NPC,则在“我在附近吗?”时,需要从该NPC获取组件。检查/碰撞。例如:

代码语言:javascript
复制
void OnTriggerEnter2D(Collider2D collision)
{
    // Check to see if it has the "NPC" tag
    if(collision.tag == "NPC")
    {
        // Set "nearNPC" bool to tue
        nearNPC = true;
        NPCPrototype = collision.gameObject.GetComponent<BasicNPCPrototype>();
    }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54847548

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档