11自动前进,快进,系统设定界面
本教程由水螅制作,教程内所有提供下载的练习素材皆为水螅制作,只可用于练习,不可用于其他用途。
接下来我们做自动前进按钮autobt
这个就更是简单了……我们来写这个function setauto
bool onauto = false;
public void setauto()
{
if(!onwaitclick)
{
return;
}
onauto = true;
onwaitclick = false;
GameObject.Find("ui_dialog").transform.Find("drop").gameObject.SetActive(false);
startscript();
}
将setauto挂在autobt上,然后我们在设定onwaitclick的地方加一句如果是在自动中,就不设定onwaitclick而是直接执行下一行脚本
IEnumerator showtext()
{
GameObject temp = GameObject.Find("ui_dialog");
Text t1 = temp.transform.Find("ui_dialog_text").gameObject.GetComponent<Text>();
t1.text = "";
while(dtext.Length>0)
{
t1.text = t1.text + dtext.Substring(0, 1);
dtext = dtext.Substring(1);
yield return new WaitForSeconds(0.1f);
}
if (onauto)
{
startscript();
}
else
{
temp.transform.Find("drop").gameObject.SetActive(true);
onwaitclick = true;
}
}
最后在update里边设置当自动进行中的时候点击屏幕任意地方停止自动进行
void Update () {
//当自动进行中的时候点击屏幕停止自动进行
if(onauto && Input.GetMouseButtonUp(0) && !EventSystem.current.IsPointerOverGameObject())
{
onauto = false;
}
//当正在等待点击的时候鼠标点击了就继续读下一行脚本
else if (onwaitclick && Input.GetMouseButtonUp(0)&&!EventSystem.current.IsPointerOverGameObject())
{
//如果对话框被隐藏就显示对话框
if (onhidedialog)
{
onhidedialog = false;
GameObject.Find("Canvas").transform.Find("ui_dialog").gameObject.SetActive(true);
return;
}
onwaitclick = false;
GameObject.Find("ui_dialog").transform.Find("drop").gameObject.SetActive(false);
startscript();
}
}
这样就好了…………
然后我们来做快进按钮……
总觉得快要放不下了…………一般来说游戏里也不会把所有这些功能都排在对话框上啦,可能会另外再做一个系统按钮,点击后展开按钮组之类的,我们为了省事就全部都壮观的排在这里~
大家如果有兴趣也可以自己试试做一个系统按钮,点击后展开这些功能按钮,用我们之前熟悉的手段,很容易就可以完成。
setskip的function和setauto基本一样就多一句加速,写好之后挂在skipbt上
public void setskip()
{
if (!onwaitclick)
{
return;
}
onauto = true;
Time.timeScale = 10f;//以十倍速进行游戏……
onwaitclick = false;
GameObject.Find("ui_dialog").transform.Find("drop").gameObject.SetActive(false);
startscript();
}
在update里边将速度回复正常
void Update () {
//当自动进行中的时候点击屏幕停止自动进行
if(onauto && Input.GetMouseButtonUp(0) && !EventSystem.current.IsPointerOverGameObject())
{
onauto = false;
Time.timeScale = 1f;
}
//当正在等待点击的时候鼠标点击了就继续读下一行脚本
else if (onwaitclick && Input.GetMouseButtonUp(0)&&!EventSystem.current.IsPointerOverGameObject())
{
//如果对话框被隐藏就显示对话框
if (onhidedialog)
{
onhidedialog = false;
GameObject.Find("Canvas").transform.Find("ui_dialog").gameObject.SetActive(true);
return;
}
onwaitclick = false;
GameObject.Find("ui_dialog").transform.Find("drop").gameObject.SetActive(false);
startscript();
}
}
然后我们要在回到开始界面的returntotitle1里边把速度也调回来
void returntotitle1()
{
Time.timeScale = 1f;
StartCoroutine(clearscreen("returntotitle2"));
}
嗯这样就好了……真的是非常简单…………
我们再来增加一个系统设定按钮configbt,按钮放不下config,就写前四个字吧
然后来拉config界面ui_config
录他的淡入淡出动画(实不相瞒从load开始我几乎所有界面都直接用了save的淡入淡出动画没有再另外做……其实如果不是想要不同的淡入方式的话就一直用同一个动画就好),写淡入淡出函数configfadein和configfadeout,把对话框上的configbt挂上configfadein,把ui_config上的返回按钮挂上configfadeout
然后我们在configfadein里边给各个按钮挂载上设定功能的事件
public void configfadein()
{
if (!onwaitclick)
{
return;
}
GameObject temp = GameObject.Find("Canvas").transform.Find("ui_config").gameObject;
temp.SetActive(true);
Animator an = temp.GetComponent<Animator>();
an.SetInteger("a_num", 1);
//找到背景音乐音量滑条
Scrollbar s1 = temp.transform.Find("bgmvolume/Scrollbar").gameObject.GetComponent<Scrollbar>();
//将背景音乐音量的值显示在滑条上
s1.value = GameObject.Find("bgm").GetComponent<AudioSource>().volume;
//给滑条挂载改变音量的事件,onValueChanged是滑动条的事件,如名字所说,当用户拉动滑条的时候就不停触发这个事件
s1.onValueChanged.RemoveAllListeners();
s1.onValueChanged.AddListener(delegate (float num)
{
GameObject.Find("bgm").GetComponent<AudioSource>().volume = num;
//将设定好的值写入sf["bgmvolume"],这样下次打开游戏的时候可以用这个来还原设置好的音量
sf["bgmvolume"] = num.ToString();
});
//找到音效音量滑条
s1 = temp.transform.Find("sevolume/Scrollbar").gameObject.GetComponent<Scrollbar>();
s1.value = GameObject.Find("se").GetComponent<AudioSource>().volume;
s1.onValueChanged.RemoveAllListeners();
s1.onValueChanged.AddListener(delegate (float num)
{
GameObject.Find("se").GetComponent<AudioSource>().volume = num;
sf["sevolume"] = num.ToString();
});
//找到语音音量滑条
s1 = temp.transform.Find("voicevolume/Scrollbar").gameObject.GetComponent<Scrollbar>();
s1.value = GameObject.Find("voice").GetComponent<AudioSource>().volume;
s1.onValueChanged.RemoveAllListeners();
s1.onValueChanged.AddListener(delegate (float num)
{
GameObject.Find("voice").GetComponent<AudioSource>().volume = num;
sf["voicevolume"] = num.ToString();
});
//找到文字速度滑条,我们用sf["textspeed"]来放文字速度
s1 = temp.transform.Find("textspeed/Scrollbar").gameObject.GetComponent<Scrollbar>();
s1.value = 1-(float)Convert.ToDouble(sf["textspeed"]);
s1.onValueChanged.RemoveAllListeners();
s1.onValueChanged.AddListener(delegate (float num)
{
sf["textspeed"] =(1- num).ToString();
});
//我们写一个function用来让底下的测试文字一直根据玩家设定的速度蹦字
StartCoroutine(texttest());
//根据设定来显示语音设定按钮和窗口化按钮的颜色
configbtcolorset();
//给按钮挂上事件
for (int i = 1; i <= 2; i++)
{
Button b1 = temp.transform.Find("voiceset/cha"+i+"/offbt").gameObject.GetComponent<Button>();
b1.onClick.RemoveAllListeners();
string btname = "fg" + i + "voice";
b1.onClick.AddListener(delegate ()
{
sf[btname] = "0";
//因为值变了所以重新刷新一下按钮颜色
configbtcolorset();
});
b1 = temp.transform.Find("voiceset/cha" + i + "/onbt").gameObject.GetComponent<Button>();
b1.onClick.RemoveAllListeners();
b1.onClick.AddListener(delegate ()
{
sf[btname] = "1";
configbtcolorset();
});
}
//设定窗口化按钮事件
Button b2 = temp.transform.Find("winset/winbt").gameObject.GetComponent<Button>();
b2.onClick.RemoveAllListeners();
b2.onClick.AddListener(delegate ()
{
sf["fullscreen"] = "0";
Screen.fullScreen = false;
configbtcolorset();
});
b2 = temp.transform.Find("winset/fullbt").gameObject.GetComponent<Button>();
b2.onClick.RemoveAllListeners();
b2.onClick.AddListener(delegate ()
{
sf["fullscreen"] = "1";
Screen.fullScreen = true;
configbtcolorset();
});
}
IEnumerator texttest()
{
float max = 0.3f;
float min = 0f;
Text t1 = GameObject.Find("ui_config").transform.Find("textspeed/testtext").gameObject.GetComponent<Text>();
string text = "我是速度测试文字";
while(GameObject.Find("ui_config"))
{
if (text == "")
{
text = t1.text;
t1.text = "";
}
t1.text = t1.text+text.Substring(0, 1);
text = text.Substring(1);
float speed = (float)Convert.ToDouble(sf["textspeed"]) * (max - min);
yield return new WaitForSeconds(speed);
}
}
void configbtcolorset()
{
//定义开关状态的按钮颜色
Color32 offcolor = new Color32(204, 204, 204, 255);
Color32 oncolor = new Color32(255, 255, 255, 255);
//循环设定所有角色语音按钮的颜色
GameObject temp = GameObject.Find("Canvas").transform.Find("ui_config").gameObject;
for (int i = 1; i <= 2; i++)
{
Button b1 = temp.transform.Find("voiceset/cha"+i+"/offbt").gameObject.GetComponent<Button>();
ColorBlock btcolors = b1.colors;
if (sf["fg"+i+"voice"] == "1")
{
btcolors.normalColor = offcolor;
}
else
{
btcolors.normalColor = oncolor;
}
b1.colors = btcolors;
b1 = temp.transform.Find("voiceset/cha"+i+"/onbt").gameObject.GetComponent<Button>();
if (sf["fg"+i+"voice"] != "1")
{
btcolors.normalColor = offcolor;
}
else
{
btcolors.normalColor = oncolor;
}
b1.colors = btcolors;
}
//设定窗口全屏按钮的颜色
Button b2 = temp.transform.Find("winset/winbt").gameObject.GetComponent<Button>();
ColorBlock btcolors2 = b2.colors;
if (sf["fullscreen"] == "1")
{
btcolors2.normalColor = offcolor;
}
else
{
btcolors2.normalColor = oncolor;
}
b2.colors = btcolors2;
b2 = temp.transform.Find("winset/fullbt").gameObject.GetComponent<Button>();
if (sf["fullscreen"] == "1")
{
btcolors2.normalColor = oncolor;
}
else
{
btcolors2.normalColor = offcolor;
}
b2.colors = btcolors2;
}
写完之后我们意识到需要在游戏开始的时候将设定好的系统值都赋值给各个地方,于是我们来写一个叫做configset的function做这件事
void configset()
{
//设定音乐音量值
if(!sf.ContainsKey("bgmvolume"))
{
sf["bgmvolume"] = "1";
}
GameObject.Find("bgm").GetComponent<AudioSource>().volume = (float)Convert.ToDouble(sf["bgmvolume"]);
//设定音效音量值
if (!sf.ContainsKey("sevolume"))
{
sf["sevolume"] = "1";
}
GameObject.Find("se").GetComponent<AudioSource>().volume = (float)Convert.ToDouble(sf["sevolume"]);
//设定语音音量值
if (!sf.ContainsKey("voicevolume"))
{
sf["voicevolume"] = "1";
}
GameObject.Find("voice").GetComponent<AudioSource>().volume = (float)Convert.ToDouble(sf["voicevolume"]);
//设定文字速度默认值
if (!sf.ContainsKey("textspeed"))
{
sf["textspeed"] = "0.2";
}
//设定语音开关默认值
for(int i=1;i<=2;i++)
{
if (!sf.ContainsKey("fg"+i+"voice"))
{
sf["fg"+i+"voice"] = "1";
}
}
//设定窗口默认值
if (!sf.ContainsKey("fullscreen"))
{
sf["fullscreen"] = "0";
}
}
在游戏开始时候调用一次configset
void Start () {
loadsf();
configset();
readscript();
startscript();
Application.wantsToQuit += quit;
}
另外在蹦字函数里将我们设定好的速度也加上去
IEnumerator showtext()
{
GameObject temp = GameObject.Find("ui_dialog");
Text t1 = temp.transform.Find("ui_dialog_text").gameObject.GetComponent<Text>();
t1.text = "";
float max = 0.3f;
float min = 0f;
float speed = (float)Convert.ToDouble(sf["textspeed"]) * (max - min);
while(dtext.Length>0)
{
t1.text = t1.text + dtext.Substring(0, 1);
dtext = dtext.Substring(1);
yield return new WaitForSeconds(speed);
}
if (onauto)
{
startscript();
}
else
{
temp.transform.Find("drop").gameObject.SetActive(true);
onwaitclick = true;
}
}
语音播放的地方,我们来写一下根据设定来判定是否播放这个文件的功能
void voice(Dictionary<string, string> elm)
{
//判断是否能够播放这个人的语音,我这里只是给思路所以写的很粗略,比如无法分辨fg1和fg11的情况,语音文件名长度也没有做检验,实际使用的时候请自行写的细致一点
for (int i = 1; i <= 2; i++)
{
if (elm["storage"].Substring(0, 3) == "fg"+i && sf["fg"+i+"voice"] != "1")
{
startscript();
return;
}
}
f["voice"] = elm["storage"];
//我们将语音播放的function独立出来,用于在重放语音的时候也能进行调用
voice1(elm["storage"]);
startscript();
GameObject.Find("ui_dialog").transform.Find("voicebt").gameObject.SetActive(true);
}
这样就好了。大家可以跑一下测试看看,窗口化部分在编辑器测试模式是跪的,打包成exe之后就正常了。
然后我们在开始界面增加上设定按钮opbt4.png
和读取存档按钮一样,我们稍微改一下configfadein
public void configfadein()
{
if (!onwaitclick)
{
return;
}
configfadein1();
}
public void configfadein1()
{
GameObject temp = GameObject.Find("Canvas").transform.Find("ui_config").gameObject;
temp.SetActive(true);
…………下略………………
把configfadein1挂在系统设定按钮上即可。
我们的整个游戏已经做得差不多了,下一篇我们来写一个完整的剧本,然后示范一下二周目的判断,再做一下CG一览的部分。
Created by Hydrozoa.2011
不支持IE7以下浏览器
凯恩插件程序:Hydrozoa 美术:Hydrozoa,红渊