筆記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;
        }
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章