Unity—对话系统&&GalGame游戏文字对话制作

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

每日一句:人间总有一两,填我十万八千梦

目录

对话系统

文本逐字打印功能

GalGame游戏(美少女游戏)文字对话


对话系统

被触发物体(挂载脚本)下UI,先不激活

public class TalkButton : MonoBehaviour

{

    public GameObject tipshow;//提示UI

    public GameObject talkUI;//对话UI

    private void OnTriggerEnter(Collider other)

    {

        Debug.Log("aaa");

        tipshow.SetActive(true);

    }

    private void OnTriggerExit(Collider other)

    {

        tipshow.SetActive(false);

    }

private void Update()

    {

        if(tipshow.activeSelf&&Input.GetKeyDown(KeyCode.R))

        {

            talkUI.SetActive(true);

        }

    }

}

TextAsset文档文件

Unity—对话系统&&GalGame游戏文字对话制作

 Unity—对话系统&&GalGame游戏文字对话制作

 

(用记事本另存为txt文本文件,导入Unity中)

DialogSystem类

public class DialogSystem : MonoBehaviour

{

    public Text textLabel;//文字组件

    public Image faceImage;//头像图片

    public TextAsset textFile;

    public int index;//文本内容索引+

    public Sprite face01, face02;

    public float textSpeed;

    bool textFinished;//判断是否输出完了当前行的内容

    List<string> textList = new List<string>();

    bool cancelTyping;//取消逐字打印

    private void Awake()

    {

        GetTextFormFile(textFile);//从文本文件中得到文本内容

    }

    private void OnEnable()

    {

        textFinished = true;//当前文本没有输出完

        StartCoroutine(SetTextUI());//获得这一行长度的每一个文字,累加输出

    }

    private void Update()

    {

        if(Input.GetKeyDown(KeyCode.R)&&index==textList.Count)//如果按下R键,并且当前文本索引等于文本总长度

        {

            gameObject.SetActive(false);//销毁当前对话框

            index = 0;//索引归零

            return;

        }

        if (Input.GetKeyDown(KeyCode.R))//按下R键

        {

            if (textFinished && !cancelTyping)//如果上一行文本输入完,并没有取消逐字打印

            {

                StartCoroutine(SetTextUI());//开启逐字打印

            }

            else if (!textFinished && !cancelTyping)//如果上一行文本没有输入完,并没有取消逐字打印

            {

                cancelTyping = true;//取消逐字打印

            }

        }

    }

    /// <summary>

    /// 把整片文件分成每一行,输出到一个列表中,再转换成文本

    /// </summary>

    /// <param name="file"></param>

    void GetTextFormFile(TextAsset file)

    {

        textList.Clear();

        index = 0;

        var lineData = file.text.Split("\n");

        foreach(var line in lineData)

        {

            textList.Add(line);

        }

    }

    /// <summary>

    /// 获得这一行长度的每一个文字,累加输出

    /// </summary>

    /// <returns></returns>

    IEnumerator SetTextUI()

    {

        textLabel.text = "";

        textFinished = false;//文本内容正在输出

        switch (textList[index].Trim().ToString())

        {

            case "A":

                faceImage.sprite = face01;

                Debug.Log("aaa");

                index++;

                break;

            case "B":

                faceImage.sprite = face02;

                index++;

                Debug.Log("bbb");

                break;

        }

        int letter = 0;

        while(!cancelTyping&&letter<textList[index].Length-1)

        {

            Debug.Log("逐字打印");

            textLabel.text += textList[index][letter];

            letter++;

            yield return new WaitForSeconds(textSpeed);

        }

        cancelTyping = false;

        textFinished = true;

        index++;

    }

}

文本逐字打印功能

public class TypewriterEffect : MonoBehaviour

{

    public float charsPerSecond = 0.2f;//打字时间间隔

    private string words;//保存需要显示的文字

    private bool isActive = false;

    private float timer;//计时器

    private Text myText;

    private int currentPos = 0;//当前打字位置

    // Use this for initialization

    void Start()

    {

        timer = 0;

        isActive = true;

        charsPerSecond = Mathf.Max(0.2f, charsPerSecond);

        myText = GetComponent<Text>();

        words = myText.text;

        myText.text = "";//获取Text的文本信息,保存到words中,然后动态更新文本显示内容,实现打字机的效果

    }

