课程20 NGUI
Label文字
Texture纹理。Container容器、Panel全屏的“容器”、2D Sprite存放精灵图片
Spriter存放图集
制作按钮
Scroll View滑动视图
制作单选
Tween动画
制作物品栏
public class Item : UIDragDropItem{
//把MonoBehaviour改成UIDragDropItem(拖拽项)继承来的
/*
//开始拖拽时调用(在NGUI里通常不用写)
protected override void OnDragDropStart()
{
base.OnDragDropStart();
Debug.Log("开始拖拽");
}
*/
//结束拖拽是调用
//在unity里,所有的格子同一标签
//新格子会当做参数GameObject surface传过来,就是告诉你拖到谁身上了。
protected override void OnDragDropRelease(GameObject surface)
{
base.OnDragDropRelease(surface);
//Debug.Log("结束拖拽");
//做判断,如果拖到格子身上
if(surface.tag == "Grid")
{
//放置。换父物体
transform.SetParent(surface.transform);
}
//在unity里,所有的物品同一标签
//如果拖拽到有物品是格子身上
if (surface.tag == "Item")
{
//交换物品
//先得到将要放置的格子。此处surface指的就是药瓶
Transform newGrid = surface.transform.parent;
//然后将药瓶的父物体改成“我们”的父物体。
surface.transform.SetParent(transform.parent);
//保证其位置在正中心
surface.transform.localPosition = Vector3.zero;
//“我们”的父物体改成药品原本的格子
transform.SetParent(newGrid);
}
//把拖拽的物体的位置改为000(不要偏移)
transform.localPosition = Vector3.zero;
}
}
对话项目:裸熊
using System;
//枚举。Command的类型
public enum CommandType
{
Say,
Bg,
Bgm
}
//写一个命令类
public class Command
{
//这个命令有三种:说话、背景、背景音乐
//通过添加的枚举限制选择的Command的类型
public CommandType type;
//每个Command都有一个type,我们判断type是Say,Bg,Bgm中的哪一个
}
//写三个命令类继承于上面的大命令。由于是继承,所以下面命令的属性个数要加上父类里的属性。
//父类的类型,可以指向子类的对象。
//说话
public class Say : Command
{
//想想如果是说话,会有什么发生改变?
//需要更改:说话的人物图片、名字、说话内容
public string head;
public string name;
public string content;
}
//背景
public class Bg:Command
{
//背景就改个图片即可
public string bg;
}
//背景音乐
public class Bgm :Command
{
//改个音乐
public string bgm;
}
//序列化的标签。
[Serializable]
//他将下面的命令Cmd进行序列化,使得Cmd可以在unity里面显示。
//在unity里面可以直接编辑有几条命令,比如,可将对话写在里面,不需要写到代码里。
//这些命令,会保存在“我们编辑的命令”里。最后,对这个数组进行进一步的加工。
//通过创建结构体,来创建命令。写成class也一样。但对外开放,有参数的一般写成结构体struct。
public struct Cmd
{
//给这个结构体4个字符串。
public string str1; //保存类型 say,bg,bgm
public string str2; //参数1
public string str3; //参数2
public string str4; //参数3
//因为say里面是三个,所以会用到参数1、2、3,而bg里面只有一个,所以只用到参数1。
//创建结构体,利用代码把结构体转换成对应的对象放到数组Command[]里。
//我们把命令Cmd也写成一个数组(见下面)
}
public class GameControl : MonoBehaviour {
//2d大图,背景。
public UI2DSprite Bg;
//头像,用的精灵集合。
public UISprite Head;
//两个文字,一个显示姓名,一个现实对话内容
public UILabel Name;
public UILabel Content;
//声音播放器
public AudioSource player;
//写完上面5条代码,到Unity里进行关联。
//添加命令索引(通过命令索引,可以直到当前到了第几个命令了)。默认是0。
private int index = 0;
//我们编辑的命令(此处为命令Cmd的数组)。它在unity里显示不出来,需引入一个名称空间using System;,进而使用标签。
public Cmd[] cmds;
//保存我们的命令对象。利用继承的多态性,创建父类数组
public Command[] commands;
//此时,在unity里编辑好了命令 ,要保存命令对象了。
void Start () {
//在这里解析命令
//此时数组Command[] commands是空的,所以先创建,长度等于上面的数组。
commands = new Command[cmds.Length];
//for遍历命令,解析。
for (int i = 0; i < commands.Length;i++)
{
if(cmds[i].str1 == "say")
{
//创建个say对象
Say say = new Say();
say.type = CommandType.Say;
say.head = cmds[i].str2;
say.name = cmds[i].str3;
say.content = cmds[i].str4;
commands[i] = say;
}
if (cmds[i].str1 == "bgm")
{
Bgm bgm = new Bgm();
bgm.type = CommandType.Bgm;
bgm.bgm = cmds[i].str2;
commands[i] = bgm;
}
if (cmds[i].str1 == "bg")
{
Bg bg = new Bg();
bg.type = CommandType.Bg;
bg.bg = cmds[i].str2;
commands[i] = bg;
}
}
//写完for,数组里就会有完整的对象了。对象就这3种类型。现在就要去一条条加载。
//执行命令(先执行的一次)
Next();
}
void Update () {
//如果按了一次鼠标,就执行命令
if(Input.GetMouseButtonDown(0))
{
//执行命令(点下鼠标,执行一次)
Next();
}
}
//执行命令单独写一个方法Next()。它会在首先自己执行一次;之后点下鼠标,执行一次。
void Next()
{
//如果命令索引越界了
if(index >= commands.Length)
{
//什么事也就不做了。或者添加个游戏结束的动画
return;
}
//解析一条命令。通过switch。不过要先拿出一条,让索引自增。
Command cmd = commands[index++];
switch (cmd.type)
{
case CommandType.Say:
//如果这个命令是
Say say = (Say)cmd;
//图片的名称(注意要在图集里)
Head.spriteName = say.head;
//说话人的名字
Name.text = say.name;
//说话的内容
Content.text = say.content;
break;
case CommandType.Bg:
Bg bg = (Bg)cmd;
//图片不是在图集里,所以需要自己加载
Bg.sprite2D = Resources.Load<Sprite>(bg.bg);
//为了同时执行
Next();
break;
case CommandType.Bgm:
Bgm bgm = (Bgm)cmd;
//加载声音片段
player.clip = Resources.Load<AudioClip>(bgm.bgm);
//播放
player.Play();
//为了同时执行
Next();
break;
}
}
}
来源:https://blog.csdn.net/weixin_45131451/article/details/97373729