單例模式(下)
大家好,我是北京菜鳥在線的unity3d 范老師,今天又到了和大家分享知識的時間了。我們這次接著上次的來講:
2 :以下是單例模式的另一個小例子:
2-1 :創(chuàng)建一個新的場景,創(chuàng)建一個新的人類,我們都有名字,我們有共同的地球。并給1,2,3,三個人腳本上的mName賦值上字符串名字。具體如下圖

2-2 人類腳本詳細如下:
using UnityEngine;
using System.Collections;
//創(chuàng)建一個人類腳本
public class Human : MonoBehaviour {
public string mName0;
// 共享的地球,有且只有一個實例
public static Earth mEarth;
// Use this for initialization
void Awake () {
mEarth = GameObject.Find("Earth" ).GetComponent<Earth>();
}
// Update is called once per frame
void Update () {
}
}
2-3 地球腳本
using UnityEngine;
using System.Collections;
//創(chuàng)建一個地球腳本
public class Earth : MonoBehaviour {
public string mName = "地球";
}
2-4 掛在像機上的腳本
using UnityEngine;
using System.Collections;
// 如果我想知道,1的人物叫什么名字
public class test01 : MonoBehaviour {
//把Hierarchy下的,游戲?qū)ο蠼?的,那個拖拽到這里就好。
public Human mHuman;
// Use this for initialization
void Start () { // 打印這個游戲?qū)ο蠼?的名字
// print(mHuman.name); //liuYiFei
print(mHuman.mName0); // liuyifei
// print(Human.mEarth.mName); //地球
// print(Human.mEarth.name); //Earth
}
// Update is called once per frame
void Update () {
}
}
3:不繼承MonoBehavious類
3-1,我們把所有的靜態(tài)的變量都定義到一個不繼承MoboBehavious的類里,把如下代碼:(在這里,下面的那些代碼,不用掛在物體上)
using UnityEngine;
using System.Collections;
//定義一個類,里面寫上靜態(tài)的變量
public class GameDate
{
public static bool mIsFullScreen = false; //是否全屏
public static int mWight = 1280; //屏幕的寬
public static int mHeight =720 ; //屏幕的高
public static int mModern = 0; // 測試模式
}
3-2 ,我們在另一個腳本里,可以隨意的調(diào)用,如下代碼:
using UnityEngine;
using System.Collections;
public class GameCOntrol : MonoBehaviour {
void Awake()
{ // 屏幕分辨率設(shè)置
Screen.SetResolution(GameDate .mWight, GameDate.mWight, GameDate.mIsFullScreen);
}
}
public GameObject obj0;
void Start()
{
if( !obj0 )
{
print("xxxxxxx")
}
}
3-3:另一個種調(diào)用:
using UnityEngine;
using System.Collections;
public class GameCOntrol : MonoBehaviour {
void Awake()
{
if (GameDate .mModern == 0)
{
print( "測試模式" );
}
else if (GameDate.mModern == 1){
print( "開發(fā)模式" );
}
}
}
今天我們就來看看在unity中如何使用單例模式,在unity中,我們分兩種單例,一種是繼承monobehavior的單例,一種是普通單例。
1.MonoBehavior單例
其實在unity中,如果腳本是繼承monobehavior,那么使用起單例來更加簡單。
只需要在Awake()里面,添加一句instance = this;
using UnityEngine;
using System.Collections;
public class test2 : MonoBehaviour {
public static test2 instance;
// Use this for initialization
void Awake () {
instance = this;
}
// Update is called once per frame
void Update () {
}
}
2.普通類的單例
using UnityEngine;
using System.Collections;
public class test2 {
private static test2 instance;
public static test2 Instance
{
get
{
if (null == instance)
instance = new test2();
return instance;
}
set { }
}
}
二:工廠模式
2-1 : 創(chuàng)建一個新的場景,并在工廠里創(chuàng)建三個Cube,做為三個工廠的載體,并為三個Cube掛上三個不的腳本。再創(chuàng)建一個boss,并添加腳本,從這個boss
類中調(diào)用工廠的三個腳本里的方法。為了更的好的調(diào)用,我們使用新創(chuàng)建一個工廠類,并使三個工廠的腳本都繼承這個工廠類。

2-2 :運行腳本,可以看到上述的情況,控制臺中輸出的都是父類里的方法。這四個腳本的代碼如下:
2-2-1: 父類的腳本。
using UnityEngine;
using System.Collections;
//三個工廠的父類,基類
public class Factory : MonoBehaviour {
//父類有一個虛方法
public virtual void Create()
{
print( "我開始生產(chǎn)了........" );
}
}
2-2-2 :三個工廠的腳本代碼如下:
using UnityEngine;
using System.Collections;
// 一個可口可樂生產(chǎn)子類腳本
public class CoCoFactory : Factory {
public void Create()
{
print( "生產(chǎn)一罐可口可樂!!" );
}
}
2-2-3 : 三個工廠的腳本代碼如下:
using UnityEngine;
using System.Collections;
//一個生產(chǎn)芬達的工廠代碼如下:
public class FendaFactory : Factory {
public void Create()
{
print( "生產(chǎn)一罐芬噠?。? );
}
}
2-2-4 : 三個工廠的腳本代碼如下:
using UnityEngine;
using System.Collections;
// 一個生產(chǎn)可樂的工廠腳本
public class ColaFactory : Factory
{
public void Create()
{
print( "生產(chǎn)一罐可樂??!" );
}
}
2-2-5 :總boss類,調(diào)用這三個工廠里的Create( ) 的方法:
using UnityEngine;
using System.Collections;
//在boss總管理的類里調(diào)用三個工廠里的方法。
public class FactoryManager : MonoBehaviour {
//下面寫三種,然后,把三個工廠模式拉進去就好,但是有些麻煩
// public ColaFactory mColaFactory;
// public CoCoFactory mCoCoFactory;
// public FendaFactory mFendaFactory;
//所以,聲名一個父類,把三個工廠,都繼承這個父類。我們用數(shù)組來實現(xiàn),如下
public Factory [] mFactory;
void Start()
{
AllCreate();
}
void AllCreate()
{
for (int i = 0; i < mFactory.Length; i++)
{ //遍歷后調(diào)用每個工廠里的方法
mFactory[i].Create();
}
}
}
3:通過運行程序,我們發(fā)現(xiàn),運行的,只是第一個腳本,父類的腳本里的Create( )方法。這里需要我們在C#學(xué)到的 繼承里的虛方法 ,子類里override 重寫。
