继续来写Galgame项目。昨天写的脚本很多地方都很不规范,今天来整改一下。


首先想了一下,决定直接把DialogueTrigger删掉,硬要加入一个中间组件会使两段对话的衔接处出现很大的问题,还不如去掉,全部用DialogueManager来实现。直接定义一个GameObject的数组,来存放所有对话Object。然后是其他的定义部分,看名字应该都能懂。

//public varible for dialogue displaypublic GUISkin FontSet;//GUI SKINpublic GameObject[] Conversations;public Texture2D TxtBackground;public Texture2D TxtCharacter;public string Current_String;public string Speaker;public AudioClip Current_BGM;//private varible for some parametersprivate int ConversationAmount;private int ConversationArraySign;private string Temp_String;//Used for displayprivate string[] Dialogue_Array;private bool UpdateTrigger;private bool EndFlag;private Rect DrawPos;

我们先来把全局变量定义了,因为等会儿会用到文字显示的状态。新建一个GlobalManager脚本,定义枚举变量。估计BGM也会用全局变量来控制,定义了再说。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//Used for State Switch
public enum Project_State {none,playing,pause}
public enum GameBGM {none,bgm1,bgm2,bgm3,bgm4}
public class Display_State : MonoBehaviour {//Initialize;public static Project_State Displaying_State = Project_State.none;public static GameBGM Dialogue_BGM = GameBGM.none;
}

修改了一下对话元素的内容,添加三个矩形来改变立绘的位置,并用index来选择绘制位置,在Manager中用switch语句来控制。

public class IndividualConversation : MonoBehaviour {public Texture2D Background;public Texture2D Character;public string Speaker;public string[] Conversations;public int index;public AudioClip BgmSelection;public Rect[] Positions=new Rect[3];void Awake(){Positions[0] = new Rect(new Rect(200, 100, Character.width, Character.height));Positions[1] = new Rect(new Rect(100, 100, Character.width, Character.height));Positions[2] = new Rect(new Rect(300, 100, Character.width, Character.height));}
}

然后要实现动态显示文字的功能必须用到协程,必须规划好,播放对话的内容只能用一个协程来实现,不然会出现混乱的情况,函数内容和昨天Trigger里的实现原理相似,在命名上稍微规范了下。

