How to load new scene in Unity without destroy your player object!

Ada Kaminkure
1 min readAug 18, 2022

--

มา! วันนี้เรามาพูดการเปลี่ยน 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

--

--

Ada Kaminkure
Ada Kaminkure

Written by Ada Kaminkure

Indie Game Dev, Software Engineer, Teacher, and Self-Taught Mathematician

No responses yet