MRが楽しい

MRやVRについて学習したことを書き残す

Unityでasync/awaitを使う

本日は Unity の技術調査枠です。
以前、Windows-universal-samples を HoloLens 上で試してみました。
bluebirdofoz.hatenablog.com

さて、いざ Unity に取り込んでこのコードを利用しようとしたところ、async/await が利用できない問題が発生しました。
例えば、以下のようなコードを作成するとUnityのビルドでエラーが発生します。
・AwaitTests01.cs

public class AwaitTest01 : MonoBehaviour {
    // Use this for initialization
    void Start ()
    {
        awaitasync();
    }
    public async void awaitasync()
    {
        Debug.Log("message");
    }
}

f:id:bluebirdofoz:20171227004507j:plain
エラーメッセージには「Feature 'asynchronous functions' cannot be used because it is not part of the C# 4.0 language specification」というメッセージが表示されています。

'asynchronous functions'の機能は C#4 じゃ使えないというエラーのようです。
しかし調べてみると、Unity 2017 は C# 6 に対応しているとの情報がありました。
qiita.com

では何故使えないかというと、現状、Unity 側のデフォルト設定が .NET 3.5 のままらしい。
メニューから Edit -> Project Settings -> Player でプロジェクト設定を開きます。
f:id:bluebirdofoz:20171227004601j:plain

デフォルトだと以下の通り、「Stable(.NET 3.5 Equivalent)」が選択されているので「Experimental(.NET 4.6 Equivalent)」に変更します。
f:id:bluebirdofoz:20171227004615j:plain

Unity を再起動すると……。
f:id:bluebirdofoz:20171227004624j:plain
エラーが消えました。Unity プロジェクトで C# 5 以降のコードを利用する際はこの変更を行う必要があります。

因みに、上記のエラーを解決しても Script を VisualStudio で開くと以下のようにエラーが表示されます。
f:id:bluebirdofoz:20171227004702j:plain

これは生成される VisualStudio のプロジェクトファイルに 4 が書き込まれているためです。
プロジェクトディレクトリにある csproj ファイルをテキストエディタで開きます。
f:id:bluebirdofoz:20171227004719j:plain

以下の の設定を 6 に変更します。
・T_CodeTestProject.CSharp.csproj

<LangVersion Condition=" '$(VisualStudioVersion)' != '10.0' ">6</LangVersion>

この状態で再び Script を VisualStudio で開くとエラーが解消されています。
f:id:bluebirdofoz:20171227004727j:plain

Blender標準テクニック[ローポリキャラクター制作で学ぶ3DCG]を試す その21(ツールシェルフでのプロパティ設定)

本日は書籍「Blender標準テクニック[ローポリキャラクター制作で学ぶ3DCG]」の実施枠です。

体のモデリングの続きです。
f:id:bluebirdofoz:20171226230525j:plain
今回はバストを作成していきます。

胸の部分の頂点を選択し、Delキーで削除を行います。
f:id:bluebirdofoz:20171226230533j:plain

基礎として 追加 -> UV球 を追加します。
f:id:bluebirdofoz:20171226230550j:plain

このとき、追加を確定するまでツールシェルフにUV球のプロパティ設定欄が表示されます。
そのままだとポリゴンが細かいので、セグメント数とリング数を 8 に設定してポリゴン数を調節します。
f:id:bluebirdofoz:20171226230619j:plain

後は角度を調節し、頂点を結合すれば完了です。
f:id:bluebirdofoz:20171226230635j:plain
ひとまず素体モデルが完成しました。次回からは衣装を作り込んでいきます。

Blender標準テクニック[ローポリキャラクター制作で学ぶ3DCG]を試す その20(メッシュの複製)

本日は書籍「Blender標準テクニック[ローポリキャラクター制作で学ぶ3DCG]」の実施枠です。

体のモデリングの続きです。
f:id:bluebirdofoz:20171225000720j:plain
今回は手足を作成していきます。

まずは足の作成です。こちらは特に新しい技術要素はありません。
押し出し(Eキー)とループカット(Ctrl+R)を利用して足部分を作成します。
f:id:bluebirdofoz:20171225000733j:plain
後々ハイヒール型の靴を履かせるため、大まかな輪郭作成に留めます。

続いて手の作成です。まずは手の平の部分を作成します。
f:id:bluebirdofoz:20171225000753j:plain

手の股の部分は切り裂きフィル(Alt+Vキー)を使うと良い感じで面を増やせます。
f:id:bluebirdofoz:20171225000803j:plain

次に指を作成します。基礎として頂点数6の円を追加します。
f:id:bluebirdofoz:20171225000814j:plain

押し出しを利用して、指の形を作ります。
指はアニメーション時に曲げる必要があるため、関節部分の分割を多めにしておきます。
f:id:bluebirdofoz:20171225000823j:plain

他の指も作成しますが、ここで作成した指をコピーすることで作業量を減らします。
コピーを行うメッシュを選択して、Shift+D キーで以下のようにメッシュが複製できます。
f:id:bluebirdofoz:20171225000832j:plain

後は指の大きさを調節し、手の平の頂点と結合すれば親指以外の指が作成できました。
f:id:bluebirdofoz:20171225000844j:plain

