How to load new scene in Unity without destroy your player object!
มา! วันนี้เรามาพูดการเปลี่ยน Scene โดยที่ตัวละครของเราไม่โดนทำลายกัน ซึ่งเอาความจริง คือ มันมีหลายวิธีมากครับ แต่วันนี้ผมจะมาพูดถึง API ที่ทาง Unity เตรียมไว้ให้กับเราแล้วครับ นั่นก็ คืออออออ…
DontDestroyOnLoad()
เป็น Method ที่ค่อนข้างใช้ง่ายครับ แต่ก็ยังมีเรื่องต้องระวังโดยเฉพาะเวลากลับ Scene ไปมาตามแบบเกม RPG ก็อาจจะเกิดปัญหา การ Clone Player ของเราซ้ำ ๆ ได้ครับ ดังนั้นเรามาดูวิธีการ Implement กัน
สมมติว่าผมมี Player Object อยู่อันหนึ่งซึ่ง Player ของผมก็จะไปด้วยกันกับผมในทุก ๆ Scene เราเริ่มที่การเดินเข้าประตูถ้ำ แล้วไปโผล่ที่ Scene ถ้ำกัน
โดยปกติใน Unity เวลาเรา Load Scene ใหม่ขึ้นมา ทุก ๆ Objects จะต้องถูกทำลายทิ้งทั้งหมด (ใน Mode Single นะครับ ไม่นับ Adaptive นะ) ดังนั้นทำยังไงกันดีให้ Player Object ของเรายังเหลือรอด ก็มาดูกัน
เราเลือกใช้ Awake Method ของ Unity เพราะว่า Method นี้จะถูกเรียกใช้งานขึ้นมาเป็นอันดับแรกก่อน Start Method เพื่อป้องกันปัญหา หา Reference ไม่เจอผมแนะนำใช้ Awake ครับ
Line 10
หลังจากนั้น หากเราติด “Player” tag ไว้ให้เรา object เราเรียบร้อยแล้ว เราสามารถที่จะหาได้จาก GameObject.FindGameObjectsWithTag(“Player”) ใน line ที่ 10 ครับ ตัวนี้จะทำการ Return GameObjects ที่มี Tag นี้ทั้งหมดออกมาเป็น Array ครับ
Line 11
หลังจากนั้นใน line ที่ 11 เราจะทำการตรวจสอบว่า มี player ที่ถูกสร้างขึ้นมาเกิน 1 objects หรือไม่ ถ้ามีการสร้างขึ้นมาเกินก็ลบทิ้งซะ !! (ด้วย Destroy(this.gameObject)
Line 15
หากไม่มีปัญหาอะไรเราก็สามารถเรียกใช้ DontDestroyOnLoad(this.gameObject) เพื่อรักษา Player ของเราไม่ให้ถูกทำลายได้แล้วคร้าบบบบ
ทีนี้จะย้าย Scene ไปมา เดินเข้าเดินออกเปลี่ยน Maps ไปมา ก็ไม่มีปัญหาแล้วจร้าาาา!
References:
https://docs.unity3d.com/ScriptReference/Object.DontDestroyOnLoad.html
Further read:
https://answers.unity.com/questions/1457637/how-to-keep-game-states-while-loading-different-sc.html