单例模式(上)和 工厂模式
大家好,我是北京菜鸟在线的范老师,主讲 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 () {
}
}
<待续>