最後に親指を作成して、手のモデリングは完了です。
f:id:bluebirdofoz:20171225000856j:plain
親指は他の指と間接の角度が異なることに注意します。

DirectXをオフラインでインストールする

本日はMMDの環境構築手順についてです。
以下の MMD の取り込み方法まとめを発表した際、MMD環境構築説明の手順で DirectXインストーラがオフラインで利用できないという問題が発生しました。
bluebirdofoz.hatenablog.com
bluebirdofoz.hatenablog.com

解決方法について調査したのでまとめておきます。

MMDの起動には以下の3つのランタイムのインストールが必要です。
Download Microsoft Visual C++ 2008 再頒布可能パッケージ (x64) from Official Microsoft Download Center
Download Microsoft Visual C++ 2010 再頒布可能パッケージ (x64) from Official Microsoft Download Center
Download DirectX エンド ユーザー ランタイム Web インストーラ from Official Microsoft Download Center

このうち、DirectXインストーラのみはオフラインでの利用ができません。
オフラインでインストールを実施する場合、以下のインストーラを利用する必要があります。
Download DirectX End-User Runtimes (June 2010) from Official Microsoft Download Center

オフラインでインストールを実施してMMDが起動できるか確認してみます。
まずは DirectX のランタイムをインストールしていないPCに MMD をインストールします。
f:id:bluebirdofoz:20171224234924j:plain

試しに MikuMikuDance.exe を実行してみます。
f:id:bluebirdofoz:20171224234933j:plain
DirectX の DLL が見つからない旨のエラーが発生します。

ではランタイムをインストールします。
手順通り、Microsoft Visual C++ のランタイムをインストール後、DirectX End-User Runtimes で取得したインストーラを実行します。
f:id:bluebirdofoz:20171224234950j:plain

解凍場所の指定を求められます。どこでも良いので今回はインストーラディレクトリに直接展開します。
f:id:bluebirdofoz:20171224235004j:plain

以下のように DirectX の DLL が指定ディレクトリに展開されます。
f:id:bluebirdofoz:20171224235038j:plain

今回、MMD がエラーメッセージで要求していたのは「d3dx9_43.dll」の DLL でした。
展開されたディレクトリから d3dx9_43.dll を検索して探し出します。
f:id:bluebirdofoz:20171224235012j:plain

MMD が参照できれば良いので、MikuMikuDance.exe の実行ディレクトリに d3dx9_43.dll をコピーします。
f:id:bluebirdofoz:20171224235048j:plain

この状態で MikuMikuDance.exe を実行すると……。
f:id:bluebirdofoz:20171224235059j:plain
MMD が起動しました。成功です。

HoloToolkitのFPSDisplayを利用してFPSを確認する

本日は HoloToolkit の調査枠です。
先週、品川で行われた HoloLens ミートアップに参加してきました。
そこで HoloToolkit には「FPSDisplay」というアプリのフレームレートを簡単に確認する prefab があるという話を聞きました。
今回はこの「FPSDisplay」を試してみます。

因みにその講座の内容は以下に公開されています。
他にも参考となるノウハウが多くあるので、一通り読んでみるのをオススメします。

www.slideshare.net

資料にある「FPSDisplay」の紹介記事は以下です。
blog.nextscape.net

早速試してみます。今回試す環境は Unity2017.2, HoloToolkitv1.2017.2.0 になります。
「FPSDisplay」は HoloToolkit/Utilities/Prefabs 配下にあります。
f:id:bluebirdofoz:20171223223540j:plain

prefab をドラッグ操作で Hierarchy にセットします。
f:id:bluebirdofoz:20171223223551j:plain

後は表示位置とフォントを調整します。
f:id:bluebirdofoz:20171223223602j:plain

FPSDisplay はワールド座標型のUIなので以下のような形で既存のパネルに重ねることもできます。
表示位置を固定したい場合は自動で追従移動しないように Tagalong と Billboard スクリプトを無効化しておきます。
f:id:bluebirdofoz:20171223223610j:plain

HoloLens でアプリを起動すると……。
f:id:bluebirdofoz:20171223223618j:plain
FPSが表示されました。これはお手軽ですね。
今回は常時、赤フォントとしましたが、FPSの値によって色を変えるスクリプトを用意するとより見やすいかもですね。

hololensアプリでXML設定ファイルの操作を行う その2(書き込み)

本日は HoloLens の技術調査枠です。
前回、HoloLens での設定ファイル読み込みについて調査を行いました。
今回は書き込み動作について確認を行います。
bluebirdofoz.hatenablog.com

前回作成したスクリプトに以下のファイル書き込み処理を追加します。
・AppSettingManager.cs

