20191023のUnityに関する記事は12件です。

脱出ゲームの作り方 6 アイテム使用による電球のONOFF

これまでの作業で、

■A.DrawerPnelで引き出しがクリックされたら電球画像を表示し、
ItemBoxに電球を取得する処理を作成した

1.DrawerPnelで引き出しがクリックされたら、電球画像を表示する
脱出ゲームの作り方 2
◇TriggerButtonを押したら電球パネルとテキストを表示

DrawerManager.rb
public void OnClickTrigger()
    {
        LightBulbSetActive(true);
    }

2.上記1.と同時に、ItemBoxに電球の画像を表示する
脱出ゲームの作り方 4
◇itemに電球のデータが取得されたら、電球の画像を表示する

DrawerManager.rb
public void OnClickTrigger()
    {
        LightBulbSetActive(true);
        itemBoxManager.SetItem(ITEM.LIGHT_BULB);
    }

■B.LightstandPanelで、ItemBoxの1つ目と2つ目をクリックして電球をON/OFFするテストをした
脱出ゲームの作り方  5
テスト
Unityエディタで
1つ目のItemBoxの On Click() にLightSwitch()をtrueで設定 :電球が点灯
2つ目のItemBoxの On Click() にLightSwitch()をfalseで設定 :電球が消灯

※設定を解除するときは、On Click()のマイナス(-)ボタンで削除する

アイテムボックスに取得した電球を使うと、電球が点灯する処理を作成する

◇ItemBoxManagerに処理を追加する

アイテムを使用する関数UseItem()に、
アイテムボックスに電球があったら、電球を使用してライトスタンドを点灯する処理

LightStandManagerスクリプトを使えるようにする

:interrobang:
LightStandManager(型)、 lightStandManager(変数)??
※エディタでItemBoxPnel(オブジェクト)を選択すると、InspecterのItemBoxManagerスクリプトに
LightStandManagerが出る
スクリプトを変数のように扱って、他のスクリプトで使えるようにする?

ItemBoxManager.cs
   [SerializeField] LightStandManager lightStandManager;

アイテムが電球だったら、
lightstandManagerスクリプトのLightSwitch()関数をtrueで実行する
それ以外は何もしない

ItemBoxManager.cs
    public void UseItem(int index)
    {
        switch (itemList[index])            //アイテムが電球だったら、
        {
            case ITEM.LIGHT_BULB:
                lightstandManager.LightSwitch(true);     //LightSwitch()をtrue
                break;
            default:                                    //それ以外は何もしない
                break;
        }
        itemList[index] = ITEM.NONE; // index番目のアイテムを使用したので空にする;
        itemBoxImages[index].sprite = null; //index番目に何も表示しない
    }

※UseItem(int index)の引数は、itemBoxの番号に対応している

◇Unityエディタで

ItemBoxPnel(オブジェクト)を選択し、InspecterでのItemBoxManagerスクリプトに
LightStandManager
が出ているので、ItemBoxPnel(オブジェクト)をセットする

その下の、4つのItemBoxを全部選択し、
InspectorでItemBoxのButtonコンポーネントの On Click() にItemBoxPanel(オブジェクト)をセットして、
ItemBoxManagerに表示される関数をからUseItem(int)を設定する。
4つの各ItemBoxについて、UseItem(int)の引数(0,1,2,3)を設定して、
ItemBoxと使うアイテムを対応させる

:interrobang:
どのオブジェクトにどのスクリプトをアタッチしたかを一覧で見る方法?
ボタンコンポーネントに、スクリプトを作成した関数を選択するためにオブジェクトを設定するときにわかりにくくなってしまう

:interrobang:自分の課題
各オブジェクト
オブジェクトにアタッチしたスクリプト
スクリプトで作成した変数、関数
Inspectorで変数や関数を設定する
これらのつながりを整理する

教材

Unityゲームスタジオ スタジオしまづ
【Unity】初心者からの脱出!? 脱出ゲームの作り方 その6 アイテム使用による電球のONOFF
https://youtu.be/Z4uJWBRvGhk

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

UnityのQuaternionとVector3を手書きで変換した件について

初めに

仕事でunityで行っていた機能をc++で書いているサーバに引っ越すことになりその際に調べたので備忘録として書いてます。
ちなみにQuaternionとVector3の変換は扱っている座標系などによって異なるためいくつか種類があります。ここではUnityで動いているものを基準に書きます。unityは(pitch,yaw,roll)=(x,y,z)で回転順はZXYです。
理由など詳しいこと調べたい方向けというよりは答えが知りたい人向けです。(理解してないなんていえない・・・)

QuaternionからVector3への変換

