单例模式(上)和 工厂模式

单例模式(上)和 工厂模式

大家好,我是北京菜鸟在线的范老师,主讲 unity3d 。讲师。今天给大家讲的是单例模式和工厂模式

一:新创建一个场景,创建一个国王Cube, N个Sphere士兵。并给国王赋给标签 tag== King.

1-1 这个国王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,这适合于只有一个的名字,字符串匹配,效率最底
  //  mKingName = GameObject.Find("Cube").GetComponent<King>();
    //第三种:通过标签查找,第一个字符串King是添加的标签。第二个king 是这类标签上的一个脚本king
    mKingName = GameObject.FindGameObjectWithTag("King" ).GetComponent<King>();
    CompeteMission();
            }
private void CompeteMission()
{ //每个士兵都可以完成任务
    print(mKingName.name + "我" + mName + "完成任务了!" );
}

}

1-3 : 新建一个场景,当国王的血量少于50的时候,可以跳转场景。具体代码如上面。跳转另一个场景之后,隔5.0秒之后,自动再跳转过来这个场景。

另一个场景像机上挂的代码如下:

using UnityEngine;

using System.Collections;

// 跳转场景后,5.0秒后,自动跳转到另一个场景。

public class test : MonoBehaviour {

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

}
需要注意的是:

Invoke() 方法是 Unity3D 的一种委托机制

如: Invoke("SendMsg", 5); 它的意思是:5 秒之后调用 SendMsg() 方法;
使用

Invoke() 方法需要注意 3点:

1 :它应该在 脚本的生命周期里的(Start、Update、OnGUI、FixedUpdate、LateUpdate)中被调用;

2:Invoke(); 不能接受含有 参数的方法;

3:在 Time.ScaleTime = 0; 时, Invoke() 无效,因为它不会被调用到
Invoke() 也支持重复调用:InvokeRepeating("SendMsg", 2 , 3);
这个方法的意思是指:2 秒后调用 SendMsg() 方法,并且之后每隔 3 秒调用一次 SendMsg () 方法

1-4 :当场景跳转过来以后,我们发现,上次是当国王的血量少于等于50的时候,才时行的跳转,可是,跳转过来后,发现,国王的血量,又是满血了。那么,如果,我们想保持原来国王的血量,我们要怎么做呢,当我们在国王的代码里添加上:

void Awake()
{  // 加载时不销毁
    DontDestroyOnLoad( this.gameObject);
}

我们发现,跳转场景后,生成了两个国王,一个是100的血量,一个是保持了原来小于50的血量。但是,如果来回的切换场景,那么一次多生成一个,玩的次数越多,场景中的国王就会越多。
那么,问题又来了,我们希望保持原来的数据,又不希望生成 新的国王的数据,怎么办呢
我们可以考虑在第一个场景中,开始的时候,在国王的身上,我们不给它挂脚本,只是在像机上挂 个脚本,让国王跳转场景的时候,实例化出来。预制体如下图

像机上挂脚本,把做好的国王的预制体拉到像机上的脚本上。士兵的上的脚本就可以不要了。如下图,

1-5 运行程序后,发现。在我们的第一个场景中,一直有实例化的国王,那么,我们就要进行判断。发现都正常了,一直都是一个了。如下图:

代码如下:

using UnityEngine;

using System.Collections;

// 一开始,实例化出来一个国王

public class CreatePlayer : MonoBehaviour {

public King mKing;

// 因为静态变量在该类里面有且只有一个实例,所以,我们可以用它来长期储存该实例,那么这个变量的生命周期可以持续到游戏开始到结束。

//我们也可以把把它声明成public ,方便其它类的对象的调用。

public static King sKing = null;
// 单例模式,只会在程序结束的时候,才会销毁。这个静态的可以写在任何的脚本里。写在哪里都可以。

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

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

            }

}

<待续>

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容