学习笔记_Cocos Creator_继承组件单例

官方文档:https://docs.cocos.com/creator/manual/zh/scripting/reference/class.html

前言

单例,在游戏开发中是比较常用的功能,全局唯一,可以在任何地方直接获取, 
省去了方法赋值 或者 属性面板拖动的麻烦。
普通单例_饿汉模式

不管有没调用,一开始就创建单例

复制代码
 1 // Singleton.js 
 2 var Singleton = cc.Class({
 3 
 4     // 成员变量
 5     name : "",
 6     age : 0,
 7 
 8     ctor () {
 9         this.name = "Leovany";
10         this.age = 20;
11     },
12     statics: {
13         _instance: null
14     },
15 
16     printInfo(){
17         cc.warn("name = " + this.name+",age = " + this.age);
18     }
19 });
20 
21 Singleton._instance = new Singleton();
22 module.exports = Singleton;
复制代码

 

 1 // GameManager.js
 2 // 引入单例类
 3 var Singleton = require("Singleton");
 4 
 5 var GameManager = cc.Class({
 6         cc.warn(Singleton._instance.name);
 7         Singleton._instance.printInfo();
 8 });
普通单例_饱汉模式

调用时才创建单例对象

复制代码
 1 // Singleton.js 
 2 var Singleton = cc.Class({
 3     // 成员变量
 4     name : "",
 5     age : 0,
 6 
 7     ctor () {
 8         this.name = "Leovany";
 9         this.age = 20;
10     },
11 
12 
13     printInfo(){
14         cc.warn("name = " + this.name+",age = " + this.age);
15     }
16 });
17 
18 Singleton._instance = null;
19 Singleton.getInstance = function () {
20     if(!Singleton._instance){
21         Singleton._instance = new Singleton();
22     }
23     return Singleton._instance;
24 }
25 
26 module.exports = Singleton;
复制代码

 

复制代码
1 // GameManager.js 
2 // 引入单例类
3 var Singleton = require("Singleton");
4 
5 var GameManager = cc.Class({
6         // 调用
7         cc.warn(Singleton.getInstance().name);
8         Singleton.getInstance().printInfo();
9 });
复制代码

 

单例组件

1.新建一个 GameManager.js

复制代码
 1 // 开头必须 新建一个变量引用 var GameManager
 2 var GameManager = cc.Class({
 3     extends: cc.Component,
 4     properties: {
 5         age : 20
 6     },
 7     statics: {
 8         _instance : null
 9     },
10     //最先进入地方
11     onLoad(){
12         cc.warn(" ============== GameManager init" );
13         GameManager._instance = this; 
14          //设置帧率
15         cc.game.setFrameRate(60);
16         //设置该对象为不销毁
17         cc.game.addPersistRootNode(this.node);
18     }
19 }
复制代码

2.调用地方 
新建一个 Test.js

复制代码
 1 // 开头必须require 引入单例 GameManager
 2 var GameManager = require("GameManager");
 3 cc.Class({
 4     extends: cc.Component,
 5 
 6     start () {
 7        // 直接调用
 8        // 输出: GameManager name : GameManager<GameManager>,age = 20
 9        cc.warn("GameManager name : "+  GameManager._instance.name 
10                +",age = " + GameManager._instance.age );  
11     },
12 
13 });
复制代码

特别强调

  • 单例组件类,开头必须要有变量引用 ,如var GameManager = cc.Class({...})
  • 调用单例组件的类,开头必须 require 引入


转载: https://blog.csdn.net/leovnay/article/details/79272977

posted @   porter_代码工作者  阅读(1394)  评论(0编辑  收藏  举报
编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
点击右上角即可分享
微信分享提示