Vector3 Quaternion_to_Vector3(Quaternion r)
{
    float x = r.x;
    float y = r.y;
    float z = r.z;
    float w = r.w;

    float x2 = x * x;
    float y2 = y * y;
    float z2 = z * z;

    float xy = x * y;
    float xz = x * z;
    float yz = y * z;
    float wx = w * x;
    float wy = w * y;
    float wz = w * z;

    // 1 - 2y^2 - 2z^2
    float m00 = 1.f - (2.f * y2) - (2.f * z2);

    // 2xy + 2wz
    float m01 = (2.f * xy) + (2.f * wz);

    // 2xy - 2wz
    float m10 = (2.f * xy) - (2.f * wz);

    // 1 - 2x^2 - 2z^2
    float m11 = 1.f - (2.f * x2) - (2.f * z2);

    // 2xz + 2wy
    float m20 = (2.f * xz) + (2.f * wy);

    // 2yz+2wx
    float m21 = (2.f * yz) - (2.f * wx);

    // 1 - 2x^2 - 2y^2
    float m22 = 1.f - (2.f * x2) - (2.f * y2);


    float tx, ty, tz;

    if (abs(m21 - 1.f) < 0.000001f)
    {
        tx = M_PI / 2.f;
        ty = 0;
        tz = atan2(m10, m00);
    }
    else if (abs(m21 + 1.f) < 0.000001f)
    {
        tx = -M_PI / 2.f;
        ty = 0;
        tz = atan2(m10, m00);
    }
    else
    {
        tx = asin(-m21);
        ty = atan2(m20, m22);
        tz = atan2(m01, m11);
    }

    tx = tx / M_PI * 180;
    ty = ty / M_PI * 180;
    tz = tz / M_PI * 180;

    Vector3 res;
    res.x = tx;
    res.y = ty;
    res.z = tz;

    return res;
}

Vector3からQuaternionへの変換

Quaternion Vector3_to_Quaternion(Vector3 rot)
{
    float x = rot.x * M_PI /180.f;
    float y = rot.y * M_PI /180.f;
    float z = rot.z * M_PI /180.f;

    float c1 = cos(x * 0.5f);
    float c2 = cos(y * 0.5f);
    float c3 = cos(z * 0.5f);

    float s1 = sin(x * 0.5f);
    float s2 = sin(y * 0.5f);
    float s3 = sin(z * 0.5f);

    // Unity's order is 'YXZ'
    float qx = s1 * c2 * c3 + c1 * s2 * s3;
    float qy = c1 * s2 * c3 - s1 * c2 * s3;
    float qz = c1 * c2 * s3 - s1 * s2 * c3;
    float qw = c1 * c2 * c3 + s1 * s2 * s3;

    Quaternion res;
    res.x = qx;
    res.y = qy;
    res.z = qz;
    res.w = qw;

    return res;
}
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Unity Hololens(UWP)をIL2CPPでビルドするときにDeviceが出てこないときにすること

問題

UnityでHololensをビルドするためにUWPをIL2CPPでビルドして、ソリューションファイルを開くと「開始」しかなく、いつもの「Device」がないことがあります。
コメント 2019-10-23 151320.png

解決策

上記の様な問題が起こる場合は、スタートアッププロジェクトの初期設定が間違っている可能性があります。
以下の画像の様に、ソリューションエクスプローラーから、自分の名前のプロジェクト(画像のStudyGoogleAPIs)を右クリックして、「スタートアッププロジェクトに設定」をクリックして下さい。
コメント 2019-10-23 150911.png
コメント 2019-10-23 150917.png

この設定を行うことにより、無事に「Device」を出すことができました!
コメント 2019-10-23 151721.png

参考リンク

このサイトを参考にさせて頂きました。
https://github.com/Microsoft/MixedRealityToolkit-Unity/issues/2419

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

unityでとりあえずMessagePack for CSを使うやり方

とりあえずMessagePackをunityで使いたい

ちゃんと使いたい人は調べてください。
とにかくとりあえず動かしてみたい人向けです。

そもそもMessagePack-CSharpって何?

C#(.NET, .NET Core, Unity, Xamarin)用の新しい高速なMessagePack実装
こちらをご覧ください。作者さんの解説です。

使い方

githubから入手

neuecc/MessagePack-CSharp
リリースからunitypackageとMessagePackUniversalCodeGenerator.zipを取得してください。

シリアライズしたいクラスの定義

SerializeTarget.cs
    [MessagePackObject]
    public class msgpacktest
    {
        [Key(0)]
        public Vector3 pos { get; set; }

        [Key(1)]
        public Vector3 rot { get; set; }
    }

    [MessagePackObject]
    public class testlist
    {
        [Key(0)]
        public List<msgpacktest> list = new List<msgpacktest>();
    }

コードジェネレート

MessagePackUniversalCodeGenerator.zipを任意の場所に解凍して
コマンドプロンプトから

mpc.exe -i [プロジェクト名].csproj -o "MessagePackGenerated.cs"

