rn.log

備忘録など

【UE4】マテリアルのUVスケールをランダム変更するブループリントを組んでみた

最近、UE4をまじめに勉強し始めました。
ぷちこん提出したい。

マテリアルをコンパイルせずに変えたい

ここからが本題ですが、マテリアルを触っていた時の疑問
「マテリアルをコンパイルせずにテクスチャUVスケールを変えるにはどうすればいいんだろう?」

これを解決するために調べながら作ったものをまとめてみます。

今回作ったもの

今回は勉強がてら、マテリアルのテクスチャUVスケールをランダムに変えるブループリントを組んでみました。

f:id:r-ngtm:20180206113424g:plain

環境

UE4.18.3
テンプレート : Twin Stick Shooter

作成手順

STEP1. UVスケールのfloat値を持ったマテリアルコレクションを用意

STEP2. マテリアル内部でマテリアルコレクションのUVスケールを取得してテクスチャに適用

STEP3. ブループリント側からマテリアルコレクションのUVスケール値をランダムに変更

STEP1. マテリアルコレクションの用意

マテリアルに外部からパラメータを渡すにはマテリアルコレクションを使います。

まずは右クリックからマテリアルコレクションを作成。
f:id:r-ngtm:20180206111744p:plain

マテリアルコレクションの名前はMC_Floorとしておきます。
f:id:r-ngtm:20180206111820p:plain

マテリアルコレクションの設定

マテリアルコレクションにはUVスケール値として2つのfloat値 ScaleXScaleYを追加しておきます。

f:id:r-ngtm:20180206112202p:plain

STEP2. マテリアルの作成

右クリックメニューからマテリアルを作成します。
f:id:r-ngtm:20180206121209p:plain

以下のようなマテリアルを組みました。
f:id:r-ngtm:20180206112322p:plain

マテリアルコレクションのScaleXとScaleYを使ってテクスチャをUVスケールしています。

マテリアル解説

左端にある緑色のノードはCollectionParameterノードです。
STEP1で作成したマテリアルコレクションからfloat値を取得しています。

f:id:r-ngtm:20180206121828p:plain

MakeFloat2ノードを使い、取得したScaleXとScaleYからfloat2を作成しています。
f:id:r-ngtm:20180206112607p:plain

テクスチャのスケールを変更するにはTextureCoordinateノードを使用します。
f:id:r-ngtm:20180206114649p:plain

今回は、マテリアルコレクションを使ってスケール値を変更したいので、ScaleUVsByCenterノードを使って 乗算したものをTextureSampleノードのUVsに入力しています。

STEP3. ブループリントを組む

以下のようなイベントグラフを組みました。
f:id:r-ngtm:20180206115409p:plain
1秒ごとにマテリアルコレクションのScaleXとScaleYを 1~2間のランダムなfloatに設定するイベントグラフです。

ブループリント解説

イベントTickノードにDelayノードをつなげることで1秒ごとにイベントが発火するようにしています。
f:id:r-ngtm:20180206115539p:plain

RandomノードにLerpノードをつなげることで、1-2の間のランダムなfloat値を取得しています。
f:id:r-ngtm:20180206115841p:plain

SetScalarParameterValueノードを使い、マテリアルコレクションMC_Floor内部の変数の値を変更しています。
f:id:r-ngtm:20180206120029p:plain

まとめ

・マテリアルをコンパイルせずにパラメータを変更するにはマテリアルコレクションを使う。
マテリアル内部でマテリアルコレクションにアクセスするにはCollectionParameterノードを使う
・TextureCoordinateノードの出力をパラメータで乗算するにはScaleUVsByCenterノードを使う
ブループリントからマテリアルコレクションを変更するときはSetScalarParameterValueノードを使う。

【プレイ感想】モンハンワールドはストレスが少ない

モンハンワールドを買いました。

まだ3時間しかプレイしていませんが感想を。

良かった点

・テンポ感が良くなった
・マップの単調さが減った

悪かった点

・拠点で迷う
・文字が小さすぎて読みづらい

良かった点

今までのモンハン = 採集のテンポが悪い

個人的に今までのモンハンで一番不満だった点は、採集モーションが長く退屈だということ。

私はPSPのモンハン2ndGから入り、NintendoSwitchのモンハンダブルクロスまでプレイしましたが、

