Unity简单对话系统实现

这篇具有很好参考价值的文章主要介绍了Unity简单对话系统实现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


前言

思路:将每段对话分为一个单独的对话模块,每段对话模块拥有自己独有的ID和几句单独的对话,每段对话中自己定义是否含有选择,每个选择拥有与对话模块对应的相同ID(自己决定选择后跳转的对话模块),点击后跳转到对应对话模块,最后有一个用于管理所有对话模块的管理中心用于存储所有的对话模块。

一、场景搭建

unity 分支对话系统,unity,windows,游戏引擎

二、创建DialoguePanel

1、创建用于获得组件的代码

using UnityEngine;
using UnityEngine.UI;

public class DialoguePanel : MonoBehaviour
{
    [Tooltip("说话者")]public Text speakerName;
    [Tooltip("说话内容")]public Text speech;
    [Header("------")]
    [Tooltip("说话角色的立绘或者头像")]public Image rowImage;
    [Header("------")]
    [Tooltip("继续下一句话按钮")]public Button continueSpeechBtn;
    [Header("------")]
    [Tooltip("生成选项预制体")]public ChooseButton chooseButtonPre;
    [Header("------")]
    [Tooltip("选择按钮的生成位置")]public Transform chooseParent;
    [Tooltip("角色立绘位置")]public Transform rowDetailsTrans;
    
}

2、将其挂载在对话面板的Canvas物体上进行赋值
unity 分支对话系统,unity,windows,游戏引擎

三、创建对话数据DialogueData

代码部分:

using System;
using System.Collections.Generic;
using UnityEngine;

[CreateAssetMenu( menuName = "对话/DialogueData")]
public class DialogueData : ScriptableObject
{
	public int ID;//存储在字典中的ID
	public List<Dialogue> dialogueList;

	
}


[Serializable]
public class Dialogue//对话
{
	public Row row;//枚举数据  区别立绘出现在左边或者右边
	public string speakerName;
	[TextArea(5,4)]
	public string speech;
	public List<Choose> chooseList = new List<Choose>();//对话是否有选项
}
[Serializable]
public class Choose//选项
{
    public int ID;//选项的ID
    public string chooseBtnText;
}

数据部分:
unity 分支对话系统,unity,windows,游戏引擎
在此对话的最后部分创建几个选项
unity 分支对话系统,unity,windows,游戏引擎
创建几个对应选项的对话数据
unity 分支对话系统,unity,windows,游戏引擎

四、创建管理对话数据DialogueDataListSO

代码部分:

using System.Collections.Generic;
using UnityEngine;

[CreateAssetMenu(menuName = "对话/DialogueDataListSO")]
public class DialogueDataListSO : ScriptableObject 
{
    public List<DialogueData> dialogueDataList;

    private Dictionary<int,DialogueData> DialogueDataDic;
	public Dictionary<int,DialogueData>  dialogueDataDic=> DialogueDataDic;
	


	public void Initialization()//初始化字典,并将dialogueDataList中的dialogueData存入
	{
		DialogueDataDic = new Dictionary<int, DialogueData>();

		foreach (var dialogueData in dialogueDataList)
		{
			DialogueDataDic.Add(dialogueData.ID,dialogueData);
		}
	}
}

字典的作用是在出现选项时,通过对应的ID跳转到对应的DialogueData

数据部分:
unity 分支对话系统,unity,windows,游戏引擎

五、创建对话的业务中心DialogueSystem

1、将其写成单例模式,便于使用

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class DialogueSystem : MonoBehaviour
{
    private static DialogueSystem instance;
    public static DialogueSystem Instance => instance;
    [Tooltip("对话面板")]public DialoguePanel dialoguePanel;
    [Tooltip("对话数据列表")]public DialogueDataListSO dialogueDataListSO;
    [Tooltip("当前处于第几句对话")]public int currentSpeechCount;
    private DialogueData dialogueData;//从对话数据列表中获得单个对话数据

    private void Awake() 
    {
        if(instance != null)
        {
            Destroy(this);
        }
        else
        {
            instance = this;
        }
        dialogueData = dialogueDataListSO.dialogueDataList[0];//从存储的对话的第一个开始

        dialogueDataListSO.Initialization();//初始化字典
		SyncDialogueInformation(currentSpeechCount);
	}
}
        
    

2、同步对话信息,在Awake中执行一次

 	public void SyncDialogueInformation(int speechCount)//同步对话信息
    {
        dialoguePanel.speakerName.text = dialogueData.dialogueList[speechCount].speakerName;
        dialoguePanel.speech.text = dialogueData.dialogueList[speechCount].speech;
    }

