單例模式(上)和 工廠模式

單例模式(上)和 工廠模式

大家好鳞仙,我是北京菜鳥在線的范老師,主講 unity3d 笔时。講師棍好。今天給大家講的是單例模式和工廠模式

一:新創(chuàng)建一個(gè)場(chǎng)景,創(chuàng)建一個(gè)國王Cube, N個(gè)Sphere士兵允耿。并給國王賦給標(biāo)簽 tag== King.

1-1 這個(gè)國王Cube上掛的代碼如下:

using UnityEngine;

using System.Collections;

//國王腳本
public class King : MonoBehaviour {

// 國王名字
public string mName;
// 國王的血量
public int mHP = 100;
             // Use this for initialization
             void Start () {

            }

             // Update is called once per frame
             void Update () {
    if (Input .GetKeyDown(KeyCode.A))
    {   //如果每次按下按鍵A借笙,國王的血量就減去10
        mHP -= 10;
        print(mHP);
        if (mHP < 50)
        {
            Application.LoadLevel("DanLiMOshi001" );
        }
    }
            }

}

1-2 :上面是掛到國王的上的腳本,那么掛在士兵上的腳本如下:

using UnityEngine;

using System.Collections;

// 士兵的腳本

public class Soldier : MonoBehaviour {

//士兵的名字
public string mName;
public King mKingName; //國王名字
             //查找國王有幾種方法:第一種较锡,public 公開业稼,然后拖上去,效率最高
             void Start () {
    // 第二種查找國王的方法;Find,這適合于只有一個(gè)的名字蚂蕴,字符串匹配低散,效率最底
  //  mKingName = GameObject.Find("Cube").GetComponent<King>();
    //第三種:通過標(biāo)簽查找,第一個(gè)字符串King是添加的標(biāo)簽俯邓。第二個(gè)king 是這類標(biāo)簽上的一個(gè)腳本king
    mKingName = GameObject.FindGameObjectWithTag("King" ).GetComponent<King>();
    CompeteMission();
            }
private void CompeteMission()
{ //每個(gè)士兵都可以完成任務(wù)
    print(mKingName.name + "我" + mName + "完成任務(wù)了!" );
}

}

1-3 : 新建一個(gè)場(chǎng)景熔号,當(dāng)國王的血量少于50的時(shí)候稽鞭,可以跳轉(zhuǎn)場(chǎng)景。具體代碼如上面引镊。跳轉(zhuǎn)另一個(gè)場(chǎng)景之后朦蕴,隔5.0秒之后,自動(dòng)再跳轉(zhuǎn)過來這個(gè)場(chǎng)景弟头。

另一個(gè)場(chǎng)景像機(jī)上掛的代碼如下:

using UnityEngine;

using System.Collections;

// 跳轉(zhuǎn)場(chǎng)景后吩抓,5.0秒后,自動(dòng)跳轉(zhuǎn)到另一個(gè)場(chǎng)景赴恨。

public class test : MonoBehaviour {

             // Use this for initialization
             void Start () {
    Invoke( "Return",5.0f);
            }
void Return()
{
    Application.LoadLevel("DanLiMOshi" );
}

}
需要注意的是:

Invoke() 方法是 Unity3D 的一種委托機(jī)制

如: Invoke("SendMsg", 5); 它的意思是:5 秒之后調(diào)用 SendMsg() 方法琴拧;
使用

Invoke() 方法需要注意 3點(diǎn):

1 :它應(yīng)該在 腳本的生命周期里的(Start、Update嘱支、OnGUI蚓胸、FixedUpdate、LateUpdate)中被調(diào)用除师;

2:Invoke(); 不能接受含有 參數(shù)的方法沛膳;

3:在 Time.ScaleTime = 0; 時(shí), Invoke() 無效汛聚,因?yàn)樗粫?huì)被調(diào)用到
Invoke() 也支持重復(fù)調(diào)用:InvokeRepeating("SendMsg", 2 , 3);
這個(gè)方法的意思是指:2 秒后調(diào)用 SendMsg() 方法锹安,并且之后每隔 3 秒調(diào)用一次 SendMsg () 方法

1-4 :當(dāng)場(chǎng)景跳轉(zhuǎn)過來以后,我們發(fā)現(xiàn)倚舀,上次是當(dāng)國王的血量少于等于50的時(shí)候叹哭,才時(shí)行的跳轉(zhuǎn),可是痕貌,跳轉(zhuǎn)過來后风罩,發(fā)現(xiàn),國王的血量舵稠,又是滿血了超升。那么,如果哺徊,我們想保持原來國王的血量室琢,我們要怎么做呢,當(dāng)我們?cè)趪醯拇a里添加上:

void Awake()
{  // 加載時(shí)不銷毀
    DontDestroyOnLoad( this.gameObject);
}