その間採集モーションが全く変わっていません。 


おっさんがしゃがんで素材をかき集める採集モーションは数千、数万回は眺めているんじゃないでしょうか。

同じモーションを眺めるのは正直飽きました

おまけに、モーション完了までの時間が地味に長い


採集モーションを眺めるのは退屈で、苦痛だというのが正直なところです。

今回のモンハン = 採集のテンポが良い 

この退屈な採集モーション、モンハンワールドでは短くなります。

そして素材回収も簡略化され、短いモーションを1回(特殊な素材の場合は数回)見るだけで素材の回収が完了します。

テンポ感が格段に良くなりました。


例えば、今までのモンハンではハチミツ5個集める時に採集を5回繰り返す必要がありました。

モンハンワールドの場合、1回のモーションで全てのハチミツを回収します。

素材をサクサク集めることができるので快適です。

今までのモンハン = マップ移動時にロードが入る

今までのモンハンだとマップ移動時にローディングが入っていました。

マップ1からマップ2へ移動するときにロード、 マップ2からマップ3へ移動するときにもロード。

このロード処理、ロード完了を待つのがなかなかの苦痛です。 

今回のモンハン = マップ移動のロードが無い

モンハンワールドを2時間ほどプレイしてようやく気が付いたんですが、なんとこのモンハンワールド、

ロード処理が皆無です。ゼロ回です。

おそらく、クエスト開始時にマップをメモリに展開するか、ゲームプレイ中に裏で動的にマップをロードしているのでしょうか。

ロード処理がなくなったことによってゲームプレイの没入感が上がったように思います。

ストレスが減って素晴らしい。

今までのモンハン = 移動が退屈

これまでのモンハンシリーズでは、マップの高低差が少ない平たいマップであることが多かったです。

つまり、プレイしていても代わり映えがあまり無いマップになっています。


移動時にプレイヤーがやることは、目的地への最短経路をただ走るだけという単純作業。

モンハンを始めたころはまだ良いですが、繰り返しプレイしていると正直飽きます

移動が退屈で、苦痛で仕方がない。

今回のモンハン = 移動が刺激的

今までのモンハンだと高低差のあまり無い、平たい地形だったので地図を見ていれば道に迷うことはまずありませんでした。

迷わないので、退屈


モンハンワールドの場合、高低差が激しく、かなり複雑な地形になっています。

私は地図を見ていても迷いました

地形が複雑になったことにより、冒険をしている感があって楽しい。

マップの要素が増えた

おまけに、モンハンワールドでは天井には仕掛けがあったり、空中にモンスターがいたり、地面では痕跡があったり、といろんな要素がマップのあちらこちらに散りばめられています。


今までのモンハンと比べてマップ移動時にやることが爆発的に増え飽きさせない作りになっていると感じました。

素晴らしい。

悪かった点

拠点で迷う

初回プレイ時、拠点でクエストの受付嬢がどこにいるのかが分からなくなり、1時間ほど迷ってしまいました。

地図を見ても、受付嬢の居場所が載っていない。

ここがちょっと不親切に感じました。

文字が小さい

プレイに支障をきたすレベルで画面の文字が小さいと思いました。
読めない。

設定メニューから文字サイズを大きき変更できるようにしてほしかったと思いました。

目が悪い人には不親切かも。

「メガネを買え」ということなのかもしれません。

【Unity2018.1】Particle Systemを軽く覗いてみた

Unity2018.1のParticleSystemを軽く覗いてみました。

ParticleSystemの機能のうち、気になったものを紹介していきたいと思います。

環境

Unity2018.1.0b2

WIndows 10

機能その1: パーティクル再生終了時に処理を実行する Stop Action

パーティクルの再生終了時処理を実行する機能です

f:id:r-ngtm:20180115190330p:plain

Stop Actionを使うにはMainモジュールのLoopingのチェックを外しておく必要があります。
(チェックが入っていると再生終了しないため)

詳細

Stop Actionの選択項目は4種類あります。

f:id:r-ngtm:20180115190521p:plain

None = 何もしない
Disable = 再生終了時に自身のGameObjectを非アクティブ化
Destroy = 再生終了時に自身のGameObjectを破棄
Callback = 再生終了時に自身のコールバックを呼び出す

コールバックの使い方

