ควบคุมเสียง BGM ของเกมอย่างง่ายกันเถอะ

9768c4c4-649e-4e5d-be1f-02983cf9247f

สวัสดีครับ กลับมาพบกับทิปดีๆด้วย Unity กันอีกเช่นเคย วันนี้เราจะมาพูดถึงการเล่นเสียง BGM หรือ background music กันครับ

BGM หรือ Background music คือเสียงที่จะเล่นเป็นฉากหลังในด่านต่างๆ ซึ่ง Unity ก็มี Component ที่ใช้สำหรับเล่นเสียงมาให้เราพร้อมใช้ก็คือ Component Audio Source นั่นเอง ซึ่งเราสามารถกำหนดให้เสียงนี้ Loop หรือเล่นเพียงครั้งเดียวก็ได้นะครับ แต่ปัญหาก็คือ ทำยังไงให้เสียงนี้เล่นไปต่อเนื่องกันหลายๆซีนเมื่อเราเปลี่ยนฉาก และแก้ปัญหาเสียงเล่นซ้อนกันด้วยครับ มาทำไปพร้อมๆกันเลย

ในตัวอย่างนี้ เราจะเตรียมเสียงมา 1ไฟล์นะครับ เอาที่ Unity support นะครับ หลักๆก็มี .mp3 หรือ .wav ก็ได้ครับ

ขั้นตอนแรก เราจะสร้าง Loading Scene กันก่อนครับ Scene นี้จะเป็น Scene ที่เราสร้าง Object เสียงของเรานั่นเองครับ รวมไปถึงเราจะสร้างสคริปเพื่อให้โหลด Scene ต่อไปโดยในที่นี้เราจะตั้งชื่อว่า Title Scene ครับ

01

 

และเราจะใส่ Obj 2 ตัวครับ คือ Sound controller และ Controller

02

 

Sound controller เป็น Object ที่เราจะใส่เสียงเข้าไป และจะให้ Object นี้ไม่ถูกทำลายตอนเปลี่ยน Scene ด้วย มาดูส่วนประกอบกันครับ

03Sound controller

06Script SoundControllerScript

ทำไมเราต้อง GetComponent เดี๋ยวผมจะบอกในส่วนต่อๆไปครับ

ส่วน Object Control ไม่มีอะไรมากครับ เป็นสคริปที่เอาไว้เปลีย่นฉากไปฉากต่อไป

04Controller Object

05LoadSceneScript

จากนั้นเราก็จะสร้าง Scene ที่สองครับ โดยผมตั้งชื่อไว้ว่า Title นั่นเองครับ โดยในฉากนี้ ผมได้สร้างสคริปเพื่อมาควบคุมการเปลี่ยน Scene ด้วย Button ครับ

07

08ภาพรวมของ Object และโครงสร้างของ Game controller ครับ

09ใส่ Button ลงไปและให้มันเรียกใช้ฟังชั่นก์ ChangeScene ใน GameController Object ครับ

10MainScript และฟังชั่นก์ changeScene

จาก Title Scene ผมจะเปลี่ยนไป Scene ที่ชื่อว่า Ingame1 โดยเราสามารถก็อปปี้ปุ่มและ Text จาก Scene ที่แล้วมาใช้ได้เลยครับ แต่อย่าลืมเอา Object Event มาด้วยนะครับ ไม่งั้นจะคลิกปุ่มไม่ได้ครับ

11

และเราจะทำอีก Scene นึงตั้งชื่อไว้ว่า Ingame2 โดย Scene นี้ เดี๋ยวเราจะใส่สคริปให้หยุดการเล่นเสียงครับ พร้อมทั้งมีปุ่มกลับไปหน้า Title ด้วยครับ

12

เมื่อเราทำตามนี้แล้วลองเล่นดู ก็จะได้ผลลัพธ์ที่เกือบจะสมบูรณ์แล้วนะครับ เพราะว่าเราสามารถเล่นเพลงวนไปเรื่อยๆแม้ว่าเราจะเปลี่ยน Scene ก็ตามครับ

แต่ว่าสมมติว่าเราต้องการจะหยุดการเล่นเสียงที่ Scene ใด Scene หนึ่ง เราต้องใส่สคริปเพิ่มอีกเล็กน้อยครับ โดยในที่นี้ผมจะหยุดเล่นเสียงที่ Scene Ingame2 และเมื่อวนกลับมา Title ค่อยเล่นเสียงใหม่ครับ เราจะใส่สคริปเพิ่มในสคริป SoundcontrollerScript ครับ

13

โดยในที่นี้เราจะใช้ฟังชั่นก์ OnLevelWasLoaded ซึ่งฟังชั่นก์นี้จะทำงานเมื่อเราโหลด Scene ใหม่ขึ้นมาครับ โดยสคริปนี้ผมจะสร้างตัวแปรที่ชื่อ source เป็นตัวแปรประเภท AudioSource และตอนสร้าง Object ก็สร้าง Reference ไว้เลยตอน Start ครับ

source = GetComponent<AudioSource>();

จากนั้นผมก็เช็คว่า Scene ที่โหลดมาชื่ออะไร แล้วทำการปิดเปิด Audiosource ตามที่เราต้องการครับ

if (SceneManager.GetActiveScene().name == “Ingame2”)

{

source.Stop();

}

 

if (SceneManager.GetActiveScene().name == “Title”)

{

source.Play();

}

 

เป็นไงบ้างครับ อาจจะยาวซักหน่อยสำหรับทิปในวันนี้ แต่ก็เป็นวิธีง่ายๆที่จะทำให้เราใช้งาน BGM ได้อย่างมีประสิทธิภาพครับ แล้วพบกันใหม่ทิปหน้าครับ