IEnumerator Playing_Conversation(GameObject[] Cur_Conversation){Display_State.Displaying_State = Project_State.playing;foreach (GameObject gb1 in Cur_Conversation){//InitializingCurrent_BGM = gb1.GetComponent<IndividualConversation>().BgmSelection;Dialogue_Array = gb1.GetComponent<IndividualConversation>().Conversations;TxtBackground = gb1.GetComponent<IndividualConversation>().Background;TxtCharacter = gb1.GetComponent<IndividualConversation>().Character;//Get Character Positionswitch(gb1.GetComponent<IndividualConversation>().index){case 0:DrawPos = gb1.GetComponent<IndividualConversation>().Positions[0];break;case 1:DrawPos = gb1.GetComponent<IndividualConversation>().Positions[1];break;case 2:DrawPos = gb1.GetComponent<IndividualConversation>().Positions[2];break;default:DrawPos = gb1.GetComponent<IndividualConversation>().Positions[1];break;}yield return new WaitForEndOfFrame();ConversationArraySign = 0;int StringSign = 0;Current_String = "";Debug.Log("Start Text Display");//Debug if Got or not//Debug.Log(Dialogue_Array.Length);//while (ConversationArraySign < Dialogue_Array.Length){Temp_String = Dialogue_Array[ConversationArraySign];while (StringSign < Temp_String.Length &&Current_String.Length < Temp_String.Length && Display_State.Displaying_State == Project_State.playing){Debug.Log(StringSign);Current_String += Temp_String[StringSign];yield return new WaitForSeconds(0.05f);StringSign += 1;}if (Current_String != Temp_String){Current_String = Temp_String;}Display_State.Displaying_State = Project_State.pause;while (Display_State.Displaying_State == Project_State.pause){yield return new WaitForSeconds(0.01f);}Current_String = "";ConversationArraySign++;StringSign = 0;}}StopCoroutine("Playing_Conversation");}

更新状态变化的函数在此(在update()中调用):

void UpdateState(){if(Display_State.Displaying_State == Project_State.playing&&UpdateTrigger==true){Display_State.Displaying_State = Project_State.pause;}else if (Display_State.Displaying_State == Project_State.pause && UpdateTrigger == true){Display_State.Displaying_State = Project_State.playing;}}

BGM还没想好怎么弄,是该直接在对话里加载还是用全局变量,之后再想吧。还需要好感度,选择支的设置,以及存档读取功能的实现,还是有点麻烦的,这几天慢慢来实现。
把脚本和图片挂上去,试一试效果



界面太丑,GUI掌握得太浅了,还需要继续学习。明天继续
把整个Manager贴上来给大家把玩

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class DialogueManager : MonoBehaviour {//public varible for dialogue displaypublic GUISkin FontSet;public GameObject[] Conversations;public Texture2D TxtBackground;public Texture2D TxtCharacter;public string Current_String;public string Speaker;public AudioClip Current_BGM;//private varible for some parametersprivate int ConversationAmount;private int ConversationArraySign;private string Temp_String;private string[] Dialogue_Array;private bool UpdateTrigger;private bool EndFlag;private Rect DrawPos;private void Awake(){Current_String="";Temp_String = "";ConversationAmount = 0;ConversationArraySign = 0;UpdateTrigger = false;EndFlag = false;}void Start () {StartCoroutine("Playing_Conversation", Conversations);}private void OnGUI(){GUI.skin = FontSet;GUI.DrawTexture(new Rect(0, 0, Screen.width, Screen.height),TxtBackground);GUI.DrawTexture(DrawPos, TxtCharacter);GUI.Label(new Rect(20, Screen.height - 70, Screen.width - 30, 30), Current_String);GUI.Label(new Rect(20, Screen.height - 120, 50, 20), "未定义");UpdateTrigger= GUI.Button(new Rect(Screen.width - 100, Screen.height - 100, 90, 40),"continue");}void UpdateState(){if(Display_State.Displaying_State == Project_State.playing&&UpdateTrigger==true){Display_State.Displaying_State = Project_State.pause;}else if (Display_State.Displaying_State == Project_State.pause && UpdateTrigger == true){Display_State.Displaying_State = Project_State.playing;}}void SelectBGM(GameObject para){GameObject BGMPlayer = GameObject.Find("BGM_Manager/BGM_Source");}IEnumerator Playing_Conversation(GameObject[] Cur_Conversation){Display_State.Displaying_State = Project_State.playing;foreach (GameObject gb1 in Cur_Conversation){//InitializingCurrent_BGM = gb1.GetComponent<IndividualConversation>().BgmSelection;Dialogue_Array = gb1.GetComponent<IndividualConversation>().Conversations;TxtBackground = gb1.GetComponent<IndividualConversation>().Background;TxtCharacter = gb1.GetComponent<IndividualConversation>().Character;//Get Character Positionswitch(gb1.GetComponent<IndividualConversation>().index){case 0:DrawPos = gb1.GetComponent<IndividualConversation>().Positions[0];break;case 1:DrawPos = gb1.GetComponent<IndividualConversation>().Positions[1];break;case 2:DrawPos = gb1.GetComponent<IndividualConversation>().Positions[2];break;default:DrawPos = gb1.GetComponent<IndividualConversation>().Positions[1];break;}yield return new WaitForEndOfFrame();ConversationArraySign = 0;int StringSign = 0;Current_String = "";Debug.Log("Start Text Display");//Debug if Got or not//Debug.Log(Dialogue_Array.Length);//while (ConversationArraySign < Dialogue_Array.Length){Temp_String = Dialogue_Array[ConversationArraySign];while (StringSign < Temp_String.Length &&Current_String.Length < Temp_String.Length && Display_State.Displaying_State == Project_State.playing){Debug.Log(StringSign);Current_String += Temp_String[StringSign];yield return new WaitForSeconds(0.05f);StringSign += 1;}if (Current_String != Temp_String){Current_String = Temp_String;}Display_State.Displaying_State = Project_State.pause;while (Display_State.Displaying_State == Project_State.pause){yield return new WaitForSeconds(0.01f);}Current_String = "";ConversationArraySign++;StringSign = 0;}}StopCoroutine("Playing_Conversation");}// Update is called once per framevoid Update () {UpdateState();}
}

Unity3D学习记录(实现一个简单的Galgame)(二)相关推荐

  1. 【Unity3D学习记录#2】Android调用Unity界面 与 信息交互

    [Unity3D学习记录#2]Android调用Unity界面 与 信息交互 Android 调用 Unity Unity项目构建 Android项目构建 Android 与 Unity 的信息交互 ...

  2. 日常学习记录——pycharm+tensorflow简单图像识别

    日常学习记录--pycharm+tensorflow简单图像识别 写在前面 1 实验代码 2 实验结果 2.1 测试集的正确率 2.2 单个预测结果 2.3 集体预测结果 总结与标记 写在前面 使用p ...

  3. Flutter学习笔记 —— 完成一个简单的新闻展示页

    Flutter学习笔记 -- 完成一个简单的新闻展示页 前言 思路分析 案例代码 结束语 上图 前言 刚学Flutter不久,今天我们来看看如何使用 Container & ListView实 ...

  4. easy-mock写的一个简单的模拟二页的反馈

    用easy-mock写的一个简单的模拟二页的反馈,因为后端团队比较传统,所以设计的结构不太规范. 功能:每页10条,共2页,共12条记录,超出参数范围会返错误码: easy模板: {code: fun ...

  5. Geek 02 学习记录 (实现一个最简单内核)

    02 实现一个最简单内核的学习记录 1. 分区表 GPT 和 DBR 的区别 主引导扇区:硬盘的0柱面.0磁头.1扇区(也叫主引导记录MBR),大小为512Byte. 分区表(DPT):位于主引导分区 ...

  6. Unity3D学习记录(跑酷小游戏第四阶段)

    这磨人的小游戏项目也要接近尾声了,大概还差一两天的进度吧.最近在看佐佐木智广的<游戏剧本怎么写>,讲了很多Galgame的剧情.脚本设置,非常有意思的一本书,有时间我开个新坑来做一些读书笔 ...

  7. 【Java学习】从一个简单的HelloWorld项目中入门maven

    创建一个maven项目 这里推荐官方文档:maven官方文档 [注]此篇文章也是笔者学习笔记,如有错误,请见谅. [注]我把Goal翻译成命令.比如Plugin Goal: ps:我他喵的写了一大半的 ...

  8. golang游戏开发学习笔记-开发一个简单的2D游戏(基础篇)

    此文写在golang游戏开发学习笔记-创建一个能自由探索的3D世界之后,感兴趣可以先去那篇文章了解一些基础知识,在这篇文章里我们要创建一个简单的2D游戏场景以及配套的人物,并实现人物运动和碰撞检测功能 ...

  9. Unity3d 学习记录

    1.代码中的gameObject表示当前的组件资源对象 2.坐标轴: X:调整左右方向,从左往右值不断增大 Y:调整上下方向,从下往上值不断增大 Z:调整前后方向,离屏幕越近值越小,离屏值越远值越大 ...

最新文章

  1. ADPRL - 近似动态规划和强化学习 - Note 10 - 蒙特卡洛法和时序差分学习及其实例 (Monte Carlo and Temporal Difference)
  2. 第四层到第七层的高层交换技术及其应用
  3. 【转载】CentsOS系统inotify实时监控服务器文件(夹)定制事件处理程序
  4. Flutter开发之官网的第一个例子实现(46)
  5. 李兴球python创意编程视频云盘_A36_Python滚动的字幕_教学视频
  6. Relation(NOIP模拟赛)(二分图染色)
  7. java 显示透明背景png图片
  8. 【极客学院出品】Cocos2d-X系列课程之六-用户交互事件处理方法
  9. k近邻算法matlab实现_k近邻算法
  10. 时序分析基本概念介绍<AOCV>
  11. PHP开源的项目管理软件
  12. Java实现二维码生成及图片合成
  13. 《SEM长尾搜索营销策略解密》一一2.14 3M的奇思妙想,原来来自长尾
  14. thingworx- 安装thingworx120天试用版步骤
  15. 一道受用终身的测试题
  16. 食品药品舆情传播规律分析
  17. 什么是激光波长、激光功率和激光亮度?
  18. linux系统盘锁着,用Linux启动盘解决硬盘逻辑锁
  19. NLP | textCNN textRNN 图文详解及代码
  20. xslt 标签取集合第一条数据_用 Asp.Net 建立一个在线 RSS 新闻聚合器

热门文章

  1. 青蛙跳台问题的递归实现(c语言)
  2. 提高 Linux 上 socket 性能
  3. python 仪表数字识别_利用Python进行数字识别
  4. android 闪屏引导,启动体验设计-闪屏,启动页,引导页
  5. 市面上“乡巴佬”真假难辨,著名商标抢注竞争激烈
  6. 腾讯云轻量应用服务器性能测评(全网超详细)
  7. 力创eda 画布大小_立创EDA快速上手经验篇.docx
  8. Python解读通讯录(Excel表格)
  9. 代码调试core-踩内存
  10. [Professor麦]深入剖析Mybatis缓存机制