3、此时返回Unity启动,便会发现面板中的数据同步到对话的数据文件
unity 分支对话系统,unity,windows,游戏引擎
4、点击继续实现更新对话

	public static void UpdateDialogueSpeech()//更新对话
    {
        instance.currentSpeechCount++;
        if (instance.currentSpeechCount >= instance.dialogueData.dialogueList.Count)
        {
            instance.currentSpeechCount = 0;
        }

        instance.SyncDialogueInformation(instance.currentSpeechCount);   
    }

对话存储在列表中,点击继续将对应的下标+1

此时返回Unity启动点击继续便会先发对话实现了继续下一句

5、生成选项,对话是否有选择
按钮代码:

using UnityEngine;
using UnityEngine.UI;

public class ChooseButton : MonoBehaviour
{
    public Text chooseText;//按钮显示内容

    public Button chooseBtn;

    public int ID;//按钮ID


    private void Awake() 
    {
        chooseBtn.onClick.AddListener(UpdateTalk);
    }

    public void UpdateTalk()
    {
      	//点击执行部分
    }

}

生成选项:

 public void InstanceChooseBtn(Transform transform)//生成选项
    {
        ChooseButton chooseButton;
        if (dialoguePanel.chooseButtonPre != null) // 判空逻辑
        {
            for (int i = 0; i < dialogueData.dialogueList[currentSpeechCount].chooseList.Count; i++)
            {
                chooseButton = Instantiate(dialoguePanel.chooseButtonPre, transform);
                chooseButton.chooseText.text = dialogueData.dialogueList[currentSpeechCount].chooseList[i].chooseBtnText;

                chooseButton.ID = dialogueData.dialogueList[currentSpeechCount].chooseList[i].ID;
				//将选项按钮中的ID同步于当前对话中的选项的ID
                dialoguePanel.continueSpeechBtn.gameObject.SetActive(false);//生成选项时关闭继续按钮
            }

            
        } 
        else    
        {
            Debug.LogError("chooseButtonPre 为空");
        }
    }

unity 分支对话系统,unity,windows,游戏引擎

原理:循环当前对话内的chooseList中是否有选项,如果有就将其生成出来
将其放在更新对话中执行,传入的transform参数为按钮生成的位置

	public static void UpdateDialogueSpeech()//更新对话
    {
        instance.currentSpeechCount++;
        if (instance.currentSpeechCount >= instance.dialogueData.dialogueList.Count)
        {
            instance.currentSpeechCount = 0;
        }

        instance.SyncDialogueInformation(instance.currentSpeechCount);
        instance.InstanceChooseBtn(instance.dialoguePanel.chooseParent);
        
    }

6、点击选项时执行逻辑

public void ChooseClickUpdateDialogueSpeech(int alpa)//点击时,更新对话  需要在生成按钮时就将按钮对应的List传入
    {
        
        dialogueData = dialogueDataListSO.dialogueDataDic[alpa];//根据对应ID选择字典中的对话数据 
        dialoguePanel.continueSpeechBtn.gameObject.SetActive(true);//点击选项后开启继续按钮

        ClearChoices();
    }
    public void ClearChoices()// 销毁之前的选择按钮
    {
        ChooseButton[] chooseBtns = dialoguePanel.chooseParent.GetComponentsInChildren<ChooseButton>();
        foreach (ChooseButton choice in chooseBtns)
        {
            Destroy(choice.gameObject);
        }
    }

添加到按钮中


using UnityEngine;
using UnityEngine.UI;

public class ChooseButton : MonoBehaviour
{
    public Text chooseText;

    public Button chooseBtn;

    public int ID;


    private void Awake() 
    {
        chooseBtn.onClick.AddListener(UpdateTalk);
    }

    public void UpdateTalk()
    {
       DialogueSystem.Instance.ChooseClickUpdateDialogueSpeech(ID);//根据传入的ID更新对话数据
       DialogueSystem.UpdateDialogueSpeech();//更新对话
    }

}

7、根据row的位置更换显示位置,在每次更新对话时执行

 	public void SwitchPosition()//根据row的位置更换显示位置
    {
        switch (dialogueData.dialogueList[currentSpeechCount].row)
        {
            case Row.left :
                dialoguePanel.rowDetailsTrans.localPosition = new Vector3(-567,87,0);
                break;
            case Row.right :
                dialoguePanel.rowDetailsTrans.localPosition = new Vector3(567,87,0);
                break;
        }
    }
	public static void UpdateDialogueSpeech()//更新对话
    {
        instance.currentSpeechCount++;
        if (instance.currentSpeechCount >= instance.dialogueData.dialogueList.Count)
        {
            instance.currentSpeechCount = 0;
        }

        instance.SyncDialogueInformation(instance.currentSpeechCount);
        instance.InstanceChooseBtn(instance.dialoguePanel.chooseParent);
        instance.SwitchPosition();
        
    }

