- 投稿日:2019-10-23T22:09:18+09:00
脱出ゲームの作り方 6 アイテム使用による電球のONOFF
これまでの作業で、
■A.DrawerPnelで引き出しがクリックされたら電球画像を表示し、
ItemBoxに電球を取得する処理を作成した1.DrawerPnelで引き出しがクリックされたら、電球画像を表示する
脱出ゲームの作り方 2
◇TriggerButtonを押したら電球パネルとテキストを表示DrawerManager.rbpublic void OnClickTrigger() { LightBulbSetActive(true); }2.上記1.と同時に、ItemBoxに電球の画像を表示する
脱出ゲームの作り方 4
◇itemに電球のデータが取得されたら、電球の画像を表示するDrawerManager.rbpublic 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スクリプトを使えるようにする
LightStandManager(型)、 lightStandManager(変数)??
※エディタでItemBoxPnel(オブジェクト)を選択すると、InspecterのItemBoxManagerスクリプトに
LightStandManagerが出る
スクリプトを変数のように扱って、他のスクリプトで使えるようにする?ItemBoxManager.cs[SerializeField] LightStandManager lightStandManager;アイテムが電球だったら、
lightstandManagerスクリプトのLightSwitch()関数をtrueで実行する
それ以外は何もしないItemBoxManager.cspublic 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と使うアイテムを対応させる
どのオブジェクトにどのスクリプトをアタッチしたかを一覧で見る方法?
ボタンコンポーネントに、スクリプトを作成した関数を選択するためにオブジェクトを設定するときにわかりにくくなってしまう
自分の課題
各オブジェクト
オブジェクトにアタッチしたスクリプト
スクリプトで作成した変数、関数
Inspectorで変数や関数を設定する
これらのつながりを整理する教材
Unityゲームスタジオ スタジオしまづ
【Unity】初心者からの脱出!? 脱出ゲームの作り方 その6 アイテム使用による電球のONOFF
https://youtu.be/Z4uJWBRvGhk
- 投稿日:2019-10-23T17:25:32+09:00
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; }
- 投稿日:2019-10-23T15:18:42+09:00
Unity Hololens(UWP)をIL2CPPでビルドするときにDeviceが出てこないときにすること
問題
UnityでHololensをビルドするためにUWPをIL2CPPでビルドして、ソリューションファイルを開くと「開始」しかなく、いつもの「Device」がないことがあります。
解決策
上記の様な問題が起こる場合は、スタートアッププロジェクトの初期設定が間違っている可能性があります。
以下の画像の様に、ソリューションエクスプローラーから、自分の名前のプロジェクト(画像のStudyGoogleAPIs)を右クリックして、「スタートアッププロジェクトに設定」をクリックして下さい。
この設定を行うことにより、無事に「Device」を出すことができました!
参考リンク
このサイトを参考にさせて頂きました。
https://github.com/Microsoft/MixedRealityToolkit-Unity/issues/2419
- 投稿日:2019-10-23T15:04:48+09:00
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.cspublic 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.csmsgpacktest 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だけとかならコードジェネレート必要ないです。
- 投稿日:2019-10-23T13:01:52+09:00
脱出ゲームの作り方 5 電球のON/OFF
スクリプトの作成
LightstandManagerを作成し、LightstandPanel(オブジェクト)に張り付ける。
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にする。教材
Unityゲームスタジオ スタジオしまづ
【Unity】初心者からの脱出!? 脱出ゲームの作り方 その5 電球のON/OFF
https://youtu.be/S8G9LE0LNq8
- 投稿日:2019-10-23T09:37:51+09:00
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.csusing 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/163421Unityから他アプリを操作する方法
https://qiita.com/nise_aoi/items/7572a7024f941700add0【C#】キーエミュレート送信のまとめ【覚書メモ】
http://edutainment-fun.com/hidemaru/microsoft/キーエミュレート送信のまとめ【c】【覚書メモ】_2535.html
- 投稿日:2019-10-23T08:59:01+09:00
MRTK v2 で 診断バー(Diagnostics)を消す(Mixed Reality Toolkit、デバッグバー)
はじめに
こんにちは、のんびりエンジニアのたっつーです。
今回の記事に詳細があるのでぜひご参照ください。先日、MRTK v2が正式にリリースされましたね。
実際にMRTK v2を触ってみた方も多いかと思います、Unity2018/2019を開発に使う場合には、必然的に MRTK v2 を使う事になるかと思います。
今回は MRTK v2を使ったときに表示されるこいつを消したいと思います。基本的には便利なツールなんですが、やっぱり邪魔になる時ありますよね。
消し方の手順
MRTK v2 のダウンロード
MRTK v2 の本体をダウンロードしましょう。
Fundationが本体になるので、ダウンロードしてUnityに取り込みましょう。
※Exampleはサンプルコード
※Extentions/Toolsは便利コードだと思われます。Unityに取り込み
ダウンロードした、~.unitypackage をUnityに取り込みましょう。
実際に消す設定
まずは、メニューから今のシーンにMRTKをセットアップします。
こんな感じで、「MixedRealityToolkit」「MixedRealityPlayspace」の2つが追加されました。
※メインカメラも削除されます。
ヒエラルキーから「MixedRealityToolkit」を選択し、「Copy & Customize」選択でProfileを作成しましょう。
※従来であれば、UnityでPrefabを設置・除去してりしていましたが、 MRTKv2では各種設定をProfileを使って管理します。
Profileをコピーするので、保存先フォルダ、保存ファイル名を指定して、「Clone」ボタンを選択してください。
先ほどのヒエラルキーに戻り、「Diagnostics」を選択し、「Enable Diagnostics System」のチェックボックスをOFFにしましょう。
お疲れ様です。上記で設定完了になります。
実行して確認する
何も表示されていない画面なので面白くないですが、実際にDisgnostics画面が非表示になった事が確認できます。
終わりに
よければ ブログ「Unity+AssetStoreおすすめ情報」の方にも色々記載しているのでぜひご参照いただければと思います。
- 投稿日:2019-10-23T08:58:54+09:00
MRTK v2 でオクルージョンする(Mixed Reality Toolkit、Occlusion)
はじめに
こんにちは、のんびりエンジニアのたっつーです。
今回の記事に詳細があるのでぜひご参照ください。先日、MRTK v2が正式にリリースされましたね。
実際にMRTK v2を触ってみた方も多いかと思います、Unity2018/2019を開発に使う場合には、必然的に MRTK v2 を使う事になるかと思います。
今回は、実際に Hololens でオクルージョンしたいなと思い、MRTK v2 を使ってオクルージョンしてみたのでその手順をメモ程度に書いていきたいと思います。
オクルージョンとは?
以下の画像のように、CGの手前に建物などが被るような処理の事をオクルージョンと言います。
https://www.youtube.com/watch?v=7ZrmPTPgY3Iオクルージョン適用手順
MRTK v2 のダウンロード
MRTK v2 の本体をダウンロードしましょう。
Fundationが本体になるので、ダウンロードしてUnityに取り込みましょう。
※Exampleはサンプルコード
※Extentions/Toolsは便利コードだと思われます。Unityに取り込み
ダウンロードした、~.unitypackage をUnityに取り込みましょう。
実際にオクルージョンの設定
まずは、メニューから今のシーンにMRTKをセットアップします。
こんな感じで、「MixedRealityToolkit」「MixedRealityPlayspace」の2つが追加されました。
※メインカメラも削除されます。次に、オクルージョンをするために環境情報を設定するためのProfileを作成します。
※従来であれば、UnityでPrefabを設置・除去してりしていましたが、 MRTKv2では各種設定をProfileを使って管理します。「~SpatialAwarenessSystem」を選択し、該当Profileの「Clone」を選択しましょう。
Profileをコピーするので、保存先フォルダ、保存ファイル名を指定して、「Clone」ボタンを選択してください。
上記で、作成したProfileに自動的に切り替わるので、次に「Display Option」を「Occlusion」に変更してください。
お疲れ様です。上記で設定完了になります。
ちなみに各オプションで使いそうなやつは以下になります。
- Startup Befavior:開始タイミング
- Update Interval:メッシュ更新時間
- Observation Extents:メッシュ範囲
- Physics Layer:メッシュを展開するレイヤー
Hololensビルドして実行
以上でオクルージョンが設定できました。
シーン上にキューブなどを追加して確認してみてください。終わりに
よければ ブログ「Unity+AssetStoreおすすめ情報」の方にも色々記載しているのでぜひご参照いただければと思います。
- 投稿日:2019-10-23T08:58:46+09:00
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 以降 が必要との事でした。
公式サンプルを試す
次に、公式のサンプルを試してみます。
このサンプルを用いる事により、Unity側でデバッグ実行して、Webブラウザ側で操作が出来るようになります。
※裏でサーバも起動させて、Unity<->ブラウザの通信を補助しますUnity Render Streamingのパッケージを追加
新しく Unityでプロジェクトを作成したら、パッケージマネージャーを起動してください。
メニュバーから「Window > PackageManager」を選択します。「Unity Renbder Streaming」はまだ Previewパッケージなので、「Show preview pakcages」を選択します。
検索欄に「streaming」と入力すると、「Unity Render Streming」が表示されます。
※ Unityのバージョンが古いと、この一覧に出てこないので注意しましょう。
対象パッケージを選択して、「Install」を選択しましょう。
InputSystemの警告がでますが、問題無いので「Yes」を選択しましょう。
サンプルプロジェクトの追加
次に、サンプルプロジェクトをインポートします。
※「Unity Render Streming」だけを使う場合は、ここは不要になります。(HDRPプロジェクトなので結構時間がかかりますが気長に待ちましょう)
サンプルプロジェクトがインポートされると、こんな感じでファイルが展開されます。WebServerを実行
UnityとWebブラウザの通信を仲介するWebサーバを配置して、実行します。
メニュバーから、「Edit > Unity Render Streaming > Donwload web app」を選択して、適当なフォルダに webserver.exe を保存しましょう。
これで全ての準備が整いました、次に実際に事項して動作を確認してみましょう。
Unity・Webブラウザで実行して確認
次に、ブラウザで(localhost)を指定して表示してみてください。
どうでしょうか、以下のようにWebブラウザでの操作がUnity側にフィードバックされているのがわかりますね。
Unite Tokyo 2019で発表されたUnity Render Streamingを試してみたけど簡単に使えた!
— たっつー@Unity情報発信 (@kingyo222) October 12, 2019
ブラウザがゲームのプラットフォームになれる!#unity https://t.co/pmb3nS3roQ pic.twitter.com/ayUmsFbOIs終わりに
よければ ブログ「Unity+AssetStoreおすすめ情報」の方にも色々記載しているのでぜひご参照いただければと思います。
- 投稿日:2019-10-23T08:58:39+09:00
Unityを複数起動して、同一プロジェクトを共有する方法
はじめに
こんにちは、のんびりエンジニアのたっつーです。
今回の記事に詳細があるのでぜひご参照ください。今回は、同一プロジェクトを複数のUnityで共有する方法をご紹介させていただきます。
この方法は1台のPC上で、複数のUnityを起動して実行するやり方になります。
※この方法は通常の使い方ではないので扱いには注意してください。プロジェクト共有の使い道
同一プロジェクトを共有する事により、以下メリットがあるのかなと思います。
- マルチユーザゲームなどの開発でつかる
- 複数ユーザ扱える
- Unityを複数起動するのでデバッグできる
- 変更点が即時で反映される
- Gitなどで共有するよりお手軽
- プラットフォーム毎のビルド設定を保持して、切り替えの手間を無くす
また、デメリットとしては
- Unityを複数起動するので重い
- Unityの通常の使い方ではないので、不安定になる事も
プロジェクト共有のやり方
基本的には、特定のフォルダをシンボリックリンクする事で、片方のファイルを変更するともう一方のプロジェクトファイルも編集された事になるやり方になります。
対象のフォルダは、以下の3つになります。
- Assets
- ProjectSettings
- Packages
実際に試してみる
まずは、こんな感じの適当なプロジェクトを用意しました。
「unity-proj1」に、コピー元プロジェクトが格納された状態です。次に、「unity-proj1」から「unity-proj2」をコピーして作成します。
そして、「unity-proj2」から「Assets」「Pakcages」「ProjectSettings」を削除しましょう。
次にこの3つのフォルダを、「untiy-proj1」のフォルダと共有するために、コマンドラインを立ち上げて、シンボリックリンクを張りたいと思います。
そして次のコマンドを入力して、ディレクトを共有してみましょう。
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フォルダに、ショートカットのような矢印マークが表示されます。
試した結果
それでは、今作成した「unity-proj2」をUnityで読み込んで立ち上げてみてください。
どうでしょうか、想定通りに同じプロジェクトがそれぞれのUnityで立ち上がった事が確認でいます。
実際に、オブジェクトを追加した場合に、別Unityでそれが反映されるか確認してみました、、、見事に反映されましたね!
終わりに
よければ ブログ「Unity+AssetStoreおすすめ情報」の方にも色々記載しているのでぜひご参照いただければと思います。
- 投稿日:2019-10-23T08:27:40+09:00
Unityの新しいデバイス・シミュレータの使い方(Device Simulator )
はじめに
こんにちは、のんびりエンジニアのたっつーです。
今回の記事に詳細があるのでぜひご参照ください。先日、Unityブログにてデバイスシミュレータが掲載されていたので実際に動かしてみました。
だいたいこんな感じで、Unityの環境にシミュレータウィンドウが表示されますので結構よさそうな感じです。
※画面の緑色の線は、「Safe Area」で最近流行りの上部のカメラ領域とかを除いた、ゲームだけに使える領域が表示できます。使い方
今回はここの手順に沿って導入してみました、本説明がわからない場合はこちらを参照してみてください!
Unity 2019.3以降が必要
Unity 2019.3以降 が必要なのでインストールしましょう。
デバイスシミュレータの導入
デバイスシミュレータは、Unity の PackageManager から導入できます。
メニューから「Window > Package Manager」を選択します。PackageManagerを開いたら、検索から「device」を入力し、「Device Simulator」を選択し、「Install」ボタンでインポートしましょう。
※Unity 2019.3以降じゃないと表示されないので気を付けましょう。デバイスシミュレータの起動
起動方法は2種類あります、メニューから起動、GameウィンドウからSimulatorに変更の2つです。!
選択するとこのような画面が表示されます。
※画面に表示されているモデルは、アセットストアから無料のやつを使っています。デバイスシミュレータの詳細
画面構成は主に以下のように1~10に分かれています。
1.ゲームビューモード
ゲームビューとシミュレータビューを切り替えます。2.デバイスの選択
利用可能なデバイスから選択します。
こんな感じで、定義済みのデバイスが選択できます。3.再起動
ドメインのリロードを引き起こさずに、プレーヤー設定を使用してScreenクラスとSystemInfoクラスのシミュレーションを初期化します。4.スケール
デバイスが内部に表示される大きさを制御します5.画面に合わせる
ウィンドウ内にぴったりと収まるようにデバイスを自動的にスケーリングします。6.回転
デバイスを物理的に回転させます。自動回転が有効か無効かに応じて、実際の画像はデバイスと一緒に回転する場合と回転しない場合があります。7.セーフエリアを強調表示する
現在のScreen.safeAreaの周囲に境界線を描画します。8.デバイスの仕様
現在シミュレートされているデバイスの最も重要なデータを表示します。
- デバイスOS
- デバイスCPU / GPU
- デバイス解像度
9.画面設定
Screenクラスの値の表示と変更を許可します。10.プレーヤー設定
デバイスシミュレータPlayerの設定は、本当の上書きPlayerの設定を。AndroidまたはiOSサポートがインストールされていない場合に特に便利です。このメニューには、現在シミュレーションに影響しているすべてのプレーヤー設定が含まれています。
- フルスクリーンで開始
- 解像度スケーリングモード
- デフォルトの向き
- 許可されたオリエンテーション
- Auto Graphics API
- グラフィックスAPI
[プレーヤー設定を使用]は、実際のプレーヤー設定とシミュレートされたプレーヤー設定のどちらを使用するかを制御します。
終わりに
よければ ブログ「Unity+AssetStoreおすすめ情報」の方にも色々記載しているのでぜひご参照いただければと思います。
- 投稿日:2019-10-23T07:55:18+09:00
VRChatで表情認識をしたい(願望):1日目
はじめに
この記事はVRChatを先日始めた初心者が「VRChatで表情認識をしてみたい!」と思い立ち、
1日目に実現のために調べた内容、参考にした記事について纏めたものです。
・なぜ誰もやっていない(あまりやられていない)のか?
・どこが技術的に難しいのか?
を自分なりにまとめておきたかったので、実現までの過程を記事にしていきたいと思っています。また、この記事は2019/10/23時点で調べた結果のまとめであり、
引用元に関してはそれよりも古い情報を含む可能性があります。目標
以下のような環境を実現するのが目標となります。
・VRChat自体はデスクトップ画面に表示される(HMDを被ると表情認識できないため)
・両手の動きはコントローラのようなものでトラッキングできる。
・コントローラでVRChat内での前後移動・屈伸操作などができる。
・表情はWebカメラで認識する。認識したものがアバターにも反映される。
開始時点の学習状況
・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版アバターのアップロード方法さっそくUnityプロジェクトを編集してみる
Unityプロジェクト上に配置したオブジェクトについて
Unityプロジェクト上に配置したオブジェクトについては、ほとんどそのままVRChat上に反映されるようです。
試しにただのCubeをプロジェクト内の適当な場所に配置したところ、そのまま反映されました。(可愛い)
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機器が必要そうなので、これも後回しにします。




















































