UniRxの勉強 No.1

2020年4月19日日曜日

UniRx Unity

t f B! P L


UniRx使えたら楽しそうだなぁってことで、勉強はじめて行きます。

勉強の方針は、
作りながら覚える!

で、作るものは
「Unityの教科書」のサンプルプロジェクト

1年前、僕はその本を買って必死に読んでました。
そして、1年経った今、そのサンプルプロジェクトをUniRxベースで作り直してやろうってワケです。

なんで、Unityの教科書を選んだかって言うと、
1、物(imageとか)を作る必要がない(用意されている)ので、プログラミングに集中できる。
2、シンプルなゲームを作っている
3、作成企画を考える必要がない

ですね、
やっぱモデリングとかイラストとか描くのに時間かけたくないし、最初は簡単なゲームがいい。

今回の目的は「UniRxの勉強」だからこれに集中するのです。


では第1回目始めていこう。

下調べ

UniRx??
なんか凄いやつ?

という認識で始めては流石にまずいので色々調べた。

調べたけど、 よくわからなかった。

けど、 よくわからなくてもいいかなって思ってる。

だって、ちょっと知ってるだけで、聴き慣れない言葉に怯えることもなくなるし、作っていく途中での疑問の解決速度も上がるから。

<読んだ記事>

実践

今回はUnityの教科書chapter2のスクリプト関係。

Debug.Log()を使ってUniRxに触れてみることにする。

簡単そうなクリック系の物を作ってみる。

UniRxのインストール


UniRxはアセットストアかGitHubから入手するらしい。

アセットストアからダウンロードしてインポート。

スクリプト書いてみる


空のオブジェクト作って、「Test.cs」をアタッチ
スクリプトは
うん、クリックしたらログでた。

仕組みは
UpdateAsObservable()
ー 毎フレームイベントがくる

.Where(_ => Input.GetMouseButtonDown(0))
ー 来たイベントのうち、左クリック(Down)の物だけ通過させる

.Subscribe(_ => Debug.Log("input"));
ー ログ!!
あと、実行中に気がついたのだけど、

ってなってる。
「Observable Update Trigger (Script)」
なんだ、これは?
1つのストリームか?
それとも
UniRxのインスタンスオブジェクトか?


調べるためにスクリプトに加筆

結果

スクリプトの数さっきと一緒だから、UniRxのインスタンスっぽいね。

これを生成しておくことで、色々裏で最適化してくれているのだろう。きっと。

色々実験

スクリプトはこんな感じになりました。

using UnityEngine;
using UniRx;
using UniRx.Triggers;
using System;

public class Test :MonoBehaviour
{
    void Start() {
        this.UpdateAsObservable()
            .Where(_ => Input.GetMouseButtonDown(0))
            .Subscribe(_ => Debug.Log("Left!"));

        this.UpdateAsObservable()
            .Where(_ => Input.GetMouseButtonDown(1))
            .Subscribe(_ => Debug.Log("Right!"));

        Observable.EveryUpdate()
            .Where(_ => Input.GetKeyDown(KeyCode.Space))
            .Subscribe(_ => Debug.Log("Space!-NO AddTo"));

        Observable.EveryUpdate()
            .Where(_ => Input.GetKeyDown(KeyCode.Space))
            .Subscribe(_ => Debug.Log("Space!-AddTo"))
            .AddTo(this.gameObject);

        Observable.Timer(TimeSpan.FromSeconds(5))
           .Subscribe(_ => Destroy(this.gameObject));
    }

}


わかったこと

作られるやつは、色々ある


自動で消えず、GameObjectに結びついてない(AddTo()しなかった)やつはDontDestroyOnLoadのとことに作られる。
こいつを残しっぱなしにして溜めすぎるとメモリリーク起こすのかな?


ちゃんとGameObjectに結びついてるのは、UniRxの実体もちゃんと消える

感想

今回はメソッドチェーンで書いたストリームでUpdate()を消し去ってみた。

入力監視をStart()で、まとめて定義しておけるのは見やすいし、便利だと思う。

今回はobservarとかSubjectを意識しない物を書いた。
これが正しいUniRxの使い方なのかはわからないけど、少しUniRxについてわかった気がする。

次回は Unityの教科書chapter3 のルーレットをUniRxで作っていこうと思う。


-今回のUnityプロジェクト-
Contribute to 2357or/UniRx_study1 development by creating an account on GitHub.

自己紹介

自分の写真
県立高校理数科2年
Unity2年目
Twitter
Note

人気の投稿

[Vim] coc.nvim + coc-clangdの構文チェックでboostのエラーが発生する

C++の拡張ライブラリ、Boost。 AtCoderでも使用が認められているライブラリです。 様々な便利機能が搭載されています。 競技プログラミングで使えるBoostライブラリ 初級編 から一部抜粋すると、 boost...

QooQ