下記スクリプトをParticleSystemにアタッチすると再生終了時にOnParticleSystemStopped()が実行されます。(Stop Action = "Callback"の場合のみ)

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ParticleTest : MonoBehaviour
{
    void OnParticleSystemStopped()
    {
        Debug.Log("OnParticleSystemStopped");
    }
}

機能その2:パーティクルの初期色にテクスチャを使う

パーティクルのテクスチャを使用して設定できるようになりました。

f:id:r-ngtm:20180115191218p:plain

これを使うとテクスチャから湧き出るようなエフェクトが作れます。

f:id:r-ngtm:20180115184600g:plain


魔法陣エフェクトとかも簡単に作れそう。いろいろ応用がききそうな機能です。

f:id:r-ngtm:20180115185013g:plain

iPhoneXのアルファ抜きフレーム画像

iPhoneXの開発時にあると便利そうなフレーム画像。

探しても全然見つからないのでPhotoshopでサクッと作ってみました。

汎用性が高そうなので公開します。

たて (Portrait)

1125 x 2436 ピクセル

よこ (Landscape)

2436 x 1125 ピクセル

【Windowsコマンド】複数のMSペイントをまとめて消す

はじめに

私はMSペイントを使ってスクリーンショットの切り抜きをよくやるのですが、大量のMSペイントを起動してしまうことがよくあります。

MSペイントを大量に起動してしまった場合、これらをマウス操作で消していくのはなかなか大変です。

今回の記事では複数のMSペイントをコマンド一発で全部まとめて消す方法を紹介します。

MSペイントの厄介な敵 : 保存確認ダイアログ

MSペイントですが、閉じようとすると保存確認ダイアログが表示されてしまいます。 

f:id:r-ngtm:20180109163713p:plain

MSペイントを1,2個起動しているだけならまだいいですが、10、20個も起動してしまった場合は厄介です。

「保存しない」を10回も20回もクリックしないと全てのMSペイントを閉じられない。 面倒くさい。

コマンドを使うと全部まとめて消せる

「保存なんてしなくていいから全部まとめて消したい!

という場合はtaskkillコマンドを使うと複数のMSペイントを一気に消すことができます。

STEP1. コマンドプロンプトを素早く起動

「ファイル名を指定して実行」ウィンドウに cmd と入力するとコマンドプロンプトが起動できます。

f:id:r-ngtm:20180109170228p:plain:w250

Win + X を押した後 R を押すと「ファイル名を指定して実行」ウィンドウを手早く起動できます。

STEP2. taskkillコマンドでMSペイントをまとめて消す

以下のコマンドを実行すると実行中のすべてのMSペイントを強制終了します。

taskkill /im mspaint.exe /f

参考: Windowsでプロセスを強制終了するコマンド

Unityのフォルダ構成について考えてみる

Unityでゲームを作るとき、どのようなフォルダ構成でアセットを管理するか悩みどころです。

フォルダ構成が悪いと開発効率が落ちてしまいます。

「アセットはどのようなフォルダ構成にすれば良いのだろうか?」 という問に関して考えられるフォルダ構成をいくつかご紹介したいと思います。

基本方針

以下を基本的な方針とします。
・アセットストアからインポートするアセットはAssets直下に配置
・開発中のゲームで使用しているアセットはProjectフォルダの中に配置

f:id:r-ngtm:20171219112832p:plain:w512

Project/以下をどう分けるべきか

シーン、スクリプト、テクスチャなどのアセットはProjectフォルダ以下に入れることになりますが、

ここで問題となるのが、これらのアセット群をどのようなフォルダ構成にするかです。

・・・ むずかしい


3つの方法

悩みに悩んだ結果、これがよさそうだなぁという結論にたどり着きました。

そこで、考えられるフォルダ構成を3つ、今回は紹介したいと思います。

・方法1 : アセット単位でフォルダを作る

・方法2 : シーン単位でフォルダを作る

・方法3 : 音素材、デザイン素材、プログラム素材という区分でフォルダを作る

方法1. アセットの種類でフォルダを作る

アセットの種類ごとにフォルダを作ろうという思想です。

f:id:r-ngtm:20171219113353p:plain

文章で説明すると、

・シーンはSceneフォルダの中に配置

・シーンで使用するスクリプトは Scriptsフォルダの中へ配置

という管理方法です。

メリット: アセットの場所が分かりやすい