    // Update is called once per frame

    void Update()

    {

        OnStartWriter();

    }

    /// <summary>

    /// 执行打字任务

    /// </summary>

    void OnStartWriter()

    {

        if (isActive)

        {

            timer += Time.deltaTime;

            if (timer >= charsPerSecond)

            {//判断计时器时间是否到达

                timer = 0;

                currentPos++;

                myText.text = words.Substring(0, currentPos);//刷新文本显示内容

                if (currentPos >= words.Length)

                {

                    OnFinish();

                }

            }

        }

    }

    /// <summary>

    /// 结束打字,初始化数据

    /// </summary>

    void OnFinish()

    {

        isActive = false;

        timer = 0;

        currentPos = 0;

        myText.text = words;

    }

}

substring()的作用就是截取父字符串的某一部分

public String substring(int beginIndex, int endIndex)

第一个参数int为开始的索引,对应String数字中的开始位置,

第二个参数是截止的索引位置,对应String中的结束位置

GalGame游戏(美少女游戏)文字对话

Galgame游戏

剧本数据类

public class GameManager_BE : MonoBehaviour

{

    public static GameManager_BE Instance { get; private set; }//单例模式

    private List<ScriptData_BE> scriptDatas_BE;

    private int scriptIndex;

private void Awake()

    {

        Instance = this;

        scriptDatas_BE = new List<ScriptData_BE>()

        { //编写剧本对话

            new ScriptData_BE()

            {

                loadType=1,BGspriteName="bg1"//背景图片名字路径

            },

            new ScriptData_BE()

            {

                loadType=2,dialogueContent="上古时期,魔神出世,颠覆六界,屠戮生灵"

            },

             new ScriptData_BE()

            {

                loadType=2,dialogueContent="诸天神尊牺牲毕生修为,献祭无上神器,才得以斩杀魔神。"

            },

              new ScriptData_BE()

            {

                loadType=2,dialogueContent="那一战,众神陨落,神器破碎,换来了,世间万年安宁。"

            },  

            new ScriptData_BE()

            {

                loadType=1,BGspriteName="bg2"//背景图片名字路径

            },

               new ScriptData_BE()

            {

                loadType=2,dialogueContent="然而万年后,第二位魔神横空出世,"

               

            },

                  new ScriptData_BE()

            {

                loadType=2,dialogueContent="他残忍嗜血,暴虐无道,比上古魔神更甚。"

            },

            new ScriptData_BE()

            {

                loadType=2,dialogueContent="各仙门拼死抵抗,修道者前赴后继。"

            },

            new ScriptData_BE()

            {

                loadType=2,dialogueContent="但,尘世已无神。"

            },

             new ScriptData_BE()

            {

                loadType=1,BGspriteName="bg4"//背景图片名字路径

            },

            new ScriptData_BE()

            {

                loadType=3,name="衡阳宗宗主",dialogueContent="自古魔王能号令天下魔物,因其天生邪骨,超脱六界。"

            },

            new ScriptData_BE()

            {

                loadType=3,name="衡阳宗宗主",dialogueContent="过去镜指出,五百年前的魔王,原身是个凡人,叫澹台烬。"

            },

             new ScriptData_BE()

            {

                loadType=3,name="衡阳宗宗主",dialogueContent="苏苏,今日子时是最佳时辰"

            },

              new ScriptData_BE()

            {

                loadType=3,name="衡阳宗宗主",dialogueContent="众位长老会用毕生修为,送你回到五百年前。"

            },

               new ScriptData_BE()

            {

                loadType=3,name="衡阳宗宗主",dialogueContent="那时的魔王还是凡人,你要抽出他邪骨,阻止他觉醒。"

            },

                new ScriptData_BE()

            {

                loadType=3,name="衡阳宗宗主",dialogueContent="想要拯救苍生,只有这个办法"

            },

                    new ScriptData_BE()

            {

                loadType=3,name="黎苏苏",dialogueContent="爹爹放心,苏苏一定全力以赴"

            },

                      new ScriptData_BE()

            {

                loadType=3,name="公治寂无",dialogueContent="师父,师妹年纪还小,让我代她吧"

            },

        };

        scriptIndex = 0;

        HandleData();

    }