でMessagePackGenerated.csを自動生成してAssets内に配置します。
ソリューションが分かれてるときはクラス定義スクリプトのソリューションcsprojをinputに指定してください。

準備

スタートにこれ突っ込んでください(よくわかってない)

sample.cs
public class mspseriarizetest : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        MessagePack.Resolvers.CompositeResolver.RegisterAndSetAsDefault(
            MessagePack.Unity.UnityResolver.Instance,
            MessagePack.Resolvers.GeneratedResolver.Instance, 
            MessagePack.Resolvers.BuiltinResolver.Instance,
            MessagePack.Resolvers.AttributeFormatterResolver.Instance, 
            MessagePack.Resolvers.PrimitiveObjectResolver.Instance
            );
    }
}

シリアライズとデシリアライズ

serializetest.cs
msgpacktest msg = new msgpacktest
            {
                pos = new Vector3(1, 2, 3),
                rot = new Vector3(3, 4, 5),
            };
            //シリアライズ
            byte[] bytes = MessagePackSerializer.Serialize(msg);//LZ4MessagePackSerialzier
            //デシリアライズ
            msgpacktest msg1 = MessagePackSerializer.Deserialize<msgpacktest>(bytes);

以上。多分これで最低限動かせるはず。
stringだけとかならコードジェネレート必要ないです。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

脱出ゲームの作り方  5 電球のON/OFF

スクリプトの作成

LightstandManagerを作成し、LightstandPanel(オブジェクト)に張り付ける。

:page_facing_up:LightstandManager.cs

using UnityEngine.UI;を追加する。

lightON、lightOFF、の画像を用意
image型の変数image(画像を入れる)

[SerializeField] Sprite lightON;
[SerializeField] Sprite lightOFF;
[SerializeField] Image image;

スイッチのON/OFFで画像を差し替える

   public void LightSwitch(bool isON)
    {
        if (isON)                 //isONがtrue
        {
            image.sprite = lightON;  //imageの画像をlightONにする
        }
        else                           //そうでなかったら
        {
            image.sprite = lightOFF;   //imageの画像をlightOFFにする
        }
    }

※テスト
ItemBoxの左から1つ目のボックスをクリックしたら点灯し
2つ目のボックスをクリックしたら消灯する

InspectorでItemBoxのButtonコンポーネントの On Click() にLightstandPanel(オブジェクト)をセットして、
LightstandManagerに表示される関数をからLightSwitch()を設定する。チェックをつけてtrueにする。

InspectorでIItemBox (1)のButtonコンポーネントの On Click() にLightstandPanel(オブジェクト)をセットして、
LightstandManagerに表示される関数をからLightSwitch()を設定する。チェックなしでfalseにする。

:interrobang:
※ImagesのLightDown
Images_q.png

教材

Unityゲームスタジオ スタジオしまづ
【Unity】初心者からの脱出!? 脱出ゲームの作り方 その5 電球のON/OFF
https://youtu.be/S8G9LE0LNq8

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Unityから一定間隔でスクリーンショットボタンを押す

動機

VRChatで表情認識をしたい(願望):1日目
https://qiita.com/hohoemi108yen/items/df21c1c31c1bfd105851

上の記事のための学習として、UnityからWindowsのキー入力を扱う方法を調べたかった。

注意点

Unityには「System.Windows.Forms」は標準では導入されていないので、
下記パスからdllファイルをAssetフォルダ下にコピーする必要があった。

C:\Windows\Microsoft.NET\assembly\GAC_MSIL\System.Windows.Forms\v4.0_4.0.0.0__b77a5c561934e089\System.Windows.Forms.dll

ソースコード

AutoScreenshot.cs
using UnityEngine;
using System.Windows.Forms;


public class AutoScreenshot : MonoBehaviour
{
    //撮影周期(秒)
    const int PERIOD_SECOND = 500;
    int count;
    void Start()
    {
        count = PERIOD_SECOND;
    }

    void Update()
    {
        if (count == 0)
        {
            SendKeys.SendWait("%{PRTSC}");
            Debug.Log("スクショを撮影しました");

            count = PERIOD_SECOND;
        }
        Debug.Log(count--);

    }
}

参考

アクティブウインドウのスクリーンショットを周期的に撮るだけ
http://shirakamisauto.hatenablog.com/entry/2015/05/21/163421

Unityから他アプリを操作する方法
https://qiita.com/nise_aoi/items/7572a7024f941700add0

【C#】キーエミュレート送信のまとめ【覚書メモ】
http://edutainment-fun.com/hidemaru/microsoft/キーエミュレート送信のまとめ【c】【覚書メモ】_2535.html

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

MRTK v2 で 診断バー(Diagnostics)を消す(Mixed Reality Toolkit、デバッグバー)

はじめに