アセット群を種類で分けることのメリットは、アセットがどこにあるかが分かりやすくなるという点にあると思います。

さらに、その中でシーン別に分けることによりそのアセットがどのシーンで使われているのかも分かりやすくなります。

例えば、SceneAで使用されているテクスチャを差し替えたい場合はAssets/Project/Textures/SceneA の中だけを触れば良いので 分かりやすい。

デメリット : 同名フォルダを複数作る必要が出てしまう

この方法ですが管理が面倒くさいというデメリットがあります。

例えば、新しくシーンを作成しようとした場合などに手間がかかります。


Hogeシーンを作る場合

Assets/Project/の中にScenes/, Scripts/, Textures/フォルダが存在する場合を考えます。
Hogeシーンを作る場合以下の作業が必要になります。

  1. Assets/Project/Scenesフォルダ以下にHoge.unityを作る
  2. Assets/Project/Scriptsフォルダ以下にもHogeフォルダを作る
  3. Assets/Project/Texturesフォルダ以下にもHogeフォルダを作る

同じ名前のフォルダを複数作成する必要が出てきてしまい、これは若干面倒です。

シーンの名前変更も手間がかかる

このHogeシーンですが、名前を変えてFugaシーンに変えようとした場合にも手間がかかります。

複数あるHogeフォルダを一つ一つFugaへとリネームするという作業が必要になります。
これも面倒くさい

方法2. シーン単位でフォルダを作る

二つ目の方法は、
「アセット群をシーン単位でまとめてしまおう」
という考え方です。

f:id:r-ngtm:20171219113422p:plain:w450

シーン単位でまとめることにより、シーンと同名のフォルダを作る作業が要らなくなります。

細かい補足をすると、

・シーンアセットは Assets/Project/[シーン名]/ の中に入れる

・シーンで使用するスクリプトAssets/Project/[シーン名]/Scripts/ の中に入れる

・シーンで使用するテクスチャは Assets/Project/[シーン名]/Textures/ の中に入れる

全てのシーンで使用するスクリプトをまとめたい場合は、
Assets/Project/_Common/Scripts/というフォルダを作りその中に入れます。

メリットその1 : シーン名のフォルダは1つだけ

方法1.のデメリットとして、「シーンに対応する同名フォルダが複数必要になる」というものがありましたが、
方法2.ではシーンに対応するフォルダは1つだけで済みます。

同じ名前のフォルダを何個も作る、という面倒くさい作業はしなくて済みます。 楽です。

メリットその2 : アセット群が一か所にまとまる

この方法でアセット管理をする場合、シーンデータとシーン内で使用されているデータ群が近い場所に配置されます。
関連の強いアセット群が近い場所に配置されることにより管理がしやすいというメリットがあります。

例えば、Hogeシーンで使用しているスクリプトを編集する場合はシーンファイルの近くにあるScripts/フォルダ以下を見れば良いので
管理が楽です。

メリットその3 : 素材とシーンとの関係が分かりやすい

例えば、SceneAで使用されているテクスチャを差し替えたい場合はAssets/Project/SceneA/Textures の中だけを触れば良いので 分かりやすい。

デメリット : 同種アセットが分散してしまう

・同系統のファイルが 分散 してしまう。

例えば、Gameシーンで使用しているテクスチャはAssets/Project/Game/Texturesフォルダの中。 Titleシーンで使用しているテクスチャは Assets/Project/Title/Texturesフォルダの中。といった感じで ファイルが離れたところに置かれてしまいます。

テクスチャの差し替えをしたいとなった場合、これはちょっと手間が多いです。

方法3. 音、デザイン、プログラム単位でフォルダを作る

以下のようなフォルダ構成にします。
f:id:r-ngtm:20171219113445p:plain:w500

Designフォルダ

pngや3DモデルやFontなどのファイルはすべてデザイン素材というくくりにして

Assets/Project/Design/ 以下にそのまま入れます。

Design/以下はどのようなフォルダ構成になっていてもOKです。シーン構成と対応付ける必要はありません。

Audioフォルダ

mp3,wavファイルなどの音声ファイルはオーディオ素材というくくりにして

Assets/Project/Audio/ 以下に入れます。

これも好きな適当なフォルダ構成でも大丈夫です。シーン構成を意識する必要は皆無です。

Programフォルダ