    /// <summary>

    /// 处理每一条剧情数据

    /// </summary>

    private void HandleData()

    {

        if (scriptIndex >= scriptDatas_BE.Count)

        {

            Debug.Log("游戏结束");

            return;

        }

        

        if (scriptDatas_BE[scriptIndex].loadType == 1)

        {

            //设置一下背景图片

            SetBGImageSprite(scriptDatas_BE[scriptIndex].BGspriteName);

            //加载下一条剧情数据

            LoadNextScript();

        }

        if (scriptDatas_BE[scriptIndex].loadType == 2)//旁白对话

        {

            

            //更新对话框文本

            UpdateTalkLineText(scriptDatas_BE[scriptIndex].dialogueContent);

        }

        if (scriptDatas_BE[scriptIndex].loadType == 3)//人物对话

        {

            

            //显示人物

            ShowCharacter(scriptDatas_BE[scriptIndex].name);

            //更新对话框文本

            UpdateTalkLineText(scriptDatas_BE[scriptIndex].dialogueContent);

        }

    }

    //设置一下背景图片

    private void SetBGImageSprite(string spriteName)

    {

        UIManager_BE.Instance.SetBGImageSprite(spriteName);

    }

    //加载下一条剧情数据

    public void LoadNextScript()

    {

        Debug.Log("加载下一条剧情");

        scriptIndex++;

        HandleData();

    }

    //显示人物

    private void ShowCharacter(string name)

    {

        UIManager_BE.Instance.ShowCharacter(name);

    }

    //更新对话框文本

    private void UpdateTalkLineText(string dialogueContent)

    {

        UIManager_BE.Instance.UpdateTalkLineText(dialogueContent);

    }

}

/// <summary>

/// 剧本数据

/// </summary>

public class ScriptData_BE

{

    public int loadType;//载入资源类型 1.更换背景 2.旁白对话

    public string name;//角色名称

    public string BGspriteName;//图片资源路径

    public string dialogueContent;//对话内容

}

UIManager_BE

public class UIManager_BE : MonoBehaviour

{

    public static UIManager_BE Instance { get; private set; }

    public Image imgBG;//背景图片组件

    public Image imgCharacter;//人物图片组件

    public Text textName;//人物名称文字组件

    public Text textTalkLine;//人物对话文字组件

    public GameObject talkLineGo;//对话框父对象游戏物体

    private void Awake()

    {

        Instance = this;

    }

    /// <summary>

    /// 设置背景图片

    /// </summary>

    /// <param name="spriteName"></param>

    public void SetBGImageSprite(string spriteName)

    {

        imgBG.sprite = Resources.Load<Sprite>("Sprite_BE/" + spriteName);

    }

    /// <summary>

    /// 显示人物

    /// </summary>

    /// <param name="name"></param>

    public void ShowCharacter(string name)

    {

        talkLineGo.SetActive(true);

        imgCharacter.sprite = Resources.Load<Sprite>("Sprite_BE/" + name);

        imgCharacter.gameObject.SetActive(true);

        textName.text = name;

    }

    /// <summary>

    /// 更新对话内容

    /// </summary>

    /// <param name="dialogueContent"></param>

    public void UpdateTalkLineText(string dialogueContent)

    {

        textTalkLine.text = dialogueContent;

    }

}

Unity—对话系统&&GalGame游戏文字对话制作

 

通过按钮点击对话框,推动人物进行

【仅当学习笔记,特别感谢:M_Studio 我是Trigger呀 UP主,】文章来源地址https://www.toymoban.com/news/detail-421733.html

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

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

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

