Unity + NoesisGUI でデスクトップマスコットに時計を付けてみた


ずっと右端のタスクバーがスピーカーに隠れて時計が見えない! って状態になっていて、気付いたら午前3時回ってた…ということをよく繰り返していました。

とにかくデスクトップに配置できる時計を作ろうとずっと思っていました。 置時計も昔は持っていたのですがあの地震で落下し液晶ガラスが割れて使えなくなり、それ以来現実世界に置ける時計は一切買っていませんでした。

そこで前回の NoesisGUI を試したときに、なんか簡単に試せる MVVM サンプルは無いかと思っていたら、「あら? 時計なんて簡単に試せるじゃん!」。ついでにずっと置いておいても邪魔にならない(と思わない)もの。 で、かなり前に Unity でデスクトップ用マスコットを作ったことを思い出しました。

いざ変更

マスコットの前面に時計版を配置するだけの簡単仕様。

とはいえ結構前に作ったものだったので Unity の Ver.5.6。古いのでとりあえず Ver.2017 RTS に上げてみて動くことを確認(エラーも修正しつつ)。何とか動くものだ…しかし .NET 4.x はダメだった…

20181218-01NoesisGUI の View 機能の1つ Render Texture を使って XAML 記述の UI を表示させてみる。(上図の透明な板に表示させます)

Blend でサクッとコントロールを作り ViewModel でバインドされるであろう Now プロパティを TextBlock.Text にバインドして View は完成。(枠っぽいのは前回の投稿でも使用した Affinity Designer でサクッと描いたもの)

ViewModel も WPF のように INotifyPropertyChanged インターフェイスを実装します。 WPF の場合定期的に呼び出されるメソッドは無いので DispatcherTimer 等を使うところだけど、Unity の場合 MonoBehaviour を継承していれば Updare がフレーム毎に呼び出されるのでそれを使った方が楽です。

RaisePropertyChanged メソッド

/// <summary>
/// Raises the property changed.
/// </summary>
/// <param name="name">The name.</param>
private void RaisePropertyChanged(string name)
{
    if(PropertyChanged != null)
        PropertyChanged(this, new PropertyChangedEventArgs(name));
}

Start メソッド

/// <summary>
/// Starts this instance.
/// </summary>
private void Start()
{
    var view = GetComponent<NoesisView>();
    view.Content.DataContext = this;
}

DataContext に ViewModel を設定します。

Update メソッド

/// <summary>
/// The previous seconds
/// </summary>
private int _previousSeconds = -1;

/// <summary>
/// Updates this instance.
/// </summary>
private void Update()
{
    var currentSeconds = DateTime.Now.Second;
    if (_previousSeconds != currentSeconds)
    {
        RaisePropertyChanged("Now");
        _previousSeconds = currentSeconds;
    }
}

重いマスコットなんてナンセンスなので、このマスコットは 15fps に制限しています。それでも秒間 15回も Update() は呼び出されるのため、無駄な View 更新を行わないように現在時刻の秒が変化したらプロパティの変更通知を出すようにします。

Now プロパティ

/// <summary>
/// Gets the now.
/// </summary>
/// <value>The now.</value>
public string Now { get { return DateTime.Now.ToString("HH:mm:ss"); } }

時刻は24時間表記で取得。

それにしても使用しているアセットが未対応なため .NET 4.x が使えないから冗長な記述が多くて何かムカつきますね…(漢字を使わず、ひらがなとカタカナだけで書かれた文章を見ているようだ)

完成

MascotKashima(重いのでクリックで Gif アニメーション)

この娘ならデスクトップに常にいても問題ない! 使用 CPU は 8% ほど。 今の PC リソースなら痛くもかゆくもない。 しかも時報をしゃべってくれる機能が元々あったので時間を忘れて作業しているととても助かります。

おかげ様で、今ではずっと画面に常駐しています。 時報の時にその場にいなかったときはちょっと残念ですw

あらためて、私は「艦これ」ってやったことも無いので良く知らないのですが、見た目と CV に惹かれて勢いで自分専用のマスコットを作ったことを思い出しましたね~。

時計といえば「ストップウォッチ機能」、「タイマー機能(カップ麺)」、「カウントダウン機能」とかが欲しくなりますね。

使用アセット

NoesisGUI Ver.2.1

時計やコントロールパネルの UI 表示

Final IK


カメラ目線

Desktop Mascot Maker


デスクトップマスコット機能

SALSA With RandomEyes


音声に合わせた口パク、まばたきなど

コメントを残す

メールアドレスが公開されることはありません。