スクリプト、シェーダー、Prefab、Scene、ScriptableObjectなどは プログラム素材 というくくりにして

Assets/Project/Program/[シーン名]/ 以下に入れます。

Program以下ではシーン構成を意識したフォルダ構成にします。

例えばGameシーンは Assets/Project/Program/Game/Game.unity としてシーンアセット(.unity)を配置します。

Gameシーンで使用するスクリプトAssets/Project/Program/Game/Scripts/ の中へ入れます。

Prefabはプログラム素材なの?

Prefabは内部的には画像ファイルや音声データといったリソースの参照を持っているだけです。

つまり、スクリプトやScriptableObjectと似たようなもので、「Prefabもプログラム素材である」というとらえ方をして問題ないのではないかと個人的に考えています。

mp3やwav = オーディオ素材
pngやfbx = デザイン素材
それ以外 = プログラム素材

という分け方をしても困らない、というのが自分の考えです。

方法3のメリット: 素材の管理がしやすい

方法3.は素材が差し替えやすい、というメリットがあります。


デザイン素材はDesignフォルダにまとめてあるので、差し替える場合はこの中だけ触れば良い。

サウンド系素材を差し替えたい場合はAudioフォルダ。

方法3 は 方法1 と 方法2 のいいとこ取り

方法2.のデメリットとして挙がっていた「同系統の素材が離れた位置に置かれてしまう」ですが、
方法3ではこれを解消しています。

むしろ、方法3は方法1と方法2のいいとこ取り、といった感じでしょうか。
プログラム系のアセットは方法2をそのまま採用しつつ、音やデザイン素材はそれとは別に一か所にまとめてしまう。

私は方法3が好きです。

方法3のデメリット : 素材とシーンの関連が分かりにくい。

方法3のデメリットとしては「シーンとデザイン素材の関連が分かりにくい」というのが考えられます。

方法2ではシーンデータと素材は近い場所に配置されていたため、関連が分かりやすいという利点がありました。

一方、方法3の場合はシーンデータと素材が離れた場所に配置されてしまうので、方法2と比べてシーンと素材との間の関連が分かりにくいというデメリットがあります。

素材の数が増えてきた場合は シーンと同名フォルダを作り、その中に素材をまとめるという形がやりやすいと思います。

f:id:r-ngtm:20171219214204p:plain:w500

まとめ

これまでに3つのフォルダ構成を紹介しましたが、どれも一長一短という印象です。
ゲームに応じて最適なフォルダ構成というのは変わるのではないかと思いました。

自分は方法3.が好きです。

【仕事効率化】Microsoft To-Doが便利なので褒めてみる

Microsoft To-Do というアプリをご存知でしょうか?

Microsoft社がリリースしているTodo管理アプリです。

ferret-plus.com

このアプリ、とても使い心地が良くて自分は毎日使っています。


今回の記事では、Microsoft To-Doを使っていて便利だなと思ったポイントを紹介したいと思います。

ちなみに、Microsoft To-Doの対応プラットフォームはWindows/iOS/Androidなど。

お品書き

タスクがアカウントと紐づく

「今日の予定」機能

タスクの追加/削除が快適(iOS)

今日の予定の管理が快適(iOS)

タスクのカテゴリー分け機能も充実

タスクのレビュー機能

便利ポイントその1: タスクがアカウントと紐づく

クラウド上で管理されるタスク

Micorosoft To-Doで入力したタスクはMicosoftアカウントと紐づき、クラウド上で管理されます。

例えば以下のような使い方ができます。

自宅のWindowsマシンでタスクを入力して、外出先ではiPhoneを使ってタスクを見る。
外出先でiPhoneでタスクを入力して、自宅のWindowsマシンで見る。

これは便利です。

バイスや場所に縛られないところがイイですね。

快適です。

バイスが壊れても安心

WindowsマシンやiPhoneが仮にぶっ壊れたとしても、入力したタスクは消えません
安心です。

場所に応じたタスク管理ができる

タスクがアカウントに紐づいているおかげで場所に応じたタスク管理をする、といったこともできます。

プライベートなタスクはプライベートなMicorosoftアカウント管理でタスク管理。
仕事のタスクは仕事用MicrosoftアカウントでTodo管理。

このように目的に応じてアカウントを使い分けることで、場所に応じたタスク管理をすることができます。