こんにちは、のんびりエンジニアのたっつーです。
今回の記事に詳細があるのでぜひご参照ください。

先日、MRTK v2が正式にリリースされましたね。

実際にMRTK v2を触ってみた方も多いかと思います、Unity2018/2019を開発に使う場合には、必然的に MRTK v2 を使う事になるかと思います。

今回は MRTK v2を使ったときに表示されるこいつを消したいと思います。基本的には便利なツールなんですが、やっぱり邪魔になる時ありますよね。

WS000000-1.jpg

消し方の手順

MRTK v2 のダウンロード

MRTK v2 の本体をダウンロードしましょう。

Fundationが本体になるので、ダウンロードしてUnityに取り込みましょう。
※Exampleはサンプルコード
※Extentions/Toolsは便利コードだと思われます。

WS000000-2.jpg

Unityに取り込み

ダウンロードした、~.unitypackage をUnityに取り込みましょう。

実際に消す設定

まずは、メニューから今のシーンにMRTKをセットアップします。
WS000001-2.jpg

こんな感じで、「MixedRealityToolkit」「MixedRealityPlayspace」の2つが追加されました。
※メインカメラも削除されます。
WS000002-2.jpg

ヒエラルキーから「MixedRealityToolkit」を選択し、「Copy & Customize」選択でProfileを作成しましょう。
※従来であれば、UnityでPrefabを設置・除去してりしていましたが、 MRTKv2では各種設定をProfileを使って管理します。
WS000001.jpg

Profileをコピーするので、保存先フォルダ、保存ファイル名を指定して、「Clone」ボタンを選択してください。
WS000002.jpg

先ほどのヒエラルキーに戻り、「Diagnostics」を選択し、「Enable Diagnostics System」のチェックボックスをOFFにしましょう。

お疲れ様です。上記で設定完了になります。

実行して確認する

何も表示されていない画面なので面白くないですが、実際にDisgnostics画面が非表示になった事が確認できます。

WS000004.jpg

終わりに

よければ ブログ「Unity+AssetStoreおすすめ情報」の方にも色々記載しているのでぜひご参照いただければと思います。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

MRTK v2 でオクルージョンする(Mixed Reality Toolkit、Occlusion)

はじめに

こんにちは、のんびりエンジニアのたっつーです。
今回の記事に詳細があるのでぜひご参照ください。

先日、MRTK v2が正式にリリースされましたね。

実際にMRTK v2を触ってみた方も多いかと思います、Unity2018/2019を開発に使う場合には、必然的に MRTK v2 を使う事になるかと思います。

今回は、実際に Hololens でオクルージョンしたいなと思い、MRTK v2 を使ってオクルージョンしてみたのでその手順をメモ程度に書いていきたいと思います。

オクルージョンとは?

以下の画像のように、CGの手前に建物などが被るような処理の事をオクルージョンと言います。WS000000.jpg
https://www.youtube.com/watch?v=7ZrmPTPgY3I

オクルージョン適用手順

MRTK v2 のダウンロード

MRTK v2 の本体をダウンロードしましょう。

Fundationが本体になるので、ダウンロードしてUnityに取り込みましょう。
※Exampleはサンプルコード
※Extentions/Toolsは便利コードだと思われます。

WS000000-2.jpg

Unityに取り込み

ダウンロードした、~.unitypackage をUnityに取り込みましょう。

実際にオクルージョンの設定

まずは、メニューから今のシーンにMRTKをセットアップします。

WS000001-2.jpg

こんな感じで、「MixedRealityToolkit」「MixedRealityPlayspace」の2つが追加されました。
※メインカメラも削除されます。

WS000002-2.jpg

次に、オクルージョンをするために環境情報を設定するためのProfileを作成します。
※従来であれば、UnityでPrefabを設置・除去してりしていましたが、 MRTKv2では各種設定をProfileを使って管理します。

「~SpatialAwarenessSystem」を選択し、該当Profileの「Clone」を選択しましょう。

image-27.png

Profileをコピーするので、保存先フォルダ、保存ファイル名を指定して、「Clone」ボタンを選択してください。

WS000004-1.jpg

上記で、作成したProfileに自動的に切り替わるので、次に「Display Option」を「Occlusion」に変更してください。

WS000005-1.jpg

お疲れ様です。上記で設定完了になります。

ちなみに各オプションで使いそうなやつは以下になります。

  • Startup Befavior:開始タイミング
  • Update Interval:メッシュ更新時間
  • Observation Extents:メッシュ範囲
  • Physics Layer:メッシュを展開するレイヤー

Hololensビルドして実行

以上でオクルージョンが設定できました。
シーン上にキューブなどを追加して確認してみてください。

終わりに