相关文章

  • 【Unity UIToolkit】UIBuilder基础教程-制作简易的对话系统编辑器 3步教你玩转Unity编辑器扩展工具

    随着Unity开发的深入,基本的Unity编辑器界面并不能满足大部分玩家高阶开发的要求。为了提高开发的效率,有针对性的定制化扩展编辑器界面是提高开发效率的不错选择。 今天就给大家带来Unity官方提高的编辑器扩展工具UIToolkit(集成了UIBuilder和UI Debugger等插件)的使用教程。

    2024年02月04日
    浏览(44)
  • B2:Unity制作Moba类游戏——聊天系统

    一场游戏对局中,和队友进行 友好的有礼貌的有效的沟通 可以极大提升对局胜率。在LOL国服,打字和队友聊天沟通战术是非常常见的行为: 语言的力量是无限的,甚至可以和外国小伙伴效沟通战术:       聊天系统制作起来非常简单,只要熟练掌握C#的TCP通讯协议即可,然

    2024年02月10日
    浏览(25)
  • c++游戏制作指南(三):c++剧情类文字游戏的制作

    🍿*★,°*:.☆( ̄▽ ̄)/$:*.°★* 🍿        🍟欢迎来到静渊隐者的csdn博文,本文是 c++游戏制作指南 的一部🍟 🍕更多文章请点击下方链接🍕 🍨 c++游戏制作指南🍨 🍜 专栏介绍 :在这一专栏中,我将循循善诱,带领你,在冷峻的控制台上,种满缤纷,一同走入c++控制台游

    2024年02月12日
    浏览(26)
  • Unity3D学习之UI系统——用NGUI制作游戏登陆界面

    会省略一些东西,可以看我的NGUI的博客 设置UI分辨率自适应 设置Root 的层级 和摄像机渲染的层级为UI 主摄像机不渲染UI 一般都是美术给一个示意图,然后按示意图上拼面板 3.1.1 制作图集 制作两个新图集 3.1.2 拖面板 检查DrawCall 3.1.3 面板基类 创建面板基类, 首先设置成单例

    2024年02月19日
    浏览(63)
  • unity初学6——简易的UI制作(血条制作)和音频加入以及NPC的对话气泡(2d)

    该文来是学习chutianbo老师的笔记,链接b站 1.右键Hierarchy空白处 UI➡canvas 2.这里一共使用了三个素材 层级结构 UI:初始画布 characters:头像 Mask:遮罩层 healthbar:血条 这里我们先回到UI(也就是一开始创建的Canvas) 我们一开始有用的应该只有渲染模式render Mode,他有三种模式

    2023年04月08日
    浏览(29)
  • Android 开发--利用android studio 制作简单文字打怪升级游戏(伪地牢类)1.开始

    本人目前是大三考研党,之前有学过一些杂七杂八的知识,但是没有办法利用这些知识制作一些真正有用的东西出来。后来自学了android开发,学会使用了android studio,终于决定利用android studio 开发一个游戏出来,也算是我一直以来的梦想吧。但是由于制作水平有限,很多部分只

    2024年02月02日
    浏览(35)
  • 【unity】快速了解游戏制作流程-制作九宫格简单游戏demo

            hi~大家好呀!欢迎来到我的unity学习笔记系列~,本篇我会简单的记录一下游戏流程并且简单上手一个通过九宫格移动到指定位置的小游戏,话不多说,我们直接开始吧~                  本篇源自我看B站一位up主的视频所做的笔记,感兴趣的可以去看原视频哦

    2023年04月08日
    浏览(42)
  • UNITY—2D游戏制作入门!

    Unity作为当今最流行的游戏引擎之一,受到各大厂商的喜爱。 像是炉石传说,以及逃离塔克夫,都是由unity引擎开发制作。 作为初学者的我们,虽然无法直接做出完成度那么高的作品,但每一个伟大的目标,都有一个微不足道的开始。让我们从一个2D小游戏入手,来学习Unit

    2024年02月04日
    浏览(41)
  • 【Unity每日一记】WheelColider组件汽车游戏的关键

    👨‍💻个人主页 :@元宇宙-秩沅 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 秩沅 原创 👨‍💻 收录于专栏 : unity每日一记 ⭐【软件设计师高频考点暴击】 ⭐【Unityc#专题篇】之c#系统化大礼包】 ⭐【unity数据持久化】数据管理类_PlayerPrfs ⭐【u

    2024年02月10日
    浏览(30)
  • Unity制作 小球吃金币 游戏

    工程源文件下载地址-百度网盘 1. 新建一个项目 2. 新建一个平面对象 3. 新建一个材质球 为材质球设置颜色 5. 将材质球拖拽赋值给平面 6.  创建立方体对象,拉伸至平面宽度 7. 再复制三个立方体、调整位置、添加材质,用四个调整过的立方体将平面围起来 8. 创建一个球体(

    2024年01月15日
    浏览(34)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包