ฉันได้เห็นวิดีโอและแบบฝึกหัดหลายประการสำหรับการสร้างวัตถุเดี่ยวใน Unity ซึ่งส่วนใหญ่เป็น a GameManager
ซึ่งดูเหมือนจะใช้วิธีการต่าง ๆ ในการสร้างอินสแตนซ์และตรวจสอบความถูกต้องของซิงเกิล
มีวิธีที่ถูกต้องหรือค่อนข้างที่ต้องการในการนี
ตัวอย่างหลักสองอย่างที่ฉันพบคือ:
เป็นครั้งแรก
public class GameManager
{
private static GameManager _instance;
public static GameManager Instance
{
get
{
if(_instance == null)
{
_instance = GameObject.FindObjectOfType<GameManager>();
}
return _instance;
}
}
void Awake()
{
DontDestroyOnLoad(gameObject);
}
}
ที่สอง
public class GameManager
{
private static GameManager _instance;
public static GameManager Instance
{
get
{
if(_instance == null)
{
instance = new GameObject("Game Manager");
instance.AddComponent<GameManager>();
}
return _instance;
}
}
void Awake()
{
_instance = this;
}
}
ความแตกต่างหลักที่ฉันเห็นระหว่างสองคือ:
วิธีแรกจะพยายามนำทางวัตถุในเกมเพื่อค้นหาตัวอย่างของสิ่งGameManager
ที่เกิดขึ้น (หรือควรเกิดขึ้น) เพียงครั้งเดียวดูเหมือนว่ามันจะไม่ได้เพิ่มประสิทธิภาพมากขึ้นเมื่อฉากมีขนาดใหญ่ขึ้นในระหว่างการพัฒนา
นอกจากนี้วิธีแรกจะทำเครื่องหมายว่าวัตถุจะไม่ถูกลบเมื่อแอปพลิเคชันเปลี่ยนฉากซึ่งทำให้แน่ใจได้ว่าวัตถุนั้นยังคงอยู่ระหว่างฉาก วิธีที่สองดูเหมือนจะไม่เป็นไปตามนี้
วิธีที่สองดูเหมือนแปลกในกรณีที่อินสแตนซ์นั้นเป็นโมฆะในผู้ทะเลาะกันมันจะสร้าง GameObject ใหม่และกำหนดองค์ประกอบ GameManger ให้ อย่างไรก็ตามสิ่งนี้ไม่สามารถทำงานได้หากไม่มีส่วนประกอบ GameManager นี้ติดอยู่กับวัตถุในฉากดังนั้นสิ่งนี้ทำให้ฉันสับสน
มีวิธีอื่นใดที่จะแนะนำหรือเป็นลูกผสมของทั้งสองข้างต้น? มีวิดีโอและแบบฝึกหัดมากมายเกี่ยวกับซิงเกิลตัน แต่พวกเขาต่างกันมากมันยากที่จะดึงการเปรียบเทียบระหว่างทั้งสองดังนั้นสรุปได้ว่าข้อใดเป็นวิธีที่ดีที่สุด
GameManager
ควรทำอย่างไร แต่ควรทำอย่างไรเพื่อให้แน่ใจว่ามีเพียงตัวอย่างเดียวของวัตถุและวิธีที่ดีที่สุดในการบังคับใช้