よければ ブログ「Unity+AssetStoreおすすめ情報」の方にも色々記載しているのでぜひご参照いただければと思います。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Unity:Unity Render Streaming(Unity公式のWebRTC)を使う【WebブラウザとUnityが連携!】

はじめに

こんにちは、のんびりエンジニアのたっつーです。
今回の記事に詳細があるのでぜひご参照ください。

今回は、先日 Unite Tokyo 2019 で発表された Unity Render Streaming (Unity公式のWebRTC)を試してみたいと思います。

Unity Render Streaming とは?

公式ブログの説明の説明を引用。

 Unity 向けの WebRTC ライブラリを開発するとともに、このライブラリを用いて Unity のアプリケーションをブラウザーから利用できるようにする

・・・

Unity Render Streaming をプロジェクトに追加することで、Google Chrome や Safari などの、皆さんが日頃利用しているブラウザーから Unity で開発したアプリケーションをリアルタイムに操作できます。また、私たちはデスクトップのブラウザーだけでなく、iPad や iPhone、Android の主要ブラウザーで動作を確認しています。
https://blogs.unity3d.com/jp/2019/09/17/stream-high-quality-real-time-graphics-through-your-browser-with-our-new-webrtc-framework/

ポイント

ポイントとしては以下のような感じです。

  • WebRTCを使って実現
  • ゲーム画面をWebブラウザに配信できる。
    • デスクトップ、主要なスマホのWebブラウザに対応
  • Webブラウザ側から操作が出来る。

必要な環境

このソリューションは、NVIDIAのグラボに最適化されているとの事。
ドキュメントによると、DirectX11 のみサポートしているそうなので、 NVIDIA VIDEO CODEC SDK で推奨されているグラフィックボードが公開されているのでチェックしましょう。

※将来的には、DirectX12をサポート予定になっています。

Unity Render Streaming を試す

NVIDIAドライバのバージョン

実行時に、以下のエラーが発生する時には、NVIDIAドライバーのバージョンが古いため出ているようなので、グラフィックドライバを最新バージョンに更新しましょう。

[WebRTC] The version of the hardware codec driver does not support API
UnityEngine.Debug:LogError(Object)
Unity.WebRTC.WebRTC:Initialize() (at Library/PackageCache/com.unity.webrtc@1.0.1-preview/Runtime/Srcipts/WebRTC.cs:236)
Unity.RenderStreaming.RenderStreaming:Awake() (at Assets/Scripts/RenderStreaming.cs:59)

NVIDIA VIDEO CODEC SDKのページでは、WindowsのNVIDIAドライバーは 436.15 以降 が必要との事でした。
WS000002-2.jpg

公式サンプルを試す

次に、公式のサンプルを試してみます。
このサンプルを用いる事により、Unity側でデバッグ実行して、Webブラウザ側で操作が出来るようになります。
※裏でサーバも起動させて、Unity<->ブラウザの通信を補助します

Unity Render Streamingのパッケージを追加

新しく Unityでプロジェクトを作成したら、パッケージマネージャーを起動してください。
メニュバーから「Window > PackageManager」を選択します。

WS000000-5.jpg

「Unity Renbder Streaming」はまだ Previewパッケージなので、「Show preview pakcages」を選択します。

WS000001-3.jpg

検索欄に「streaming」と入力すると、「Unity Render Streming」が表示されます。
※ Unityのバージョンが古いと、この一覧に出てこないので注意しましょう。
WS000002-3.jpg

対象パッケージを選択して、「Install」を選択しましょう。
WS000003-4.jpg

InputSystemの警告がでますが、問題無いので「Yes」を選択しましょう。
WS000004-2.jpg

サンプルプロジェクトの追加

次に、サンプルプロジェクトをインポートします。
※「Unity Render Streming」だけを使う場合は、ここは不要になります。

WS000005-1.jpg
WS000006-2.jpg

(HDRPプロジェクトなので結構時間がかかりますが気長に待ちましょう)
サンプルプロジェクトがインポートされると、こんな感じでファイルが展開されます。

WS000007-1.jpg

WebServerを実行

UnityとWebブラウザの通信を仲介するWebサーバを配置して、実行します。
メニュバーから、「Edit > Unity Render Streaming > Donwload web app」を選択して、適当なフォルダに webserver.exe を保存しましょう。
WS000008-1.jpg

存したら、webserver.exe を実行しましょう。
WS000009.jpg

実行すると、このような画面が立ち上がります。
WS000010.jpg

これで全ての準備が整いました、次に実際に事項して動作を確認してみましょう。

Unity・Webブラウザで実行して確認

Unity側で実行してください。
WS000011.jpg

次に、ブラウザで(localhost)を指定して表示してみてください。
WS000012.jpg

どうでしょうか、以下のようにWebブラウザでの操作がUnity側にフィードバックされているのがわかりますね。

終わりに

