Unity3D学习记录(实现一个简单的Galgame)(二)
继续来写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)(二)相关推荐
- 【Unity3D学习记录#2】Android调用Unity界面 与 信息交互
[Unity3D学习记录#2]Android调用Unity界面 与 信息交互 Android 调用 Unity Unity项目构建 Android项目构建 Android 与 Unity 的信息交互 ...
- 日常学习记录——pycharm+tensorflow简单图像识别
日常学习记录--pycharm+tensorflow简单图像识别 写在前面 1 实验代码 2 实验结果 2.1 测试集的正确率 2.2 单个预测结果 2.3 集体预测结果 总结与标记 写在前面 使用p ...
- Flutter学习笔记 —— 完成一个简单的新闻展示页
Flutter学习笔记 -- 完成一个简单的新闻展示页 前言 思路分析 案例代码 结束语 上图 前言 刚学Flutter不久,今天我们来看看如何使用 Container & ListView实 ...
- easy-mock写的一个简单的模拟二页的反馈
用easy-mock写的一个简单的模拟二页的反馈,因为后端团队比较传统,所以设计的结构不太规范. 功能:每页10条,共2页,共12条记录,超出参数范围会返错误码: easy模板: {code: fun ...
- Geek 02 学习记录 (实现一个最简单内核)
02 实现一个最简单内核的学习记录 1. 分区表 GPT 和 DBR 的区别 主引导扇区:硬盘的0柱面.0磁头.1扇区(也叫主引导记录MBR),大小为512Byte. 分区表(DPT):位于主引导分区 ...
- Unity3D学习记录(跑酷小游戏第四阶段)
这磨人的小游戏项目也要接近尾声了,大概还差一两天的进度吧.最近在看佐佐木智广的<游戏剧本怎么写>,讲了很多Galgame的剧情.脚本设置,非常有意思的一本书,有时间我开个新坑来做一些读书笔 ...
- 【Java学习】从一个简单的HelloWorld项目中入门maven
创建一个maven项目 这里推荐官方文档:maven官方文档 [注]此篇文章也是笔者学习笔记,如有错误,请见谅. [注]我把Goal翻译成命令.比如Plugin Goal: ps:我他喵的写了一大半的 ...
- golang游戏开发学习笔记-开发一个简单的2D游戏(基础篇)
此文写在golang游戏开发学习笔记-创建一个能自由探索的3D世界之后,感兴趣可以先去那篇文章了解一些基础知识,在这篇文章里我们要创建一个简单的2D游戏场景以及配套的人物,并实现人物运动和碰撞检测功能 ...
- Unity3d 学习记录
1.代码中的gameObject表示当前的组件资源对象 2.坐标轴: X:调整左右方向,从左往右值不断增大 Y:调整上下方向,从下往上值不断增大 Z:调整前后方向,离屏幕越近值越小,离屏值越远值越大 ...
最新文章
- ubuntu 14.0 下github 配置
- Oral English 1: A topic about public transportaion in Chicago.
- 6、SpringBoot+Mybatis整合------参数传递
- 并发基础(三): java线程优先级小试牛刀
- E打开https网站时,提示此网站的安全证书有问题(证书无效)
- 【H.264/AVC视频编解码技术】序章【编码的前世今生】
- 视频压缩的I帧,P帧和B帧。
- Arm 进击自定义指令集,成立自动驾驶计算联盟!
- win11多桌面功能怎么使用 win11多桌面设置步骤
- 基于OpenCV的计算机视觉入门(4)线段和形状的绘制
- 2011北理机试题——层次关系
- 假疫苗事件,错在企业,责任在管理部门
- 2022年最新过DD检测方法dd防检测方法
- php抖音跳转地址,PHP如何实现解析抖音无水印视频
- Cadence PSpice 仿真9:低通滤波器蒙特卡洛分析仿真实战图文教程
- 多喝牛奶少吃糖 正确饮食摆脱经前综合征
- 用于自动化的 10 个杀手级 Python 脚本
- Web自动化测试教程
- C++无名命名空间中定义的函数不使用造成“-Wunused-function”警告问题
- 计算机控制直流电机闭环调速实验报告,PID控制电机实验报告