ช่วงนี้อยากจุดไฟในการสร้างอะไรบางอย่าง เลยหันมาจับ Unity เขียนแอพ เขียนเกมดู จากประสบการณ์ที่เคยเขียนมาเมื่อสองปีก่อน คือฟังก์ชั่น Update() มักจะเต็มไปด้วยโค้ดมหาศาล if กระจุยกระจาย เลยอยากหาวิธีแก้ ก็ได้มาเจอ framework UniRx เข้า แก้ปัญหาได้เยอะเลย ก็จะขอสรุปแหล่งข้อมูลที่ค้นมาไว้ที่นี่ครับ

UniRx คือ?

คำจำกัดความจากผู้พัฒนาคือ “Reactive Extensions for Unity” พูดง่ายๆ คือเฟรมเวิร์กที่ทำให้เราเขียน Reactive Programming ด้วยภาษา C# ใน Unity ได้นั่นเอง

https://github.com/neuecc/UniRx

neuecc/UniRx

Reactive Extensions for Unity. Contribute to neuecc/UniRx development by creating an account on GitHub.

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入門シリーズ

https://qiita.com/toRisouP/items/00b8a5bb8e7b68e0686c

UniRx入門シリーズ 目次 - Qiita

UniRx入門 その1 UniRx入門 その2 -メッセージの種類/ストリームの寿命 UniRx入門 その3 -ストリームソースの作り方 UniRx入門 その4 -Updateをストリームに変換する方法とメリット- UniRx入門 ...

สอนใช้ 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

http://infalliblecode.com/learning-unirx-1/

Learning UniRx | Theory of Reactive Programming [Part 1]

Understanding Reactive Programming is the key to using UniRX effectively. Part 1 of Learning UniRx teaches essential concepts for UniRx programmers.

ภาษาอังกฤษ สอนคอนเซ็ปต์ 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 =>
    {
        ...
    });

บทความอื่นๆ ที่ใช้อ้างอิงตอนเขียนโปรแกรม

สรุป

UniRx ดีงามมาก ไว้ถ้าเจอแหล่งข้อมูลดีๆ จะมาอัพเดตเพิ่มครับ