ช่วงนี้อยากจุดไฟในการสร้างอะไรบางอย่าง เลยหันมาจับ Unity เขียนแอพ เขียนเกมดู จากประสบการณ์ที่เคยเขียนมาเมื่อสองปีก่อน คือฟังก์ชั่น Update()
มักจะเต็มไปด้วยโค้ดมหาศาล if
กระจุยกระจาย เลยอยากหาวิธีแก้ ก็ได้มาเจอ framework UniRx เข้า แก้ปัญหาได้เยอะเลย ก็จะขอสรุปแหล่งข้อมูลที่ค้นมาไว้ที่นี่ครับ
UniRx คือ?
คำจำกัดความจากผู้พัฒนาคือ “Reactive Extensions for Unity” พูดง่ายๆ คือเฟรมเวิร์กที่ทำให้เราเขียน Reactive Programming ด้วยภาษา C# ใน Unity ได้นั่นเอง
neuecc/UniRx
Reactive Programming คืออะไร มีข้อดียังไง เป็นอะไรที่อธิบายยากมาก ขอเชิญตามไปงมอ่านบทความมากมายได้ข้างล่างครับ
Reactive Programming ก็มาหว่ะ
ทำไมถึงใช้ UniRx
background เราเป็น iOS Engineer ที่ปัจจุบันเขียนแอพโดยใช้ RxSwift เป็นอย่างมาก (RxSwift เป็นเฟรมเวิร์กที่ทำให้เขียน Reactive Programming ในภาษา Swift ได้)
Sequence คือคำเรียก Stream ใน RxSwift จากหนังสือ RxSwift: Reactive Programming with Swift
เราเพิ่งรู้จักและได้ใช้ RxSwift ก็เมื่อสองปีก่อน (2018) นี่เอง ก่อนหน้านั้นเขียนแอพแพทเทิร์น MVC โค้ดบานเบอะอยู่ที่ View Controller แต่หลังจากใช้ RxSwift ก็ทำให้เขียนแอพด้วยแพทเทิร์น MVVM แยกหน้าที่การรับส่งข้อมูลออกจาก View Controller ที่เป็นฝั่งนำเสนอได้เยอะ ก็เลยชอบ Reactive Programming (Rx) พอสมควร
เนื่องจากเราติดวิธีเขียนโค้ดแบบ Rx แล้ว พอมาใช้ Unity ต้องใช้ Coroutine/events/delegate เพื่อเขียนโค้ด asynchronous เห็นแล้วปวดหัว… โค้ดกระจัดกระจาย แถมต้องจำวิธีเขียนแบบ C# อีก ก็เลยอยากใช้ UniRx ขึ้นมา จะได้เขียนโค้ดด้วยวิธีที่ชินแล้ว แถมเข้าใจง่าย maintain ง่ายด้วยนั่นเอง
อีกข้อดีของ Rx คือ แนวคิดเหมือนกันทุกภาษา เขียนเป็นภาษาหนึ่ง ก็นำแนวคิดไปใช้กับอีกภาษาแทบจะได้ทันทีเลย คุ้มค่าที่เรียนมามากๆ
แหล่งข้อมูล
Qiita
UniRx入門シリーズ
UniRx入門シリーズ 目次 - Qiita
สอนใช้ UniRx ตั้งแต่พื้นฐาน เป็นภาษาญี่ปุ่น สำหรับคนที่่อ่านได้ เข้าใจง่ายมากๆ
จากบทความดังกล่าว Property ที่ควรใช้เป็นอันดับต้นๆ คือ
- UniRx.Triggers
- https://github.com/neuecc/UniRx/wiki/UniRx.Triggers
this.UpdateAsObservable()
แปลงUpdate()
ให้เป็น Rx ไม่ต้องเขียนโค้ดก้อนใหญ่ๆ ในฟังก์ชั่นเดียวอีกต่อไปthis.OnCollisionEnterAsObservable()
แปลง delegate ให้เป็น Rx รวมโค้ดให้อยู่ในStart()
ที่เดียวได้ ไม่ต้องกระโดดไปหาว่าเขียนโค้ดเช็ค collision อยู่ที่ไหนในไฟล์
- ReactiveProperty
public FloatReactiveProperty elapsedTime = new FloatReactiveProperty(0);
- ใช้อัพเดต UI ตอนเวลาเปลี่ยนเป็นต้น
- uGUI
Button.OnClickAsObservable()
- ลาก่อน AddListener ไม่ต้องสร้างฟังก์ชั่นข้างนอกอีกต่อไป เขียนโค้ดที่อยากให้รันเวลากดปุ่มไว้ใกล้ๆ ปุ่มได้เลย
Infallible Code
Learning UniRx | Theory of Reactive Programming [Part 1]
ภาษาอังกฤษ สอนคอนเซ็ปต์ Rx ตั้งแต่ต้น เป็นคลิปอธิบายเข้าใจง่ายดี
บันทึกกันลืม
CombineLatest
วิธีเขียน CombineLatest แบบ UniRx จำเป็นต้อง return Tuple
ที่สร้างขึ้นเอง ก่อนจะ Subscribe เยิ่นเย้อนิดนึง ต่างจาก RxSwift ที่สามารถใช้ค่าของ Observable ข้างในได้ทันทีโดยอัตโนมัติ
Observable.CombineLatest(presenter.elapsedTime, presenter.timeMode, (float elapsedTime, GameManagerPresenter.TimeMode timeMode) =>
{
return new Tuple<float, GameManagerPresenter.TimeMode>(elapsedTime, timeMode);
}).Subscribe(tuple =>
{
...
});
บทความอื่นๆ ที่ใช้อ้างอิงตอนเขียนโปรแกรม
- วิธี Bind เวลาอัพเดตแบบซับซ้อนหน่อย “เขียนโค้ดให้เลือดลดทุกๆ 1 วินาทีเป็นเวลา 10 ครั้ง และหยุดลดเลือดถ้าหาก HP เหลือ 0”
สรุป
UniRx ดีงามมาก ไว้ถ้าเจอแหล่งข้อมูลดีๆ จะมาอัพเดตเพิ่มครับ