美文网首页
单例模式(上)和 工厂模式

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

作者: 土豆_9724 | 来源:发表于2017-08-21 09:31 被阅读0次

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

大家好,我是北京菜鸟在线的范老师,主讲 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 () {

            }

}

<待续>

相关文章

网友评论

      本文标题:单例模式(上)和 工厂模式

      本文链接:https://www.haomeiwen.com/subject/ujqcdxtx.html