12写一个完整的剧本,二周目,CG一览
本教程由水螅制作,教程内所有提供下载的练习素材皆为水螅制作,只可用于练习,不可用于其他用途。
接下来我们想要做一个CG一览,但是在做之前,首先我们要有CG…………姑且就用这个吧CG1.jpg CG2.jpg
CG就是一张图,一般就直接用显示背景图的机制来显示,我们额外需要做的是写个能把所以立绘背景一起淡出的function。起名叫allfadeout好了(喂),顺便一提我之前嫌一秒的淡入淡出时间太慢了,就把所有动画时间都缩短了一点。所以在每个function的等待时间上我的代码可能和你的时间不是很一致,请按照你自己的动画时间加个0.05秒就好。
void allfadeout()
{
f["bg"] = "";
GameObject.Find("bg1").GetComponent<Animator>().SetInteger("a_num", 2);
string[] s1 = {"r","c","l" };
for (int i=0;i<s1.Length;i++)
{
f["fg" + s1[i]] = "";
GameObject.Find("rfg" + s1[i]).GetComponent<Animator>().SetInteger("a_num", 2);
}
StartCoroutine(waittime(0.8f));
}
然后我们来设计一下剧本。
开始
宿彦:今天天气不错,name,你要吃包子吗?
费斌:你能不能不要一直都是包子包子。
宿彦:你这种人哪里懂得包子的好。
费斌:我本来也不想懂……
费斌:name,你不用勉强自己配合这个笨蛋也没关系的。
费斌:比起包子,当然还是饺子比较好吃。
主角:说到笨蛋的程度你也没有差好嘛…………
宿彦:不要被他迷惑了!来和我一起吃包子吧。
费斌:说什么胡话,name当然是要和我一起吃饺子。
选项:吃包子(进入宿彦路线) 吃饺子(进入费斌路线)
宿彦路线
费斌:………………真是不智。
(费斌离开)
宿彦:哼,那个啰嗦的家伙终于走了。希望他也能稍微想明白这个世界是包子的世界的现实。
宿彦:你想吃哪种包子?
选项:肉包子(宿彦好感+1) 素包子(宿彦好感+0)
肉包子
宿彦:就是要肉包子才能吃得饱嘛。
(合流)
素包子
宿彦:不吃肉的话一小会就又会饿起来了吧……还是吃肉包子吧。
独白:那你还让我选什么选!
(合流)
合流
宿彦:是要吃梅菜肉包还是白菜肉包呢?
选项:梅菜肉包(宿彦好感+0) 白菜肉包(宿彦好感+1)
梅菜肉包
宿彦:我更喜欢白菜肉包,不过既然你喜欢这个,那么梅菜肉包就全部给你。
(合流)
白菜肉包
宿彦:和我一样呢,真是开心。
(合流)
合流
独白:…………………………
宿彦:吃完了。你还没有吃完嘛?吃得好慢。
选项 分他一半(宿彦好感+1) 继续慢慢吃(宿彦好感+0)
分他一半
宿彦:哎?可以吗?我恰好也没太吃饱……
(合流)
继续慢慢吃
宿彦:不用着急,我会等着你的。吃饭慢一点对肠胃也很好。
(合流)
合流
独白:………………………………
宿彦:啊吃饱了真开心。包子真的是天底下最好的食物。
选项 包子天下第一(宿彦flag1) 我觉得一般吧(宿彦路线失败)
包子天下第一
宿彦:你也这么觉得吗?我就知道你懂得的!
(显示CG1)
(合流)
我觉得一般吧
宿彦:真是可惜,你竟然不懂得包子的好呢。
(合流)
合流
宿彦:啊说起来,
(检测好感度>=2且flag1的情况下进入宿彦he,其他情况进入宿彦ne)
he
宿彦:今天晚上你有空吗?有些事情想要对你说。
主角:现在直接说不行吗?
宿彦:…………我也得,稍微准备一下……啊总之就是这样,晚上见。
(宿彦离开)
(游戏结束)
ne
宿彦:…………嗯,也没什么,算了,不用在意。
宿彦:我要回去工作了,回头见。
(宿彦离开)
(游戏结束)
费斌路线
宿彦:哼。
费斌:我们去植物室吃午餐吧。
(切换背景到bg2)
费斌:刚煮好的饺子的香味真是怡人。你想要吃什么馅的饺子?
选项 韭菜鸡蛋(费斌好感+1) 白菜猪肉(费斌好感不变)
韭菜鸡蛋
费斌:我很高兴你不讨厌韭菜的味道,以后可以常常邀你一起吃饭了。
(合流)
白菜猪肉
费斌:好的,稍等一下就煮好了。
(合流)
合流
费斌:你是要蘸醋还是蘸酱油?
选项 蘸醋(费斌好感度-1) 不要蘸料(费斌好感度+1)
蘸醋
费斌:你确定吗?这样会把饺子原本的香味遮住的。算了,给你。
(合流)
不要蘸料
费斌:和我一样吗?真是难得。
(合流)
合流
独白:………………………………
费斌:吃完了吗?餐具给我,我去收拾一下。
选项 帮忙(费斌好感+1) 不帮忙(费斌好感+0)
帮忙
费斌:你要帮忙吗?那就帮我擦一下桌子吧。
(合流)
不帮忙
费斌:稍等一下,我很快就好。
(合流)
合流
独白:…………………………
费斌:可以休息一下了。
费斌:饺子真是好吃呢。
选项 饺子天下第一(费斌flag1) 我觉得一般吧(费斌路线失败)
饺子天下第一
费斌:哈哈哈哈,一点都没有错。
(显示CG2)
(合流)
我觉得一般吧
费斌:是我手艺不足吗?看来我还要继续精进才行。
(合流)
合流
费斌:晚上的晚餐也一起吃吧。
(检测好感度>=2且flag1的情况下进入费斌he,其他情况进入费斌ne)
he
费斌:晚餐之后,想要和你一起去海滩上散步。
费斌:海边的星空非常美丽…………就和你一样美丽。
(游戏结束)
ne
费斌:在让你真正明白到饺子的真髓之前,请都和我一起吃饭吧。
费斌:我会在厨艺上每日精进的。
(游戏结束)
从剧本可以看出来我们还有在对话框的姓名栏里显示主角姓名的需求,那么稍微改一下namefadein让它可以显示主角姓名
void namefadein(Dictionary<string, string> elm)
{
//如果在传入的姓名开头有&的话,就说明这是个变量名,我们把它从f里取出来
if(elm["name"].Substring(0,1)=="&")
{
elm["name"] = f[elm["name"].Substring(1)];
}
//记录对话框上的名字和当前说话的人
f["dialog_name"] = elm["name"];
//女主对话的时候就不填写pos,所以这里要if一下
if (elm.ContainsKey("pos"))
{
f["dialog_pos"] = elm["pos"];
//将设定的位置的立绘变亮,其他位置的立绘变暗
GameObject.Find("Canvas").transform.Find("rfgr").gameObject.GetComponent<RawImage>().color = new Color32(140, 140, 140, 255);
GameObject.Find("Canvas").transform.Find("rfgl").gameObject.GetComponent<RawImage>().color = new Color32(140, 140, 140, 255);
GameObject.Find("Canvas").transform.Find("rfgc").gameObject.GetComponent<RawImage>().color = new Color32(140, 140, 140, 255);
GameObject.Find("Canvas").transform.Find("rfg" + elm["pos"]).gameObject.GetComponent<RawImage>().color = new Color32(255, 255, 255, 255);
}
GameObject temp = GameObject.Find("Canvas").transform.Find("ui_dialog/nameimage").gameObject;
temp.SetActive(true);
Animator an = temp.GetComponent<Animator>();
an.SetInteger("a_num", 1);
temp.transform.Find("Text").gameObject.GetComponent<Text>().text = elm["name"];
StartCoroutine(waittime(0.4f));
}
另外等下脚本里需要有一个等待点击的指令waitclick,我们也来顺手写一下
void waitclick()
{
if (onauto)
{
startscript();
}
else
{
onwaitclick = true;
}
}
为了waitclick能正常使用,update那里也要稍微改一下,毕竟waitclick可能在对话框不出现的时候使用。
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;
if (GameObject.Find("ui_dialog"))
{
GameObject.Find("ui_dialog").transform.Find("drop").gameObject.SetActive(false);
}
startscript();
}
}
有些变量比如flag反正也只用一次,每增加一个都要在initf里设定初始值就太烦人了,我们稍微修改下addvar来让没用过的变量默认值都是0。当然初始化函数initf还是有用的,万一有些角色的初始好感度就是10呢……
void addvar(Dictionary<string,string>elm)
{
if(!f.ContainsKey(elm["tar"]))
{
f[elm["tar"]] = "0";
}
double temp = Convert.ToDouble(f[elm["tar"]]);
double add= Convert.ToDouble(elm["num"]);
temp = temp + add;
f[elm["tar"]] = temp.ToString();
startscript();
}
因为分为了宿彦路线和费斌路线,checkend也要增加一下要判断的情况是哪个的参数,以后其他需要数值判断来跳转的地方都可以写在这里
void checkend(Dictionary<string,string>elm)
{
if (elm["tar"] == "xyend")
{
double feel = Convert.ToDouble(f["xyfeel"]);
double flag = Convert.ToDouble(f["xyflag1"]);
//只有好感度有2以上且触发了flag1的情况下才会进入he,其他情况进入ne
if (feel >= 2 && flag == 1)
{
jumpscript1("*xyhe");
}
else
{
jumpscript1("*xyne");
}
}
else if (elm["tar"] == "fbend")
{
double feel = Convert.ToDouble(f["fbfeel"]);
double flag = Convert.ToDouble(f["fbflag1"]);
//只有好感度有2以上且触发了flag1的情况下才会进入he,其他情况进入ne
if (feel >= 2 && flag == 1)
{
jumpscript1("*fbhe");
}
else
{
jumpscript1("*fbne");
}
}
}
现在我们来把剧本脚本化
@bg1fadein storage=op1
@bgm storage=bgm1
@opbtfadein
@bgm storage=bgm2
@editnamefadein
@initf
@bg1fadein storage=bg1
@fg1fadein storage=fg1 pos=l n=0
@dialogfadein
@namefadein name=宿彦 pos=l
@voice storage=fg1voice1
今天天气不错,
@ch text=name
,你要吃包子吗?
@textfadein
@namefadeout
@textfadeout
@stopbgm
@fg1fadein storage=fg2 pos=r n=0
@namefadein name=费斌 pos=r
你能不能不要一直都是包子包子。
@textfadein
@namefadeout
@textfadeout
@changeface pos=l n=1
@namefadein name=宿彦 pos=l
@voice storage=fg1voice2
你这种人哪里懂得包子的好。
@textfadein
@namefadeout
@textfadeout
@namefadein name=费斌 pos=r
我本来也不想懂……
@textfadein
@textfadeout
@ch text=name
,你不用勉强自己配合这个笨蛋也没关系的。
@textfadein
@textfadeout
@changeface pos=r n=1
比起包子,当然还是饺子比较好吃。
@textfadein
@namefadeout
@textfadeout
@namefadein name=&name
说到笨蛋的程度你也没有差好嘛……
@textfadein
@namefadeout
@textfadeout
@changeface pos=l n=0
@namefadein name=宿彦 pos=l
不要被他迷惑了!来和我一起吃包子吧。
@textfadein
@namefadeout
@textfadeout
@changeface pos=r n=1
@namefadein name=费斌 pos=r
说什么胡话,
@ch text=name
当然是要和我一起吃饺子。
@textfadein
@selectfadein text1=吃包子 text2=吃饺子 target1=*xyevent target2=*fbevent
*xyevent
@textfadeout
@changeface pos=r n=0
@namefadein name=费斌 pos=r
………………真是不智。
@textfadein
@namefadeout
@textfadeout
@fg1fadeout pos=r
@changeface pos=l n=1
@namefadein name=宿彦 pos=l
哼,那个啰嗦的家伙终于走了。希望他也能稍微想明白这个世界是包子的世界的现实。
@textfadein
@namefadeout
@textfadeout
@fg1fadeout pos=l
@fg1fadein storage=fg1 pos=c n=1
@changeface pos=c n=0
@namefadein name=宿彦 pos=c
你想吃哪种包子?
@textfadein
@selectfadein text1=肉包子 text2=素包子 target1=*xyb1_1 target2=*xyb1_2
*xyb1_1
@addvar tar=xyfeel num=1
@textfadeout
就是要肉包子才能吃得饱嘛。
@textfadein
@textfadeout
@jumpscript target=*xyb1_3
*xyb1_2
@textfadeout
不吃肉的话一小会就又会饿起来了吧……还是吃肉包子吧。
@textfadein
@namefadeout
@textfadeout
那你还让我选什么选!
@textfadein
@textfadeout
@namefadein name=宿彦 pos=c
*xyb1_3
是要吃梅菜肉包还是白菜肉包呢?
@textfadein
@selectfadein text1=梅菜肉包 text2=白菜肉包 target1=*xyb2_1 target2=*xyb2_2
*xyb2_1
@textfadeout
我更喜欢白菜肉包,不过既然你喜欢这个,那么梅菜肉包就全部给你。
@jumpscript target=*xyb2_3
*xyb2_2
@addvar tar=xyfeel num=1
@textfadeout
和我一样呢,真是开心。
*xyb2_3
@textfadein
@namefadeout
@textfadeout
…………………………
@textfadein
@namefadeout
@textfadeout
@namefadein name=宿彦 pos=c
吃完了。你还没有吃完嘛?吃得好慢。
@textfadein
@selectfadein text1=分他一半 text2=继续慢慢吃 target1=*xyb3_1 target2=*xyb3_2
*xyb3_1
@addvar tar=xyfeel num=1
@textfadeout
哎?可以吗?我恰好也没太吃饱……
@jumpscript target=*xyb3_3
*xyb3_2
@textfadeout
不用着急,我会等着你的。吃饭慢一点对肠胃也很好。
*xyb3_3
@textfadein
@namefadeout
@textfadeout
…………………………
@textfadein
@namefadeout
@textfadeout
@namefadein name=宿彦 pos=c
啊吃饱了真开心。包子真的是天底下最好的食物。
@textfadein
@selectfadein text1=包子天下第一 text2=我觉得一般吧 target1=*xyb4_1 target2=*xyb4_2
*xyb4_1
@addvar tar=xyflag1 num=1
@textfadeout
你也这么觉得吗?我就知道你懂得的!
@textfadein
@namefadeout
@textfadeout
@dialogfadeout
@allfadeout
@bg1fadein storage=cg1
@waitclick
@bg1fadeout
@bg1fadein storage=bg1
@fg1fadein storage=fg1 pos=c n=0
@dialogfadein
@namefadein name=宿彦 pos=c
@jumpscript target=*xyb4_3
*xyb4_2
@textfadeout
真是可惜,你竟然不懂得包子的好呢。
@textfadein
@textfadeout
*xyb4_3
啊说起来,
@textfadein
@textfadeout
@checkend tar=xyend
*xyhe
今天晚上你有空吗?有些事情想要对你说。
@textfadein
@namefadeout
@textfadeout
@namefadein name=&name
现在直接说不行吗?
@textfadein
@namefadeout
@textfadeout
@namefadein name=宿彦 pos=c
…………我也得,稍微准备一下……啊总之就是这样,晚上见。
@textfadein
@namefadeout
@textfadeout
@fg1fadeout pos=c
@dialogfadeout
@bg1fadeout
@returntotitle1
*xyne
…………嗯,也没什么,算了,不用在意。
@textfadein
@textfadeout
我要回去工作了,回头见。
@textfadein
@namefadeout
@textfadeout
@fg1fadeout pos=c
@dialogfadeout
@bg1fadeout
@returntotitle1
*fbevent
@textfadeout
@namefadein name=宿彦 pos=l
哼。
@textfadein
@namefadeout
@textfadeout
@fg1fadeout pos=l
@changeface pos=r n=0
@namefadein name=费斌 pos=r
我们去植物室吃午餐吧。
@textfadein
@namefadeout
@textfadeout
@dialogfadeout
@allfadeout
@bg1fadein storage=bg2
@fg1fadein pos=c storage=fg2 n=0
@dialogfadein
@namefadein name=费斌 pos=c
刚煮好的饺子的香味真是怡人。你想要吃什么馅的饺子?
@textfadein
@selectfadein text1=韭菜鸡蛋 text2=白菜猪肉 target1=*fbb1_1 target2=*fbb1_2
*fbb1_1
@addvar tar=fbfeel num=1
@textfadeout
我很高兴你不讨厌韭菜的味道,以后可以常常邀你一起吃饭了。
@jumpscript target=*fbb1_3
*fbb1_2
@textfadeout
好的,稍等一下就煮好了。
*fbb1_3
@textfadein
@textfadeout
你是要蘸醋还是蘸酱油?
@textfadein
@selectfadein text1=蘸醋 text2=不要蘸料 target1=*fbb2_1 target2=*fbb2_2
*fbb2_1
@addvar tar=fbfeel num=-1
@textfadeout
你确定吗?这样会把饺子原本的香味遮住的。算了,给你。
@jumpscript target=*fbb2_3
*fbb2_2
@addvar tar=fbfeel num=1
@textfadeout
和我一样吗?真是难得。
*fbb2_3
@textfadein
@namefadeout
@textfadeout
………………………………
@textfadein
@textfadeout
@namefadein name=费斌 pos=c
吃完了吗?餐具给我,我去收拾一下。
@textfadein
@selectfadein text1=帮忙 text2=不帮忙 target1=*fbb3_1 target2=*fbb3_2
*fbb3_1
@addvar tar=fbfeel num=1
@textfadeout
你要帮忙吗?那就帮我擦一下桌子吧。
@jumpscript target=*fbb3_3
*fbb3_2
@textfadeout
稍等一下,我很快就好。
*fbb3_3
@textfadein
@namefadeout
@textfadeout
………………………………
@textfadein
@textfadeout
@namefadein name=费斌 pos=c
可以休息一下了。
@textfadein
@textfadeout
饺子真是好吃呢。
@textfadein
@selectfadein text1=饺子天下第一 text2=我觉得一般吧 target1=*fbb4_1 target2=*fbb4_2
*fbb4_1
@addvar tar=fbflag1 num=1
@textfadeout
哈哈哈哈,一点都没有错。
@textfadein
@namefadeout
@textfadeout
@dialogfadeout
@allfadeout
@bg1fadein storage=cg2
@waitclick
@bg1fadeout
@bg1fadein storage=bg2
@fg1fadein storage=fg2 pos=c n=0
@dialogfadein
@namefadein name=费斌 pos=c
@jumpscript target=*fbb4_3
*fbb4_2
@textfadeout
是我手艺不足吗?看来我还要继续精进才行。
@textfadein
@textfadeout
*fbb4_3
晚上的晚餐也一起吃吧。
@textfadein
@textfadeout
@checkend tar=fbend
*fbhe
晚餐之后,想要和你一起去海滩上散步。
@textfadein
@textfadeout
海边的星空非常美丽…………就和你一样美丽。
@textfadein
@namefadeout
@textfadeout
@fg1fadeout pos=c
@dialogfadeout
@bg1fadeout
@returntotitle1
*fbne
在让你真正明白到饺子的真髓之前,请都和我一起吃饭吧。
@textfadein
@textfadeout
我会在厨艺上每日精进的。
@textfadein
@namefadeout
@textfadeout
@fg1fadeout pos=c
@dialogfadeout
@bg1fadeout
@returntotitle1
真是好长的脚本,因为为了讲解的更清楚,所以脚本指令也做得很细,如果是你自己做的话,很多指令可以合并成一个function,比如textfadeout和namefadeout,反正都要一起淡出嘛,还有changefade和namefadein也可以合并在一起,当然我们教程里一个角色就两个表情……也无所谓了…………有些名字太长的function也可以改得短一点,反正自己能看得懂就行。
我们虽然插入了CG,但是没有做显示过的CG的记录。当然你可以用addvar来做,不过每次都要额外写一行addvar也很烦,所以我们修改一下bg1fadein,让它发现传入的参数是cg的时候自动写入变量
public void bg1fadein(Dictionary<string, string> elm)
{
//记录当前显示的背景的文件名
f["bg"] = elm["storage"];
//如果是cg就写入变量
if (elm["storage"].Substring(0, 2) == "cg")
{
sf[elm["storage"]] = "1";
}
GameObject temp = GameObject.Find("bg1");
temp.GetComponent<SpriteRenderer>().sprite= (Sprite)Resources.Load("bg/"+elm["storage"], typeof(Sprite));
Animator an = temp.GetComponent<Animator>();
an.SetInteger("a_num", 1);
StartCoroutine(waittime(0.8f));
}
另外我们需要记录一下达成过几次结局,以便于作为二周目的判断。达成几次结局这种事情我们当然是要记录在sf里边而不是f里边的,所以我们再做一个用于修改sf变量的addsfvar,他和addvar长得除了把所有f的地方换为sf外没有不一样……
void addsfvar(Dictionary<string, string> elm)
{
if (!sf.ContainsKey(elm["tar"]))
{
sf[elm["tar"]] = "0";
}
double temp = Convert.ToDouble(sf[elm["tar"]]);
double add = Convert.ToDouble(elm["num"]);
temp = temp + add;
sf[elm["tar"]] = temp.ToString();
startscript();
}
写好之后我们在脚本里所有结局的地方@returntotitle1之前加入一句@addsfvar tar=endget num=1,用来将sf[“endget”]这个变量增加1,以用来做二周目判断。
然后,为了测试的舒服我们在returntotitle1里边也加一行savesf();用于在返回开始界面前保存一下sf
作为二周目判断的示范,我们来做二周目的时候开始界面增加一个鉴赏模式的按钮opbt5.png
我们这次为五个按钮另外再录淡入动画opbta3和淡出动画opbta4,当然也别忘了原来的淡入动画中将新加入的按钮隐藏,以及别忘了新的淡出动画里opbta4的最后一帧要挂上activefalse的事件。
在animator里边编辑他们的过渡线,将所有指向opbta3的线的条件都是a_num=3,所有指向opbta4的线的条件都是a_num=4
我们将opbtfadein和opbtfadeout修改为根据一周目或者二周目播放不同的动画
void opbtfadein()
{
GameObject temp = GameObject.Find("Canvas").transform.Find("ui_opbts").gameObject;
temp.SetActive(true);
Animator an = temp.GetComponent<Animator>();
if(!sf.ContainsKey("endget"))
{
sf["endget"] = "0";
}
Double endget = Convert.ToDouble(sf["endget"]);
//这里放淡出动画的序号
int aninum = 2;
if (endget >= 1)
{
an.SetInteger("a_num", 3);
aninum = 4;
}
else
{
an.SetInteger("a_num", 1);
}
//给开始游戏按钮挂载事件
Button b1 = temp.transform.Find("bt1").gameObject.GetComponent<Button>();
b1.onClick.RemoveAllListeners();
b1.onClick.AddListener(delegate ()
{
//把开始界面按钮组淡出
opbtfadeout(aninum);
//把背景淡出,执行下一行
bg1fadeout();
});
//给结束游戏按钮挂载事件
b1 = temp.transform.Find("bt2").gameObject.GetComponent<Button>();
b1.onClick.RemoveAllListeners();
b1.onClick.AddListener(delegate ()
{
//结束游戏
quit();
});
}
void opbtfadeout(int aninum)
{
GameObject temp = GameObject.Find("ui_opbts");
Animator an = temp.GetComponent<Animator>();
an.SetInteger("a_num", aninum);
}
现在运行一下游戏,试着达成一个结局,看一看开始界面的改变吧。
现在我们可以来拉CG一览界面了,额外需要的图片是cgimage.png arrow.png
因为都是纯色所以还蛮单调的,不过功能都在。
之前拉了那么多界面,大家应该很快就能把这个拉好了。左边那个三角按钮把z轴转180度就可以了。
录制它的淡入淡出动画,写它的淡入淡出fuction 叫做cglistfadein和cglistfadeout。将cglistfadein挂在鉴赏模式按钮上,将cglistfadeout挂在这个界面的返回按钮上
点击了CG按钮之后,我们预期会整张CG图淡入显示在屏幕上,点击它的话就淡出。所以我们用一个撑满屏幕的button来做这件事。
为它也录制淡入淡出动画,将它平时的状态放置到不激活。为它写它的淡入淡出function,叫做cgfadein和cgfadeout,将cgfadeout挂在它自己上
最后我们的cg一览界面的结构是这样
然后我们来例行的修改cglistfadein来动态的生成上边的内容。最后CGlistfadein CGlistfadeout CGfadein CGfadeout就是这样
public void CGlistfadein()
{
GameObject temp = GameObject.Find("Canvas").transform.Find("ui_CGlist").gameObject;
temp.SetActive(true);
Animator an = temp.GetComponent<Animator>();
an.SetInteger("a_num", 1);
//我们假设全部CG有22张,这里计算一下cg获得率
int max = 22;
//计算一下当前获得了多少张CG
int cgnum = 0;
for (int i = 1; i <= max; i++)
{
if (sf.ContainsKey("cg" + i) && sf["cg" + i] == "1")
{
cgnum++;
}
}
//算一下获得的CG和总数的百分比,显示在界面上
int cgper = cgnum * 100 / max;
temp.transform.Find("Text1").gameObject.GetComponent<Text>().text = "收集率 " + cgper + "%";
//显示第一页的CG
int page = 0;
CGlist(page);
}
//显示指定页的CG按钮
void CGlist(int page)
{
int max = 22;
GameObject temp = GameObject.Find("Canvas").transform.Find("ui_CGlist").gameObject;
//在界面上显示CG页数
temp.transform.Find("Text2").gameObject.GetComponent<Text>().text = (page + 1) + "/3";
//设定向前翻页按钮
GameObject tempbt = temp.transform.Find("prebt").gameObject;
if(page==0)
{
tempbt.SetActive(false);
}
else
{
tempbt.SetActive(true);
Button b1 = tempbt.GetComponent<Button>();
b1.onClick.RemoveAllListeners();
b1.onClick.AddListener(delegate ()
{
page--;
CGlist(page);
});
}
//设定向后翻页按钮
tempbt = temp.transform.Find("nextbt").gameObject;
if (page == 2)
{
tempbt.SetActive(false);
}
else
{
tempbt.SetActive(true);
Button b1 = tempbt.GetComponent<Button>();
b1.onClick.RemoveAllListeners();
b1.onClick.AddListener(delegate ()
{
page++;
CGlist(page);
});
}
GameObject temp1 = temp.transform.Find("content").gameObject;
for (int n = 0; n < temp1.transform.childCount; n++)
{
Destroy(temp1.transform.GetChild(n).gameObject);
}
//循环这一页的cg按钮
for(int i=0;i<8;i++)
{
//cg序号
int num = page * 8 + i + 1;
//如果序号大于CG总数就不再继续加按钮了
if(num>max)
{
break;
}
//载入cg按钮
GameObject temp2 = (GameObject)Instantiate(Resources.Load("cgbt", typeof(GameObject)));
temp2.name = "cgbt" + num;
temp2.transform.SetParent(temp1.transform);
temp2.transform.localScale = new Vector3(1, 1, 1);
Button b1 = temp2.GetComponent<Button>();
//如果cg已开启就将按钮上的图换成cg图,否则就将按钮设为不可点击
if(sf.ContainsKey("cg"+num) && sf["cg"+num]=="1")
{
//我这里为了省事,直接载入了整张cg图作为按钮,因为cg一般都蛮大的,全部载入对内存会有不少压力,建议大家自己做的时候再额外裁一个CG的小图用于这里
temp2.transform.Find("Image").gameObject.GetComponent<Image>().sprite = (Sprite)Resources.Load("bg/cg" + num, typeof(Sprite));
b1.interactable = true;
b1.onClick.RemoveAllListeners();
b1.onClick.AddListener(delegate ()
{
CGfadein(num);
});
}
else
{
b1.interactable = false;
}
}
}
public void CGlistfadeout()
{
GameObject temp = GameObject.Find("Canvas").transform.Find("ui_CGlist").gameObject;
Animator an = temp.GetComponent<Animator>();
an.SetInteger("a_num", 2);
}
public void CGfadein(int num)
{
GameObject temp = GameObject.Find("ui_CGlist").transform.Find("CGimage").gameObject;
temp.SetActive(true);
//将要求的CG图片载入到界面
temp.GetComponent<Image>().sprite= (Sprite)Resources.Load("bg/cg" + num, typeof(Sprite));
Animator an = temp.GetComponent<Animator>();
an.SetInteger("a_num", 1);
}
public void CGfadeout()
{
GameObject temp = GameObject.Find("ui_CGlist").transform.Find("CGimage").gameObject;
Animator an = temp.GetComponent<Animator>();
an.SetInteger("a_num", 2);
}
这样就好了。
一路这样做过来,大家应该对于如果制作一个新的功能界面非常熟练了,就只是拉出来界面,写淡入淡出,把淡入淡出挂到合适的按钮上这样一个流程而已,以后不管是想要向游戏里增加什么新的功能,踩大地图也好,手机发短信界面也好……就都是这个流程。
到目前为止,我们游戏的功能已经都做好了。接下来我们来打包就可以了。
Created by Hydrozoa.2011
不支持IE7以下浏览器
凯恩插件程序:Hydrozoa 美术:Hydrozoa,红渊