/// <summary>
/// アプリ設定書き込み(XML)
/// </summary>
/// <returns>書き込み成否</returns>
public bool XMLWrite()
{
    Debug.Log("XMLWrite");

    // 書き込み成否
    bool ret = false;

    // オブジェクトの型を指定して Serializer オブジェクトを作成する
    System.Xml.Serialization.XmlSerializer serializer;
    serializer = new System.Xml.Serialization.XmlSerializer(typeof(AppSettings));

    // ディレクトリの存在確認
    if (System.IO.Directory.Exists(SettingFileDirectoryPath()) == true)
    {
        // 書き込みファイルを開く
        System.IO.StreamWriter streamwriter;
#if WINDOWS_UWP
        // 書き込みファイルを開く(UWPアプリではStreamWriter(filepath)メソッドは使用不可)
        streamwriter = new System.IO.StreamWriter((System.IO.Stream)System.IO.File.OpenWrite(XMLFilePath()));
#else
        // 書き込みファイルを開く
        streamwriter = new System.IO.StreamWriter(XMLFilePath(), false, new System.Text.UTF8Encoding(false));
#endif

        // シリアル化してXMLファイルに保存する
        serializer.Serialize(streamwriter, p_AppSettings);

#if WINDOWS_UWP
        // ファイルを閉じる(UWPアプリではClose()メソッドは使用不可)
        streamwriter.Dispose();
#else
        // ファイルを閉じる
        streamwriter.Close();
#endif

        // 書き込み成功
        ret = true;
    }
    return ret;
}

確認用にアプリの起動回数を記述するタグと表示を追加します。
f:id:bluebirdofoz:20171222091233j:plain
・AppSettingManager.cs

/// <summary>
/// 設定ファイル構造クラス
/// </summary>
public class AppSettings
{
    /// <summary>
    /// アプリ実行カウント
    /// </summary>
    public int ExecuteCount;
    /// <summary>
    /// アプリ表示メッセージ
    /// </summary>
    public string Message;
}

前回作成した処理部分に、起動と同時にカウンタを読み込み、インクリメントして書き出す処理を追加します。
・PanelTextController

/// <summary>
/// カウント出力ゲームオブジェクト
/// </summary>
public GameObject CountTextObject;

/// <summary>
/// カウントテキストUI
/// </summary>
private UnityEngine.UI.Text p_CountText;

/// <summary>
/// 初期化関数(Start)
/// </summary>
void Start ()
{
    // カウントテキストUI参照の取得
    p_CountText = CountTextObject.GetComponent<UnityEngine.UI.Text>();
    // メッセージテキストUI参照の取得
    p_MessageText = MessageTextObject.GetComponent<UnityEngine.UI.Text>();
    // アプリ設定マネージャの取得
    p_AppSettingManager = AppSettingsObject.GetComponent<AppSettingManager>();
    // アプリ設定の取得文字列をテキストに反映
    p_MessageText.text = p_AppSettingManager.GetAppSettings().Message;
    // アプリ設定のカウントのインクリメント
    p_AppSettingManager.GetAppSettings().ExecuteCount++;
    // アプリ設定のカウントをテキストに反映
    p_CountText.text = "EXE_COUNT : " + p_AppSettingManager.GetAppSettings().ExecuteCount;
    // アプリ設定を書き出す
    p_AppSettingManager.XMLWrite();
}

最後にスクリプトにテキストオブジェクトの参照を渡し、 Assets/StreamingAssets ディレクトリに以下のXMLファイルを配置します。
・settings.xml

<?xml version="1.0" encoding="utf-8"?>
<AppSettings xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <ExecuteCount>0</ExecuteCount>
  <Message>Hello World</Message>
</AppSettings>

f:id:bluebirdofoz:20171222091247j:plain

アプリを起動すると、カウントが表示されます。
f:id:bluebirdofoz:20171222091256j:plain
この後、settings.xml を確認してみると……。
・settings.xml

<?xml version="1.0" encoding="utf-8"?>
<AppSettings xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <ExecuteCount>1</ExecuteCount>
  <Message>Hello World</Message>
</AppSettings>

起動回数「1」が書き込まれていました。成功です。

続けて HoloLens 上での動作についても確認します。
試しに、起動・停止を繰り返すと3回目の起動時には……。
f:id:bluebirdofoz:20171222091307j:plain
起動カウントが「3」回になっています。成功しました。
設定ファイルの他、アプリの状態保持にも使えそうです。

SharingServiceをコマンドプロンプトから起動する

本日は HoloToolkit の調査枠です。
サーバサービス型のシェアリングを実施する際には、サーバPCで SharingService を起動する必要があります。
bluebirdofoz.hatenablog.com

通常だと HoloToolkit を読み込んだ Unity のメニューから MixedRealityToolkit -> Sharing Service -> Launch Sharing Service でサービスを起動します。
f:id:bluebirdofoz:20171221000610j:plain
この SharingService の起動について、Unity を介さず、コマンドベースで実施したい機会があったので実行方法を調査しました。

SharingService.exe は Unity プロジェクトの (プロジェクトディレクトリ)\External\HoloToolkit\Sharing\Server 配下に配置されています。
f:id:bluebirdofoz:20171221000624j:plain

本EXEファイル単体で実行可能なので、これを任意のディレクトリに配置し、Shift + 右クリックで PowerShell を起動します。
f:id:bluebirdofoz:20171221000638j:plain

以下のコマンドを実行すると、単体で SharingService を実行可能です。

.\SharingService.exe -local

f:id:bluebirdofoz:20171221000738j:plain