よければ ブログ「Unity+AssetStoreおすすめ情報」の方にも色々記載しているのでぜひご参照いただければと思います。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Unityを複数起動して、同一プロジェクトを共有する方法

はじめに

こんにちは、のんびりエンジニアのたっつーです。
今回の記事に詳細があるのでぜひご参照ください。

今回は、同一プロジェクトを複数のUnityで共有する方法をご紹介させていただきます。
この方法は1台のPC上で、複数のUnityを起動して実行するやり方になります。
※この方法は通常の使い方ではないので扱いには注意してください。

プロジェクト共有の使い道

同一プロジェクトを共有する事により、以下メリットがあるのかなと思います。

  • マルチユーザゲームなどの開発でつかる
    • 複数ユーザ扱える
  • Unityを複数起動するのでデバッグできる
  • 変更点が即時で反映される
    • Gitなどで共有するよりお手軽
  • プラットフォーム毎のビルド設定を保持して、切り替えの手間を無くす

また、デメリットとしては

  • Unityを複数起動するので重い
  • Unityの通常の使い方ではないので、不安定になる事も

プロジェクト共有のやり方

基本的には、特定のフォルダをシンボリックリンクする事で、片方のファイルを変更するともう一方のプロジェクトファイルも編集された事になるやり方になります。

対象のフォルダは、以下の3つになります。

  • Assets
  • ProjectSettings
  • Packages

実際に試してみる

まずは、こんな感じの適当なプロジェクトを用意しました。
「unity-proj1」に、コピー元プロジェクトが格納された状態です。

WS000000-6.jpg

次に、「unity-proj1」から「unity-proj2」をコピーして作成します。

WS000001-4.jpg

そして、「unity-proj2」から「Assets」「Pakcages」「ProjectSettings」を削除しましょう。
WS000002-4.jpg
WS000003-5.jpg

次にこの3つのフォルダを、「untiy-proj1」のフォルダと共有するために、コマンドラインを立ち上げて、シンボリックリンクを張りたいと思います。

コマンドラインを「管理者権限」で立ち上げてください。
WS000004-3.jpg

そして次のコマンドを入力して、ディレクトを共有してみましょう。

mklink /d <パス>\unity-proj2\Assets <パス>\unity-proj1\Assets
mklink /d <パス>\unity-proj2\Packages <パス>\unity-proj1\Packages
mklink /d <パス>\unity-proj2\ProjectSettings <パス>\unity-proj1\ProjectSettings

コマンドが成功すると、以下のようなメッセージが表示されるので確認しましょう。
~ <<===>> ~ のシンボリック リンクが作成されました

上記、コマンドがすべて成功すると以下のように、「unity-proj2」の「Assets」「Packages」「ProjectSettings」の3フォルダに、ショートカットのような矢印マークが表示されます。
WS000005-2.jpg

試した結果

それでは、今作成した「unity-proj2」をUnityで読み込んで立ち上げてみてください。
どうでしょうか、想定通りに同じプロジェクトがそれぞれのUnityで立ち上がった事が確認でいます。
WS000000-7.jpg

実際に、オブジェクトを追加した場合に、別Unityでそれが反映されるか確認してみました、、、見事に反映されましたね!
project-share2.gif

終わりに

よければ ブログ「Unity+AssetStoreおすすめ情報」の方にも色々記載しているのでぜひご参照いただければと思います。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Unityの新しいデバイス・シミュレータの使い方(Device Simulator )

はじめに

こんにちは、のんびりエンジニアのたっつーです。
今回の記事に詳細があるのでぜひご参照ください。

先日、Unityブログにてデバイスシミュレータが掲載されていたので実際に動かしてみました。

だいたいこんな感じで、Unityの環境にシミュレータウィンドウが表示されますので結構よさそうな感じです。
※画面の緑色の線は、「Safe Area」で最近流行りの上部のカメラ領域とかを除いた、ゲームだけに使える領域が表示できます。

WS000008.jpg

使い方

今回はここの手順に沿って導入してみました、本説明がわからない場合はこちらを参照してみてください!

Unity 2019.3以降が必要

Unity 2019.3以降 が必要なのでインストールしましょう。

WS000000-3.jpg

デバイスシミュレータの導入

デバイスシミュレータは、Unity の PackageManager から導入できます。
メニューから「Window > Package Manager」を選択します。

WS000001-1.jpg

PackageManagerを開いたら、検索から「device」を入力し、「Device Simulator」を選択し、「Install」ボタンでインポートしましょう。
※Unity 2019.3以降じゃないと表示されないので気を付けましょう。

WS000002-1.jpg

デバイスシミュレータの起動

起動方法は2種類あります、メニューから起動、GameウィンドウからSimulatorに変更の2つです。!

WS000003-2.jpg

WS000004-1.jpg

選択するとこのような画面が表示されます。
※画面に表示されているモデルは、アセットストアから無料のやつを使っています。

