继续来写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. ubuntu 14.0 下github 配置
  2. Oral English 1: A topic about public transportaion in Chicago.
  3. 6、SpringBoot+Mybatis整合------参数传递
  4. 并发基础(三): java线程优先级小试牛刀
  5. E打开https网站时,提示此网站的安全证书有问题(证书无效)
  6. 【H.264/AVC视频编解码技术】序章【编码的前世今生】
  7. 视频压缩的I帧,P帧和B帧。
  8. Arm 进击自定义指令集,成立自动驾驶计算联盟!
  9. win11多桌面功能怎么使用 win11多桌面设置步骤
  10. 基于OpenCV的计算机视觉入门(4)线段和形状的绘制
  11. 2011北理机试题——层次关系
  12. 假疫苗事件,错在企业,责任在管理部门
  13. 2022年最新过DD检测方法dd防检测方法
  14. php抖音跳转地址,PHP如何实现解析抖音无水印视频
  15. Cadence PSpice 仿真9:低通滤波器蒙特卡洛分析仿真实战图文教程
  16. 多喝牛奶少吃糖 正确饮食摆脱经前综合征
  17. 用于自动化的 10 个杀手级 Python 脚本
  18. Web自动化测试教程
  19. C++无名命名空间中定义的函数不使用造成“-Wunused-function”警告问题
  20. 计算机控制直流电机闭环调速实验报告,PID控制电机实验报告

热门文章

  1. Linux—教你如何高效的批量网络装机
  2. 用爬虫分析沪深300指数超长走势
  3. PCI Express物理层 - 电气部分
  4. 计算机视觉及模式识别技术在农业领域的应用
  5. 了解平面设计师培训内容,轻松找对方向不迷路
  6. html背景图片半透明遮罩,css 背景模糊+半透明 不影响内容如何做?
  7. 润和软件与华秋达成生态共创合作,共同推动物联网硬件创新
  8. python爬图片_python爬取图片,保存图片到本地
  9. 【前端知识之CSS】CSS视差滚动
  10. 谷歌的秘密招聘挑战,你可否与之一战?