คุณใช้ Singleton อย่างไร?
6 นาที
ซิงเกิลตัน (Singleton) เป็นรูปแบบการออกแบบที่รับประกันว่ามีเพียงหนึ่งอินสแตนซ์ของคลาสเฉพาะในโปรแกรมเท่านั้น
รูปแบบซิงเกิลตันให้มีอินสแตนซ์เดียวทั่วโลกของคลาส ทำให้สามารถเข้าถึงได้ง่ายจากสคริปต์อื่น ๆ ที่ต้องการ เช่น การจัดการตรรกะ เสียง UI และทรัพยากรที่รวมศูนย์ภายในโลก
ใน ZEPETOScript คุณสามารถนำซิงเกิลตันไปใช้ในลักษณะดังนี้:
private static _instance: ClassName = null;
public static get Instance(): ClassName {
if (this._instance == null) {
this._instance = GameObject.FindObjectOfType<ClassName>();
}
return this._instance;
}👍 เคล็ดลับ
- หากมี GameObject ที่มีสคริปต์ซิงเกิลตันแนบอยู่ในฉากแล้ว คุณสามารถใช้รูปแบบนี้ได้
- หากไม่มี ให้เพิ่มโค้ดเพื่อสร้าง GameObject
- ตัวอย่าง: new GameObject("ObjectName").AddComponent<ClassName>();
มานำซิงเกิลตันไปใช้ในการจัดการ UI ในตัวอย่างกันเถอะ:
1) เพิ่ม UI > ข้อความ และปุ่มลงในฉาก
- ตั้งค่าตรรกะเพื่อเพิ่มคะแนนเมื่อกดปุ่ม "เพิ่มคะแนน"
- ตั้งค่าตรรกะเพื่อลดคะแนนเมื่อกดปุ่ม "ลดคะแนน"

2) สร้างสคริปต์ชื่อ "ScoreManager" ซึ่งจะใช้ Singleton.
- สคริปต์ ScoreManager จะรับผิดชอบในการเพิ่ม/ลดคะแนนและอัปเดตข้อความเมื่อถูกเรียกจากสคริปต์อื่น ๆ.
import { ZepetoScriptBehaviour } from 'ZEPETO.Script';
import { GameObject } from 'UnityEngine';
import { Text } from 'UnityEngine.UI';
export default class ScoreManager extends ZepetoScriptBehaviour {
// การประกาศ Singleton
private static _instance: ScoreManager = null;
public static get Instance(): ScoreManager {
if (this._instance == null) {
this._instance = GameObject.FindObjectOfType<ScoreManager>();
}
return this._instance;
}
// การประกาศตัวแปร
public scoreText: Text;
private _currentScore : number;
Start() {
// ตั้งค่าคะแนนเริ่มต้นเป็น 0 สำหรับการทดสอบ
this._currentScore = 0;
}
// สคริปต์อื่นสามารถเรียกใช้ IncreaseScore
public IncreaseScore(amount: number) {
this._currentScore += amount;
this.scoreText.text = `คะแนน : ${this._currentScore}`;
}
// สคริปต์อื่นสามารถเรียกใช้ DecreaseScore
public DecreaseScore(amount: number) {
this._currentScore -= amount;
this.scoreText.text = `คะแนน : ${this._currentScore}`;
}
}
- คำอธิบายสคริปต์
- private static _instance: นี่คือตัวแปรสถิติเสมือนภายในคลาส ซึ่งตั้งค่าเริ่มต้นเป็น null.
- public static get Instance: คุณสมบัติสถิตินี้ให้วิธีการสำหรับโค้ดภายนอกในการเข้าถึงอินสแตนซ์ที่ไม่ซ้ำกันของคลาสนี้.
- ตรวจสอบ if (this.\_instance == null). หากมันเป็น null ให้ใช้ GameObject.FindObjectOfType<>() เพื่อค้นหาและคืนค่าคอมโพเนนต์ประเภท ClassName และกำหนดให้กับตัวแปรสถิติ.
3) หลังจากเขียนสคริปต์แล้ว ให้กลับไปที่ Inspector และเชื่อมต่อกับคอมโพเนนต์ Text.

4) ถัดไป สร้างสคริปต์ชื่อ "ScoreLogicSample" เพื่อแสดงวิธีการเรียกใช้ Singleton ให้แน่ใจว่า ScoreManager และ ScoreLogicSample อยู่ในไดเรกทอรีเดียวกัน.

- เขียนโค้ดแบบนี้:
import { ZepetoScriptBehaviour } from 'ZEPETO.Script';
import { GameObject } from 'UnityEngine';
import { Text, Button } from 'UnityEngine.UI';
// นำเข้าสคริปต์ Singleton
import ScoreManager from './ScoreManager';
export default class ScoreLogicSample extends ZepetoScriptBehaviour {
public increaseScoreButton: Button;
public decreaseScoreButton: Button;
// ประกาศตัวแปรประเภท ScoreManager
private ScoreManager : ScoreManager;
Start() {
// กำหนด ScoreManager ให้กับตัวแปร
this.ScoreManager = GameObject.FindObjectOfType<ScoreManager>();
this.increaseScoreButton.onClick.AddListener(()=> {
// เรียกใช้ฟังก์ชันที่ประกาศใน Singleton
this.ScoreManager.IncreaseScore(10);
});
this.decreaseScoreButton.onClick.AddListener(()=> {
// เรียกใช้ฟังก์ชันที่ประกาศใน Singleton
this.ScoreManager.DecreaseScore(10);
});
}
}
- การระบุเส้นทางให้ถูกต้องเมื่อดึงสคริปต์ Singleton เป็นสิ่งสำคัญ
- คุณสามารถปรับส่วนที่เรียก ScoreManager ในสคริปต์ของคุณตามที่ต้องการ
5) กดปุ่ม [▶︎(เล่น)] เพื่อทดสอบ
- คุณควรสังเกตฟังก์ชันใน ScoreManager ที่ถูกเรียกเมื่อคุณคลิกปุ่มใน ScoreLogicSample ทำให้มันทำงานตามที่คาดหวัง
