筆記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;
}
}
}