我們發(fā)現(xiàn)落追,跳轉(zhuǎn)場(chǎng)景后盈滴,生成了兩個(gè)國王,一個(gè)是100的血量轿钠,一個(gè)是保持了原來小于50的血量巢钓。但是病苗,如果來回的切換場(chǎng)景,那么一次多生成一個(gè)竿报,玩的次數(shù)越多铅乡,場(chǎng)景中的國王就會(huì)越多。
那么烈菌,問題又來了阵幸,我們希望保持原來的數(shù)據(jù),又不希望生成 新的國王的數(shù)據(jù)芽世,怎么辦呢
我們可以考慮在第一個(gè)場(chǎng)景中挚赊,開始的時(shí)候,在國王的身上济瓢,我們不給它掛腳本荠割,只是在像機(jī)上掛 個(gè)腳本,讓國王跳轉(zhuǎn)場(chǎng)景的時(shí)候旺矾,實(shí)例化出來蔑鹦。預(yù)制體如下圖

像機(jī)上掛腳本,把做好的國王的預(yù)制體拉到像機(jī)上的腳本上箕宙。士兵的上的腳本就可以不要了嚎朽。如下圖,

1-5 運(yùn)行程序后柬帕,發(fā)現(xiàn)哟忍。在我們的第一個(gè)場(chǎng)景中,一直有實(shí)例化的國王陷寝,那么锅很,我們就要進(jìn)行判斷。發(fā)現(xiàn)都正常了凤跑,一直都是一個(gè)了爆安。如下圖:

代碼如下:

using UnityEngine;

using System.Collections;

// 一開始,實(shí)例化出來一個(gè)國王

public class CreatePlayer : MonoBehaviour {

public King mKing;

// 因?yàn)殪o態(tài)變量在該類里面有且只有一個(gè)實(shí)例饶火,所以鹏控,我們可以用它來長期儲(chǔ)存該實(shí)例,那么這個(gè)變量的生命周期可以持續(xù)到游戲開始到結(jié)束肤寝。

//我們也可以把把它聲明成public ,方便其它類的對(duì)象的調(diào)用。

public static King sKing = null;
// 單例模式抖僵,只會(huì)在程序結(jié)束的時(shí)候鲤看,才會(huì)銷毀。這個(gè)靜態(tài)的可以寫在任何的腳本里耍群。寫在哪里都可以义桂。

             // Use this for initialization
             void Start () {
    if (sKing == null )
    {
       sKing =  ( King)Instantiate(mKing);
    }
            }

             // Update is called once per frame
             void Update () {

            }

}

<待續(xù)>

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末找筝,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子慷吊,更是在濱河造成了極大的恐慌袖裕,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,482評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件溉瓶,死亡現(xiàn)場(chǎng)離奇詭異急鳄,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)堰酿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門疾宏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人触创,你說我怎么就攤上這事坎藐。” “怎么了哼绑?”我有些...
    開封第一講書人閱讀 152,762評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵岩馍,是天一觀的道長。 經(jīng)常有香客問我抖韩,道長蛀恩,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,273評(píng)論 1 279
  • 正文 為了忘掉前任帽蝶,我火速辦了婚禮赦肋,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘励稳。我一直安慰自己佃乘,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,289評(píng)論 5 373
  • 文/花漫 我一把揭開白布驹尼。 她就那樣靜靜地躺著趣避,像睡著了一般。 火紅的嫁衣襯著肌膚如雪新翎。 梳的紋絲不亂的頭發(fā)上程帕,一...
    開封第一講書人閱讀 49,046評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音地啰,去河邊找鬼愁拭。 笑死,一個(gè)胖子當(dāng)著我的面吹牛亏吝,可吹牛的內(nèi)容都是我干的岭埠。 我是一名探鬼主播,決...
    沈念sama閱讀 38,351評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼惜论!你這毒婦竟也來了许赃?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,988評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤馆类,失蹤者是張志新(化名)和其女友劉穎混聊,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體乾巧,經(jīng)...
    沈念sama閱讀 43,476評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡句喜,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,948評(píng)論 2 324
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了卧抗。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片藤滥。...
    茶點(diǎn)故事閱讀 38,064評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖社裆,靈堂內(nèi)的尸體忽然破棺而出拙绊,到底是詐尸還是另有隱情,我是刑警寧澤泳秀,帶...
    沈念sama閱讀 33,712評(píng)論 4 323
  • 正文 年R本政府宣布标沪,位于F島的核電站,受9級(jí)特大地震影響嗜傅,放射性物質(zhì)發(fā)生泄漏金句。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,261評(píng)論 3 307
  • 文/蒙蒙 一吕嘀、第九天 我趴在偏房一處隱蔽的房頂上張望违寞。 院中可真熱鬧,春花似錦偶房、人聲如沸趁曼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽挡闰。三九已至,卻和暖如春掰盘,著一層夾襖步出監(jiān)牢的瞬間摄悯,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評(píng)論 1 262
  • 我被黑心中介騙來泰國打工愧捕, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留奢驯,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,511評(píng)論 2 354
  • 正文 我出身青樓次绘,卻偏偏與公主長得像叨橱,于是被迫代替她去往敵國和親典蜕。 傳聞我的和親對(duì)象是個(gè)殘疾皇子断盛,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,802評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容