WS000008-2.jpg

デバイスシミュレータの詳細

画面構成は主に以下のように1~10に分かれています。

WS000005.png

1.ゲームビューモード
ゲームビューとシミュレータビューを切り替えます。

2.デバイスの選択
利用可能なデバイスから選択します。
こんな感じで、定義済みのデバイスが選択できます。

WS000005.jpg

3.再起動
ドメインのリロードを引き起こさずに、プレーヤー設定を使用してScreenクラスとSystemInfoクラスのシミュレーションを初期化します。

4.スケール
デバイスが内部に表示される大きさを制御します

5.画面に合わせる
ウィンドウ内にぴったりと収まるようにデバイスを自動的にスケーリングします。

6.回転
デバイスを物理的に回転させます。自動回転が有効か無効かに応じて、実際の画像はデバイスと一緒に回転する場合と回転しない場合があります。

7.セーフエリアを強調表示する
現在のScreen.safeAreaの周囲に境界線を描画します。

WS000006.jpg

8.デバイスの仕様
現在シミュレートされているデバイスの最も重要なデータを表示します。

  • デバイスOS
  • デバイスCPU / GPU
  • デバイス解像度

9.画面設定
Screenクラスの値の表示と変更を許可します。

10.プレーヤー設定
デバイスシミュレータPlayerの設定は、本当の上書きPlayerの設定を。AndroidまたはiOSサポートがインストールされていない場合に特に便利です。このメニューには、現在シミュレーションに影響しているすべてのプレーヤー設定が含まれています。

  • フルスクリーンで開始
  • 解像度スケーリングモード
  • デフォルトの向き
  • 許可されたオリエンテーション
  • Auto Graphics API
  • グラフィックスAPI

[プレーヤー設定を使用]は、実際のプレーヤー設定とシミュレートされたプレーヤー設定のどちらを使用するかを制御します。

終わりに

よければ ブログ「Unity+AssetStoreおすすめ情報」の方にも色々記載しているのでぜひご参照いただければと思います。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

VRChatで表情認識をしたい(願望):1日目

はじめに

この記事はVRChatを先日始めた初心者が「VRChatで表情認識をしてみたい!」と思い立ち、
1日目に実現のために調べた内容、参考にした記事について纏めたものです。
・なぜ誰もやっていない(あまりやられていない)のか?
・どこが技術的に難しいのか?
を自分なりにまとめておきたかったので、実現までの過程を記事にしていきたいと思っています。

また、この記事は2019/10/23時点で調べた結果のまとめであり、
引用元に関してはそれよりも古い情報を含む可能性があります。

目標

以下のような環境を実現するのが目標となります。
・VRChat自体はデスクトップ画面に表示される(HMDを被ると表情認識できないため)
・両手の動きはコントローラのようなものでトラッキングできる。
・コントローラでVRChat内での前後移動・屈伸操作などができる。
・表情はWebカメラで認識する。認識したものがアバターにも反映される。
EHg_wirUwAAEwB2.png

開始時点の学習状況

・VRChat2日だけプレイした
・3Dほとんどわからない
・Unityでは簡単なゲームぐらいなら作ったことがある
どうやらUnityで表情認識ができるらしいということは記事で読んだことがある
・VR機器は友達の家で触らせてもらったことがある程度(自宅に無い)

VRChatで自作アバターを使えるようにするには?

めちゃめちゃ大風呂敷を広げておきながら、自作アバターを上げたことすらなかったので、
まずは自作アバターを使えるようにしました。

ほとんど以下の記事を参照することで解決しました。

“窓辺とおこ”に変身!VRChatでオリジナルアバターを使ってみた
https://akiba-pc.watch.impress.co.jp/docs/sp/1145261.html

要点は以下3点です。
・VRChatにアバターをアップロードするためにはユーザーランクを上げる必要がある
・ユーザーランクを上げるために、VRChat内のフレンドを増やす必要がある
・VRChatへのアバターアップロードは、専用のSDKをインポートしたUnityプロジェクトから行う

上記の記事で紹介されている”窓辺とおこ”さんに関してはすでに3Dモデルの配布を停止されていますが、
無料配布3Dモデルを代用することで解決できます。
私の場合は、「拾い部屋」様が配布されている以下のモデルを拝借しました。

VR用3Dモデル「2A-7/2ERO (ニアナ/ニエロ装備)」
https://booth.pm/ja/items/1197108

上記のモデルをUnityプロジェクトに導入する際は、"窓辺とおこ"さんの記事にあるやり方ではなく、
DL・解凍したフォルダ内にある、以下のパスに置かれた画像の手順での導入が必要でした。
2A-7_LC_190521ver\アップロードのやり方(初めてアバターアップする人向け)\PC版アバターのアップロード方法