便利ポイントその2:「今日の予定」機能

続いてご紹介したいのが、「今日の予定」機能です。

「今日の予定」機能を使うと無数にあるタスクの中から必要なものだけを リストアップすることができます。
効率の良いタスク管理が可能となります。

タスクの数が増えると出てくる問題

Todoアプリを使っているとついやってしまうのが、

「あれもやろうこれもやろう」

と思ってタスクを 追加しすぎてしまう事。


これをやっているとタスクの数が増えすぎて

「今日はどのタスクをやるの?」

というのがだんだん見えなくなってきてしまいます。

タスクが多すぎて訳が分からないToDoリスト

ちなみに、自分のTodoリストにはタスクが100個以上あります。
f:id:r-ngtm:20171218195408p:plain:w240

「どれから手を付ければいいの? もう、わけがわからないよ・・・」



こんな場合に役に立つのが 「今日の予定」 機能です。

今日の予定機能が便利

今日の予定へ追加したいタスクを選ぶ

過去に入力した大量のタスクを見返しながら、

「今日はこのタスクをやるか」

というものだけを選び、これを「今日の予定」に追加します。


今日の予定へ追加したタスクを見る

追加したタスクは「今日の予定」リストから見ることができます。

これにより、今すぐやりたいタスクだけを「今日の予定」として洗い出すことができ、
今日は何をするかの計画を立てやすくなります。


これは便利です

Todoの抱える問題を解決した「今日の予定」機能

Todoリストには

「タスクの数が増えると見返すコストも増える
「タスクの数を制限するとメモしきれない

といった問題がありますが、


Microsoft To-Doの「今日の予定」機能はこれらの問題を一手に解決しています。


これぞ 「アイデア というやつですね。スゴイです。

便利ポイントその3: タスクの追加/削除が快適(iOS)

アプリの起動直後に現れる入力画面

アプリを起動すると最初に現れるのが、タスクの入力欄とタスクの一覧です。

入力画面が最初に出てくるおかげで、アプリを起動してすぐにタスク入力に移ることができます。
これは快適です。

余計な操作が不要

よくあるTodoアプリでは、アプリを起動してからタスク入力までになんらかの操作が必要だったりしますが、

Microsoft To-Doの場合はアプリを起動してすぐに入力に移ることができます。

これが素晴らしい。

操作が少ない = 快適 (重要)

Todoアプリは繰り返し使う道具です。

たった1回の余分な操作も、積もり積もれば数千回・数万回の操作になってしまいます。
面倒くさい。

人はストレスがたまる道具は使いたくないものです。

アプリ起動からすぐに入力に移れるというのはストレスが少なく、素晴らしいことだと思います。

便利ポイントその4: 今日の予定の管理が快適 (iOS)

タスクの追加が楽

タスクを右へドラッグすることで今日の予定への追加や今日の予定からの削除ができます。
f:id:r-ngtm:20171213110144g:plain

タスクを触りながら、指を右へ少し動かすだけ。 とても快適です。

タスク削除も快適

左へドラッグするとタスクそのものを削除されます。
f:id:r-ngtm:20171213113042g:plain

快適です。

便利ポイントその5 タスクのカテゴリー分け機能も充実

Micorosoft To-Doには3種類のリストが用意されています。

  1. 「今日の予定」リスト
  2. To-Doリスト
  3. 自作リスト

自分の使い方

  1. タスクは追加先は考えず、忘れないうちにリストに追加しておきます。
    追加先は「今日の予定」か「To-Do」リストです。

  2. リストの中身が増えてきたら自作リストに追加し、カテゴリー分けします。

便利ポイントその6: タスクのレビュー機能

消化しきれなかったタスクを教えてくれる

今日の予定には追加したものの消化しきれずに放置されてしまったタスクがあったとします。

Micorosoft To-Doはなんとそのタスクをリストアップしてくれます。

タスクの消化忘れもこれで防げそうです。
消化しきれなかったタスクだけでなく、過去に追加したタスクをピックアップして表示してくれたりもします。

「そういえばこのタスクがあったなぁ」とか思い出すことも。
レビュー機能便利です。

終わりに

筆者はAndroid端末を持っていないので、AndroidアプリのMicrosoft To-Doをまだ試すことができていません。

しかし Microsoft To-Doが素晴らしいアプリであることには変わりはないでしょう。