此时便已实现简单的对话加选项功能
可查看实现效果

后续使用过程中发现了一些问题,可查看优化Unity简单对话系统的优化文章来源地址https://www.toymoban.com/news/detail-860956.html

到了这里,关于Unity简单对话系统实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 【Unity 实用插件篇】 | 使用Fungus插件制作一个对话系统,简单好学易上手
  • 【Unity 实用工具篇】✨| 使用Fungus插件制作一个对话系统,简单好学易上手
  • unity 简单实现三阶魔方游戏

    unity 简单实现三阶魔方游戏

    魔方体验地址 工程文件免费下载 实现思路 一、魔方的旋转 三阶魔方由26个方块与 9个旋转轴组成。旋转轴旋转时带动在其控制范围的方块旋转。 旋转轴如何带动方块旋转? 把旋转轴控制范围内的方块设置成旋转轴的子物体,旋转轴旋转时便会带动子物体旋转。 如何得到旋

    2024年02月12日
    浏览(11)
  • Unity 简单跑酷游戏策划与实现

    Unity 简单跑酷游戏策划与实现

    游戏名称:无尽探险跑酷(Endless Adventure Runner) 游戏类型:无尽跑酷 游戏背景 在一个充满未知和奇迹的世界中,玩家将扮演一名勇敢的探险家,穿越各种神秘的地域,躲避重重障碍,收集宝藏,并挑战自己的极限。 核心玩法 跑酷冒险 :玩家控制角色在无尽的道路上不断前

    2024年02月03日
    浏览(18)
  • 【Unity实战】实现一款简单的FPS游戏

    实现一款FPS游戏需要以下步骤: 1.创建场景:在Unity中创建3D场景,设定地形、灯光、天气等环境,新增角色、武器等道具。 2.角色控制:创建角色,并添加Unity内置的角色控制器或自定义控制器脚本,处理角色的移动、射击、跳跃、动作等。 3.武器系统:创建武器模型,添加

    2024年02月06日
    浏览(13)
  • 【Unity实战】实现强大通用易扩展的对话系统(附项目源码)

    【Unity实战】实现强大通用易扩展的对话系统(附项目源码)

    之前的对话系统因为存在一些错误和原作者不允许我分享,所以被我下架了,而且之前对话系统确实少了一些功能,比如最基本的逐字打印功能,原本来是打算后面补充的。 对话系统在游戏中实现太常见了,所以我又重新去找了一些对话系统的课程进行学习,把实现过程和笔

    2024年02月05日
    浏览(9)
  • 简单的Unity中设置游戏死亡界面并实现跳转

    在Unity中设置游戏死亡界面可以通过以下步骤完成: 创建新的场景:在Unity的菜单栏中选择“File”,然后选择“New Scene”。这将创建一个新的、空的场景。 创建游戏死亡UI:在新的场景中创建一个游戏死亡界面。可以使用Unity的UI工具来创建UI元素,例如文本、按钮、背景等。

    2024年02月06日
    浏览(79)
  • Unity 游戏开发、01 基础篇 | 知识大全、简单功能脚本实现

    Unity默认窗口布局 Hierarchy 层级窗口 Scene 场景窗口,3D视图窗口 Game 游戏播放窗口 Inspector 检查器窗口,属性窗口 Project 项目窗口 Console 控制台窗口 恢复默认布局 Window | Layouts | Default 调大页面字体 Preference | UI Scaling 新项目默认创建了 SampleScene 场景 {摄像机,平行光} SampleScen

    2024年02月09日
    浏览(18)
  • Unity 游戏开发、01 基础知识大全、简单功能脚本实现

    Unity默认窗口布局 Hierarchy 层级窗口 Scene 场景窗口,3D视图窗口 Game 游戏播放窗口 Inspector 检查器窗口,属性窗口 Project 项目窗口 Console 控制台窗口 恢复默认布局 Window | Layouts | Default 调大页面字体 Preference | UI Scaling 新项目默认创建了 SampleScene 场景 {摄像机,平行光} SampleScen

    2024年02月09日
    浏览(36)
  • 【制作100个unity实战之2】实现一款简单的FPS游戏

    实现一款FPS游戏需要以下步骤: 1.创建场景:在Unity中创建3D场景,设定地形、灯光、天气等环境,新增角色、武器等道具。 2.角色控制:创建角色,并添加Unity内置的角色控制器或自定义控制器脚本,处理角色的移动、射击、跳跃、动作等。 3.武器系统:创建武器模型,添加

    2024年02月04日
    浏览(12)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包