课程20 NGUI

孤街醉人 提交于 2019-11-26 12:15:00

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;
        }
    }
}
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!