單例模式(下)
大家好,我是北京菜鳥(niǎo)在線的unity3d 范老師,今天又到了和大家分享知識(shí)的時(shí)間了。我們這次接著上次的來(lái)講:
2 :以下是單例模式的另一個(gè)小例子:
2-1 :創(chuàng)建一個(gè)新的場(chǎng)景,創(chuàng)建一個(gè)新的人類,我們都有名字,我們有共同的地球。并給1,2,3,三個(gè)人腳本上的mName賦值上字符串名字。具體如下圖
2-2 人類腳本詳細(xì)如下:
using UnityEngine;
using System.Collections;
//創(chuàng)建一個(gè)人類腳本
public class Human : MonoBehaviour {
public string mName0;
// 共享的地球,有且只有一個(gè)實(shí)例
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)建一個(gè)地球腳本
public class Earth : MonoBehaviour {
public string mName = "地球";
}
2-4 掛在像機(jī)上的腳本
using UnityEngine;
using System.Collections;
// 如果我想知道,1的人物叫什么名字
public class test01 : MonoBehaviour {
//把Hierarchy下的,游戲?qū)ο蠼?的,那個(gè)拖拽到這里就好。
public Human mHuman;
// Use this for initialization
void Start () { // 打印這個(gè)游戲?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)的變量都定義到一個(gè)不繼承MoboBehavious的類里,把如下代碼:(在這里,下面的那些代碼,不用掛在物體上)
using UnityEngine;
using System.Collections;
//定義一個(gè)類,里面寫(xiě)上靜態(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; // 測(cè)試模式
}
3-2 ,我們?cè)诹硪粋€(gè)腳本里,可以隨意的調(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:另一個(gè)種調(diào)用:
using UnityEngine;
using System.Collections;
public class GameCOntrol : MonoBehaviour {
void Awake()
{
if (GameDate .mModern == 0)
{
print( "測(cè)試模式" );
}
else if (GameDate.mModern == 1){
print( "開(kāi)發(fā)模式" );
}
}
}
今天我們就來(lái)看看在unity中如何使用單例模式,在unity中,我們分兩種單例,一種是繼承monobehavior的單例,一種是普通單例。
1.MonoBehavior單例
其實(shí)在unity中,如果腳本是繼承monobehavior,那么使用起單例來(lái)更加簡(jiǎn)單。
只需要在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)建一個(gè)新的場(chǎng)景,并在工廠里創(chuàng)建三個(gè)Cube,做為三個(gè)工廠的載體,并為三個(gè)Cube掛上三個(gè)不的腳本。再創(chuàng)建一個(gè)boss,并添加腳本,從這個(gè)boss
類中調(diào)用工廠的三個(gè)腳本里的方法。為了更的好的調(diào)用,我們使用新創(chuàng)建一個(gè)工廠類,并使三個(gè)工廠的腳本都繼承這個(gè)工廠類。
2-2 :運(yùn)行腳本,可以看到上述的情況,控制臺(tái)中輸出的都是父類里的方法。這四個(gè)腳本的代碼如下:
2-2-1: 父類的腳本。
using UnityEngine;
using System.Collections;
//三個(gè)工廠的父類,基類
public class Factory : MonoBehaviour {
//父類有一個(gè)虛方法
public virtual void Create()
{
print( "我開(kāi)始生產(chǎn)了........" );
}
}
2-2-2 :三個(gè)工廠的腳本代碼如下:
using UnityEngine;
using System.Collections;
// 一個(gè)可口可樂(lè)生產(chǎn)子類腳本
public class CoCoFactory : Factory {
public void Create()
{
print( "生產(chǎn)一罐可口可樂(lè)!!" );
}
}
2-2-3 : 三個(gè)工廠的腳本代碼如下:
using UnityEngine;
using System.Collections;
//一個(gè)生產(chǎn)芬達(dá)的工廠代碼如下:
public class FendaFactory : Factory {
public void Create()
{
print( "生產(chǎn)一罐芬噠!!" );
}
}
2-2-4 : 三個(gè)工廠的腳本代碼如下:
using UnityEngine;
using System.Collections;
// 一個(gè)生產(chǎn)可樂(lè)的工廠腳本
public class ColaFactory : Factory
{
public void Create()
{
print( "生產(chǎn)一罐可樂(lè)!!" );
}
}
2-2-5 :總boss類,調(diào)用這三個(gè)工廠里的Create( ) 的方法:
using UnityEngine;
using System.Collections;
//在boss總管理的類里調(diào)用三個(gè)工廠里的方法。
public class FactoryManager : MonoBehaviour {
//下面寫(xiě)三種,然后,把三個(gè)工廠模式拉進(jìn)去就好,但是有些麻煩
// public ColaFactory mColaFactory;
// public CoCoFactory mCoCoFactory;
// public FendaFactory mFendaFactory;
//所以,聲名一個(gè)父類,把三個(gè)工廠,都繼承這個(gè)父類。我們用數(shù)組來(lái)實(shí)現(xiàn),如下
public Factory [] mFactory;
void Start()
{
AllCreate();
}
void AllCreate()
{
for (int i = 0; i < mFactory.Length; i++)
{ //遍歷后調(diào)用每個(gè)工廠里的方法
mFactory[i].Create();
}
}
}