วิธี Cooldown บน Unity แบบเรียบง่าย

Ada Kaminkure
2 min readAug 8, 2022

--

เกม AdaSpace: Quantum Fields

หลาย ๆ ท่านที่เริ่มทำเกมมักจะมีคำถามว่าจะเริ่มทำเกมได้ จะต้องรู้อะไรบ้าง ?

คำถามนี้มีคำตอบเป็น Infinite Solutions อยู่ที่ว่าท่านสนใจมุมไหนของการทำเกม

สำหรับตัวผมลองขอตอบแบบ Game Developer ที่มาจากสาย Software Engineer นะครับว่า สิ่งที่ท่านต้องรู้แบบเป็น 3 หัวข้อใหญ่

  1. Computer Programming in any languages
  2. Physics and Mathematics for Physics ^^
  3. Time!

รู้เท่านี้ก็เริ่มทำเกม Classic ต่าง ๆ ในอดีตได้แล้วครับ สำหรับผมเนื่องจากมาทางสาย Computer Science ดังนั้นแล้วจึงเน้นเขียนเกมแบบเขียนโค้ด แบบ Hardcore แบบเน้น Physics เน้น Vector จ๋า ๆๆ ไปเลย (มันมีความสุขมากนะที่สุดท้ายเราได้ใช้ในสิ่งที่เราเรียนมาจริง ๆ กับงานจริง ๆ ของเราและมันก็สนุกมาก ๆ ด้วย)

แต่วันนี้ผมจะมาคุยเรื่อง Time กัน เป็นหัวข้อใหญ่ที่เรามักจะมองข้าม แต่สุดท้ายก็ข้ามมันไม่ได้อยู่ดีครับ เพราะทุกอย่างในโลกจำลองที่เราสร้างขึ้นมา มีเวลาเป็นปัจจัยสำคัญสำหรับการสร้างความสนุก ความตื่นเต้น ลุ้นละทึก

ดังนั้นแล้ว บทความนี้ของผมก็จะมากล่าวถึงเรื่องการทำ CoolDown กันซึ่งแอบบอกไว้ก่อนเลยนะครับว่า มันดูเป็นเรื่องง่ายที่ต้องทำบ่อย ๆ แต่ Unity ก็ไม่ได้มี
Best Practices แบบง่าย ๆ และสะดวกมาให้เราครับ

เริ่มแรกทุกคนคงเคยได้ยิน WaitForSecond กันมาบ้างแล้วใช่ไหมครับ ซึ่งจะต้องใช้งานร่วมกับ Corountine เป็นการทำงานแบบ Multi-Thread ดัง Code ต่อไปนี้ครับ

การใช้งาน WaitForSecond บน Unity

แต่มันใช้ไม่ค่อย Work เท่าไหร่ กับกรณีที่เราต้องการให้มีการยิงออกไปครั้งเดียว กับการเช็ค GetKey หรือ GetButton บางท่านก็อาจจะสงสัยว่าแล้วทำไม ไม่ใช้ GetKeyDown หรือ GetButtonDown ล่ะ

มันก็ใช่ครับแต่สำหรับเกมแนว Shooting อย่าง AdaSpace ที่เป็นเกมยานอวกาศ แบบ Space Invader ที่ผมทำขึ้นมาเพื่อความสนุกมันต้องการที่จะยิงค้างได้ด้วย เวลาที่เรา Hold Key Down แต่ก็ไม่อยากให้มันยิงออกมา เยอะแยะเต็มไปหมด

แบบนี้ก็รัวเกิ๊นนนน ไว้เลเวลสูง ๆ ค่อยยิงแบบนี้
อยากได้แบบนี้ กดค้างไว้แต่ก็ไม่ได้ยิงรัว ๆๆๆๆ

ดังนั้นแล้ว เราจึงมีวิธีสำหรับปัญหานี้กันครับ โดยการใช้ Time.time เข้ามาช่วยครับ

Time.time เป็นการ get เวลา ณ Frame ปัจจุบัน โดยเริ่มนับตั้งแต่เริ่ม Application ครับ

เราสามารถนำมา Check ได้ง่าย ๆ จาก LastTime ที่มีการยิงออกไปแล้วบวกด้วย Cooldown time ของเรา หากเวลา Time.time ซึ่งเป็นเวลาปัจจุบันมีค่ามากกว่า LastTimeFire + Cooldown แล้วนั้นแปลว่า ครบกำหนด Cooldown แล้วเราสามารถทำการยิงรอบต่อไปได้ครับ

เป็นยังไงกันบ้างครับ เพียงเท่านี้เราก็สามารถที่จะยิงโดยมี Cooldown ได้แล้วครับ หากผู้เล่นเก็บ Power Up Item ได้ เราก็ไปปรับให้ cooldown time น้อยลง ผู้เล่นของเราก็จะสามารถยิงรัว ๆๆๆๆ ได้เลยคร้าบบบบบ

สนใจอยากเขียนเกมบน Unity ก็ติดต่อกันมาได้เลยนะครับบบบบ

References

  1. https://docs.unity3d.com/ScriptReference/WaitForSeconds.html
  2. https://docs.unity3d.com/ScriptReference/Time-time.html

--

--

Ada Kaminkure

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