Build เกมออกมาแล้ว Debug.Log มันยังอยู่!
ผมเคยมีความเข้าใจผิดของ Debug.Log ใน Unity อย่างนึง ว่าใน build จริงที่ไม่ได้ติ้ก Development Build แล้วพวก log ที่พ่นๆไว้มันจะหายไปเอง แต่จริงๆไม่ใช่นะครับ มันยังอยู่ครบเลย 555
ซึ่งทางฝั่ง Android สามารถต่อมือถือเข้าคอมแล้วใช้เครื่องมืออย่าง adb logcat อ่าน log ที่ว่าได้ครับ แล้วยิ่งเวอร์ชั่นล่าสุด 2017.1 ตรง Editor มันมีที่ให้ต่อดูง่ายๆด้วย แต่กรณีนี้ใช้ได้กับเกมตัวเองเท่านั้น
สาธิต
เพื่อเป็นการสาธิตผมจะลองเปิดเกมของคนอื่นที่ค่อนข้างมั่นใจว่าใช้ Unity ดู เกมนี้ชื่อเกม VOEZ โดยผมต่อ USB เข้าคอมแล้วใช้เครื่องมือของ Google คือ adb logcat
จะเห็นว่ามีหลงมาจริงๆด้วย โดยดูได้จากตรง log ที่เขียนว่า Unity : นำหน้าแปลว่ามาจาก process ของ Unity อันนี้เห็นว่าเป็นชื่อผมที่ login เข้าเกม เหมือนจะเป็นคำสั่งที่ส่งไปที่ endpoint นึงของเขาเพื่อ login
จะเห็นว่าถึงดูได้ก็ไม่ได้มีอันตราย ถ้าเกมเขียนแบบไม่มีข้อมูล sensitive ที่ฝั่ง client ก็ไม่ต้องกังวลอะไรมาก แต่ก็ระวังไว้ด้วยเช่นถ้าใครเผลอ log password ทิ้งไว้ดู debug แล้วมันโชว์ขึ้นมาแบบนี้ก็คงจะรู้สึกไม่ปลอดภัยแปลกๆ
ระวังเรื่อง error จาก method/library ต่างๆ
ทีนี้จะลองตั้งใจให้ error ดูบ้างก็คือปิดเน็ตก่อนแล้วกดดู scoreboard
เรื่องของ Error ที่ต้องระวังคือเราไม่ได้เขียน Debug.Log ไว้เอง แต่มันก็ขึ้นมาเตือนเรา ซึ่งตรงนี้ก็ดีแล้วที่มันเตือนคนทำเกม แต่ก็ต้องนึกดูดีๆด้วยว่ามีข้อมูลอะไรสำคัญมั้ย อย่างอันนี้มันทำให้ผมรู้ว่าเกมนี้เขาใช้ endpoint URL leaderboard หน้าตายังไง และมี access_token แถมท้ายมา ซึ่งใช้ประโยชน์อะไรได้มั้ยก็คงไม่ล่ะมั้ง แต่ถ้าเกมของเราก็ไม่แน่ครับ
(อย่างตอนนี้ Firebase ที่ผมใช้ ถ้า permission denied ขึ้นมามันจะฟ้อง address ที่เราเก็บข้อมูลใน realtime database มาด้วย ก็ให้มั่นใจด้วยว่าใน address นั่นไม่มีข้อมูลสำคัญ)
แล้วก็ Error ที่มาจาก library อื่นที่เราดึงมาใช้ ทำยังไงเราก็อาจจะปิดมันไม่ได้ยิ่งถ้ามันเป็น dll ไปแล้ว อันนี้ก็คงจะทำอะไรได้ไม่มากครับ
เมื่อเริ่มเพลงหรือลองกด retry ดูก็เห็น log ขึ้นมาอีก อันนี้เข้าใจว่าอาจจะเป็น analytics ไว้สะสมข้อมูลจากผู้เล่นว่าเพลงไหนฮิต เห็น JSON นี้ก็คงไม่มีประโยชน์อะไร นอกจากรู้ว่าระดับยากสุดเดิมมันชื่อ Extra ไม่ใช่ Special
เล่นเสร็จก็ขึ้นอีก
กดกาชาก็ขึ้นครับ แล้วก็อันนี้ result มันขึ้นไวมากเลย เดาๆว่ามันอาจจะ gen result ในเครื่องไม่ใช่จาก server 555 แต่เกมนี้กาชามันก็ไม่ค่อยอะไรมาก
มาลองดูอีกเกมบ้าง เกมนี้ชื่อเกม Lanota
อันนี้มาอย่างหล่อเลย… แต่จริงๆแล้วเป็นชื่อ achievement ต่างหาก
Error ของ Unity ก็ต้องระวังครับ
อีกอันที่เราห้ามไม่ได้ก็คือ error ของ Unity เอง จะสังเกตเห็นว่ามีตัว W นำหน้า มันคือ Warning สีเหลืองใน Unity นั่นเองครับ เช่นอันนี้ component หาย บางคนอาจจะเคยเจอตอนทำเกม
จะเห็นว่า ชื่อ game object หลุดออกมาสู่สาธารณะชนได้ ซึ่งนอกจากจะเขินนิดหน่อยแล้วคงไม่อะไรมาก ถ้าไม่ได้ตั้งชื่อ game object แบบ พ่องตาย อะไรแบบนี้ก็ไม่น่าจะเป็นไรครับ 555
แล้วก็ชื่อ script ที่หายโดน strip ออกไปหมดแล้ว (จะเห็นว่า Filename ก็ไม่มีอะไรต่อ) แต่ถ้าติ้ก Development Build ไว้ จะเห็นได้ไปถึงบรรทัดโค้ดเลยในบาง log เพื่อให้เราไปตามแก้ปัญหาได้
มาดูเกมสุดท้ายคือ Dynamix กันบ้างครับ
สะกดภาษาอังกฤษผิดก็เขินไป 555
อันนี้เครื่องที่เต็มระหว่างโหลดไฟล์เสริม เลยทำให้รู้ว่าเจ้านี้ใช้ AWS เก็บของเพราะเห็น URL endpoint ขึ้นมา
ก่อนเริ่มเพลงแต่ละครั้งจะเห็นเลขปริศนาขึ้นมาซึ่งคาดว่าน่าจะเป็น offset ของเพลงที่เลือก
เหมือนได้เผือกเกมชาวบ้านไปทั่ว สนุกมั้ย 555
ฝั่ง iOS ก็ดู log ได้
ใช้ XCode แล้วไปที่ Window > Devices เลือกเครื่องที่ต่ออยู่ (ต้องเปิดโปรแกรมอะไรซักอย่างก่อนถึงจะเลือกได้) แล้วก็กดไอ้ลูกศรที่มุมล่างให้ console งอกขึ้นมาได้ครับ อันนี้จะดูยากขึ้นหน่อยเพราะไม่มีคำว่า Unity แต่อาจจะเห็นชื่อแอพแบบนี้
จะเห็นว่าตัวอย่างที่ยกไป ก็ไม่ค่อยเห็นอะไรอันตรายออกมาซึ่งก็เป็นเรื่องดีครับ แต่ระวังของเกมตัวเองก็แล้วกัน!
แล้วจะทำไงให้หายไป!
ไอ้ log นี้จริงๆมันสามารถทำให้เกมช้าลงได้เลยนะถ้าปริ้นต์รัวๆ หลายๆคนอาจจะเคยสัมผัสการต้องปริ้นต์รัวๆตอน debug เกม แล้วพบว่าเกมอืดลงมาก
แต่ก่อนเราต้องไป hijack คลาส Debug ให้ .Log มันไปเป็นของเราเอง จากนั้นเราก็จัดการปิดให้หายไปได้ แล้วพอจะทำเกมต่อก็มาเปิดใหม่ ซึ่งวุ่นวายพอสมควร
แต่จาก Unity 5.3 เป็นต้นมามันมีการอัพเกรดคลาส Debug แล้ว เราสามารถเข้าถึงตัวแปร logger ได้ (เปลี่ยนเป็นระบบ log ของเราเองก็ได้ ถ้าเขียน ILogger ขึ้นมาเอง) ดังนั้นคอมโบกับ preprocessor DEVELOPMENT_BUILD ที่จะเปิดปิดเองจากที่ติ้กตรงนั้น เราก็อาจจะทำงี้
#if DEVELOPMENT_BUILD || UNITY_EDITOR
Debug.unityLogger.logEnabled = true;
#else
Debug.unityLogger.logEnabled = false;
#endif
ก็น่าจะเวิร์คนะครับ เวลาไม่ได้ติ้กไอ้นั่นมันจะได้หายไปหมด (ยังไม่ได้ลองนะ!)
Edit : โอเคลองแล้ว log หายหมดจริงๆ log จาก Firebase ที่เราเข้าถึงโค้ดไม่ได้อะไรงี้ก็หายหมด