test_vr.jpg

さっそくUnityプロジェクトを編集してみる

Unityプロジェクト上に配置したオブジェクトについて

Unityプロジェクト上に配置したオブジェクトについては、ほとんどそのままVRChat上に反映されるようです。
試しにただのCubeをプロジェクト内の適当な場所に配置したところ、そのまま反映されました。(可愛い)
EHgF1nuUwAAQrZ0.png

Unityプロジェクトの制限

結構素直に反映されるプロジェクト状況ですが、反映されないものがいくつかあるようでした。

スクリプトが使えない

VRChatのアバターにはスクリプトを使えないようです。
ただし、シェーダーは反映されるので、シェーダー内にスクリプトを書いて、特殊な挙動を実装することはできるようです。
また、「アニメーションオーバーライド」で特定のキーを押したときにアニメーションを再生することはできるようです。

アニメーションオーバーライドで表情をつけよう
http://shiasakura.hatenablog.com/entry/2018/03/30/190811

ほとんどのコンポーネントが使えない

スクリプトと同様に、ほとんどのコンポーネントが使えません。
以下の公式ドキュメントに記載されたコンポーネントのみが使えます
https://docs.vrchat.com/docs/whitelisted-avatar-components

例えば、AudioLisnerは上記のリストに含まれているので、音声を流すことはできます。
ただし、スクリプトは使えないので外部のマイクから音声は取得できず、プロジェクトに含まれる音声ファイルを流すだけ、となります。

Webカメラの画像取得ができるのであれば、シェーダー内で上手くやりくりすれば……なども考えていましたが、
どうやらそういった手法は難しい様子……。

また補足として、ワールド側には使えるが、アバター側には使えないものも多いとのこと。
例えば、ワールド側ではWeb_Panelというオブジェクトでブラウザを開くことができるため、
間接的にJavaScriptを実行できるらしいです。

制限を踏まえて実現方法を考えてみる

上記踏まえて、顔認識の実装方法を検討しましたが、
・顔に仮想トラッカーを付け、直接トラッキングする
・アニメーションオーバーライドを魔改造し、表情認識に合わせてキー入力する
という2つの手段が取れそうでした。

顔トラッキング

Unityプロジェクト上で実装することが難しそうなのは分かったので、
「顔にトラッカーが付いていると仮定して、顔トラッキングする」ことを考えてみました。

フルトラッキングで全身を動かせるなら、顔に数百個のトラッカーを付ければ
細かい表情をトラッキングできるはずです。

調べてみると、尻にトラッカーを5個付けている先駆者が居ました。(強い)

Youtube:【検証】VIVEトラッカーを尻に5個付けるとどうなるの?
https://www.youtube.com/watch?v=VGZysnUDkQg&feature=youtu.be

と、ここでわかりましたが、どうやらVRChatでは7個までしかトラッカーを使えない模様。
ので、いったん下記5つのパラメータをVRChatに持ち込むことを目指します。

・両目の開閉
・口の開閉
・右目の上下左右
・左目の上下左右
・笑顔(口角・目頭の上がり具合)

顔トラッキングに向けた先行事例

ここで、Webカメラでフルトラッキングした事例を見つけました。

参考:Webcamで全身フルトラッキング for SteamVR
https://qiita.com/TenteEEEE/items/9bf5c65f33d0b818c31d

上記の記事では、「OpenVR Input Emulator」で仮想トラッカーを追加して、
その位置情報を別のアプリケーションから上書きすることで、
モーション認識によって取得した位置情報をVRChatに持ち込んでいるようです。

これが可能なら、顔認識した位置情報をVRChatに持ち込むこともできるかもしれません。

アニメーションオーバーライドの魔改造

顔トラッキングとは別の手法として、アニメーションオーバーライドを使う手もありそうです。
追加のアニメーションは結構な数を登録できるようなので、
「特定の表情を認識したら、特定のキーを入力するマクロ」をたくさん作れば、疑似的に表情認識ができるかもしれません。

「アニメーションを同時に適用する」といったことができるなら、より細かい表情も作れるかも……。

1日目終了とこれから

まとめ

1日目はここまで調査しました。
顔トラッキングはいちばん自然な表情認識ができそうでしたが、
そもそもVR機器を持っていないことから検証が難しそうだったので、後に回します。

アニメーションオーバーライドの魔改造については比較的実現が簡単そうだったので、
まずはこの方法を試してみて、また課題を見つけてみようかと思います。

わからないこと

デスクトップモードで両手のトラッキングをする方法についても調べてみたのですが、それらしいものが出てきませんでした。
そもそもサポートされていないのかもしれません。

逆に、VRモードでHMDではなくデスクトップにアプリを表示する方法はあるかもしれないですが、
そもそもVRモードで起動するためにVR機器が必要そうなので、これも後回しにします。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む