Archive For The “Unity” Category

Unityでのアプリ内のムービー表示方法と、常に正しい解像度と比率を維持するように設定する方法。

By |

Unityでのアプリ内のムービー表示方法と、常に正しい解像度と比率を維持するように設定する方法。

How to create a movie screen with unity, and to set it to keep the right resolution and ratio at all time.  ユニティでムービー画面を作成する方法と、常に正しい解像度と比率を維持するように設定する方法。   First you will need to import a video, the list of the supported format in unity can be found here :  最初にビデオをインポートする必要があります。サポートされているフォーマットのリストはここにあります:  https://docs.unity3d.com/Manual/VideoSources-FileCompatibility.html   Next, to be able to render the…

Unity+Myo(ジェスチャーを活用して牛乳を搾るゲームを作りました)

By |

Unity+Myo(ジェスチャーを活用して牛乳を搾るゲームを作りました)

Blogをいつもご覧いただきありがとうございます。先日「Myo」のジェスチャーでゲームを作ってみましたので今回はここでジェスチャーの使い方を紹介しようと思います。 下記のURLはゲームの映像です。 · Myoってどんなもの? Myoアームバンドは、腕、手首、指のジェスチャーで、デバイスをワイヤレス操作することができます。 下記のURLはMyoの公式サイトです。 https://www.myo.com · Myoのジェスチャーの紹介 デフォルトで認識するプリセットジェスチャーは下記のとおりです。 · グー(Fist) · パー(FingersSpread) · ダブルタップ(DoubleTap) · 手首で手を左に仰ぐ動作(WaveIn) · 手首で手を右に仰ぐ動作(WaveOut) · リラックス(Rest)   「グー」と「パー」を合わせて、モミモミすることができそうなので、私はこの二つのジェスチャーを利用して牛乳を搾るゲームを作りました。それでは、ジェスチャーの部分に入りましょう。 · sdkの導入 環境状況: Unity2018.1.0f2 SDKバージョン:Windows SDK 0.9.0 Firmware: 1.5.1970 https://developer.thalmic.com/downloads SDKを持っていない人は上記のサイトからダウンロードできます。 SDKをダウンロードして、Unityにインポートしましたが、エラーが三つ出ました。 エラーが発生しているスクリプト(ColorBoxByPose)をチェックしたら、レンダリングの設定の書き方が古すぎますので、Unity2018.1.0f2(恐らくUnity2017以降のバージョン)では、書き方を変える必要がありますね。   では、そこの書き方を変えましょう! 上記のように修正してエラーが消えるはずです。 次はMyoをコントロールするために、SDKが用意してくれたプリハブをシーンに入れます。 サンプルシーンの中で「Joint」というGameObjectがあります。このGameObjectに存在するスクリプト(JointOrientation)がMyoデバイスの方向を管理しています。これをプリハブにして、自分のシーンに適用します。 方向を制御するスクリプトできたので、次はジェスチャー検出のコードですね。 それでは、ジェスチャー検出用のスクリプトを作りましょう。 そのオブジェクトに自分が作った「gManager」を入れて、ジェスチャー検出のコードを全部このスクリプト内に記述することにします。 これで、SDKのプラグインの導入が完了しました。 · ジェスチャー検出 例: using System.Collections; using System.Collections.Generic; using UnityEngine;…

Unity3Dタイルマップ作成時の注意点

By |

Unity3Dタイルマップ作成時の注意点

Unity3D has a tile map system that allows you to make 2D maps with no programming at all. This tool is available for free with the unity base package and can be expanded with the 2D extras package found in unity’s GitHub. It’s fairly easy to use but if you are not careful when setting it up you could have a hard…

(Unity3D)ダイナミックボタンアクション

By |

(Unity3D)ダイナミックボタンアクション

あるゲームのUIを作っている間にボタンに関する問題に遭遇しました。選択されたエンティティによって、表示されているボタンが変わるようにしたいと思いました。 もちろん一つずつのエンティティのGameObjectを準備して場合によってSetActive()trueかfalseにしてもいいですが、スケーラビリティは?エンティティを追加しようとする毎に新しいGameObjectを準備しますか?そんな面倒なことは勘弁してほしいですよね。 ということでスケーラビリティのため、エンティティを選択する時にボタンが編集され、ちょっとしたアルゴリズムを書きました。  こういうシステムが入っているUIを作る人がいて参考になればと思い、分かりやすいバージョンを準備して下記にそのケースを紹介します。  想定ケース:  1.エンティティによる、ボタンの数が異なる場合でもOK。  2.ボタンの見た目を編集可能にする。  3.ボタンのアクションがstringの引数を受け取れる。  4.簡単にするため、ボタンの最大数は10にします。  先ずはボタンの情報をまとめるクラス“ActivityButton“をつくります。  public class ActionButton { public UnityAction<string> theAction; public string argument; public Sprite sprite; public ActionButton(UnityAction<string> act, Sprite sprite, string arg=””){ theAction = act; argument=arg; this.sprite = sprite; } } UIマネージャーにはButton、Image、GameObjectの配列を必要です。パブリックなGameObjectの配列を作ってシーンからボタンをドラッグして、Start()でButtonとImageの配列を作りました。  public class MyEpicUIManager : MonoBehaviour { Button[] actionBtns; Image[] actionImgs; public GameObject[] actionBtnObjs; void Start…

特定のUI要素上でマウスのローカルポジションを見つける

By |

特定のUI要素上でマウスのローカルポジションを見つける

まず、特定のUI要素が特定されているかどうかを調べる必要があります。UI要素がマウスでクリックされているかどうかを判断する方法は複数ありますが、最も一般的な方法は、UnityのPointerEventSystemを使用することです。使用できるようにするには、イベントをトリガーするために必要なさまざまなインターフェースと“using UnityEngine.EventSystems;”というNamespaceを実装する必要があり、SceneのHierarchyにEventSystemを追加することも必要です。また、スクリプトはトリガーされたオブジェクト上にある必要があります。   このEventSystemの詳細については、このリンクをご覧ください: https://docs.unity3d.com/ScriptReference/EventSystems.PointerEventData.html   EventSystemの実装例を次に示します:   別の方法はUnityのBoundsを使用します。 イメージのようなUIオブジェクトでそれを使用できるようにするには、コライダーを置いてオブジェクトと同じサイズにする必要があります。次に、Boundsを見つかるために、このコライダーコンポーネントをスクリプトで取得します。これにより、マウスの位置がこれらの範囲内にあるかどうかを確認することができます。   Bounds についての詳細は、このリンクをチェックしてください: https://docs.unity3d.com/ScriptReference/Bounds.html   Bounds の実装例を次に示します:     オブジェクトをHoveringしていることがわかったので、次のステップは、マウスの位置を世界に相対的ではなく、そのオブジェクトに関連させて見つけることです。そのために、UnityのRectTransformUtilityを使用することができます。ローカルのRectTransformを新しいスクリーン位置として設定することができます。   RectTransformUtility についての詳細は、このリンクをしてください: https://docs.unity3d.com/ScriptReference/RectTransformUtility.html https://docs.unity3d.com/ScriptReference/RectTransformUtility.ScreenPointToLocalPointInRectangle.html   RectTransformUtility の二つの実装例を次に示します、1つはBoundsシステムを使用し、もう1つはEventSystemを使用します。   Boundsシステム:   EventSystem: *canvasがScreen space – Overlayに設定されているため、カメラパラメータはnullに設定されています。   このlocal mouse positionはいろいろな使い方ができます。 たとえば、カンバスにある、レンダーテクスチャを使用してミニーマップ上でクリック位置を取得することができます。

Myoのジェスチャーでコントロールするアプリのデモ

By |

Myoのジェスチャーでコントロールするアプリのデモ

Thalmic Labs 社のMyoというアームバンド型のコントローラーを使って、ジェスチャーを使って操作するアプリのデモを作成しました。 手のグー、パーによって操作するシンプルなゲームです。またジェスチャーによるメニュー選択を実装してみました。

Vuforiaで大きいオブジェクトを表示するためのアドバイス

By |

Vuforiaで大きいオブジェクトを表示するためのアドバイス

Vuforiaで大きいオブジェクトを表示するためのアドバイス マーカーとそのサイズとの関係 VuforiaのImageTargetと表示されて欲しいオブジェクトのサイズは相関関係があります。 例えばオブジェクトを2m*2mのサイズで表示したい場合、ImageTargetのサイズを0.2m*0.2mにして、 印刷したイメージも0.2m*0.2mサイズに出力をしなければなりません。 もし正しく設定されていなければ、オブジェクトが表示されるときの比率が壊れてしまいます。 オブジェクトをその場に残す方法 大きいオブジェクトの全体を表示するためにVuforiaのExtended Trackingはとても便利です。 ImageTargetのオプションをEnableにすると、 イメージからスマートフォンのカメラがちょっと離れてTrackingがなくなっても、 オブジェクトが残ります。 ARCameraのゲームオブジェクトのWorld Center ModeオプションをCameraにすると、 オブジェクトを中心に回り込むような表示がかのうです。 イメージターゲットは床でも壁でも、Unity内でオブジェクトのローテーションを変えることで、対応可能です。 マーカーとカメラとの角度で発生する問題 オブジェクトのカメラを通しての見え方(カメラアングル)はマーカーを 認識したときにデフォルトの仰角が決まります。 床においたマーカーとスマートフォンのカメラとの角度に関する注意点 そのため、床にマーカーを置きオブジェクトを表示した場合、 カメラのポジション(デフォルトの仰角)はマーカーを認識した際決定されるので、カメラを水平にして、 オブジェクトが正面ではなく少しずれた表示になります。 床にマーカーを配置した際のスマートフォンのカメラとの距離に関する注意点 マーカーを床に置くとカメラとイメージが必然的に遠く離れるため(ユーザが立っている場合) マーカーとユーザーのスマートフォンのカメラとの角度が浅くなるので認識しずらくなります。 大きいオブジェクトのマーカーは壁に配置がおすすめ 壁にマーカーを配置する場合はその問題はないでしょう。 イメージを壁に置いたらその高さを測定し、 Unity内でのImageTargetの高さと現実の世界のイメージの高さを合わせてください。 イメージか、QRコードか 最近QRコードはとても人気になりました。雑誌とかデパートの製品とかにどこでも使みかけます。 VuforiaもQRコードが使えますが色々悪いポイントがあります、 大きな欠点はトラッキング(カメラからの認識)の問題です。 大きいオブジェクトを表示するには比較的大きなQRコードコードを全部をスキャンする必要があります。 カメラがQRコードを認識する際、スキャンの角度やライトの明るくさは足りないとTracking機能が正しく動作しないことが多くなります。 一方、イメージであればQRコードよりも認識の向上が期待できます。 イメージであれば、画像の一部を認識できれば、マーカーとして機能するからです。 (※QRコードは全体が認識されないとオブジェクトが表示されない) 認識率を上げるため適切な写真を選ばなければなりません。 Vuforiaが推奨するイメージの条件は下記の三つです。1)ディテールが多いイメージ。 →頂点が画像の中に多く含まれるイメージ 2)いいコントラストのイメージ。 3)同じパターンではなく、色々な形が含まれている写真のほうがいい。 →有機的なパターン https://library.vuforia.com/articles/Best_Practices/Attributes-of-an-Ideal-Image-Target 以上がカメラにやさしいイメージの条件ですが、一つ付け加えるならば方向が分かりやすいほうがよいでしょう。 3つの条件にあう写真に画像ソフトでマークを付けくわえれば、配置する際に人間にとって便利です。

HTC VIVEでポジションリセンターを行う(UNITY)

By |

HTC VIVEでポジションリセンターを行う(UNITY)

Oculus Riftに比べて、HTC Viveのドキュメントは決して豊富とはいえません。 UnityのUnityEngine.VR.InputTracking.Recenter(); の関数が使えないなど、UnityのネイティブVRサポートも正しく動作しないことがあります。 例えば、作成中のゲームでStanding ModeやSeated Mode使おうとした場合SteamVRのValve.VR.OpenVR.System.ResetSeatedZeroPose (); を利用することになるとおもいますが、Room-Scaleでのプレイヤー位置のリセットの場合はその関数は動かないことを前提としえいる為利用することができません。 そこでルームスケールでの位置リセットを実現するため、スクリプトを作成しましたのでシェアしたいとおもいます。 上記のスクリプトでは、VRの体験者はPlayRoomのRoomScale内のどこでもいても、ゲームを起動するとスタートの際、ゲーム内の初期ポジションに配置されます。 そしてゲーム始まった後、またその決めた場所に戻させるスクリプトです。 ゲームが一旦始まった場合でも矢印↑キーをおせば、ゲームの初期ポジションに戻すことができます。 細かい部分についてはまた次回に説明したいと思います。    

HoloLensの開発(Unity)

By |

HoloLensの開発(Unity)

今回はUnityを使ってHoloLensでシンプルなCubeオブジェクトを表示するアプリをビルドしてみましょう。参考にするのは https://developer.microsoft.com/en-us/windows/mixed-reality/academy になります。 Microsoftの上記のドキュメントをしっかり読んでもいいですが、私のようにイライラしてしまうといけないのでCubeを出すのに必要な部分を抜き出して手順を下記に説明してみます。 まず、HoloLensの値段を見て絶望しないでください、HoloLensなしでも開発できます。ただし、HoloLensがない場合はWindows “Pro”が必要です(できればWindows 10) Windows”Home” ではHoloLensのエミュレータが動きません。では、早速始めましょう。 Unityで新しいプロジェクトを作ってください。 キャメラのセットアップ。Main Cameraを選択してインスペクターで: Positionを(0,0,0)にしてください。 Clear FlagsのドロップダウンをSkyboxからSolid Colorへ BackgroundをRGBA(0,0,0,0)にして「黒」 Near Clip Planeを0.85に プロジェクト設定 メニューバーのEdit > Project Settings > Qualityを選択します ウインドウズストアのロゴの下のドロップダウンからFastestを選択 メニューバーのEdit > Project Settings > PlayerのWindows StoreタブのOther Settingsで Virtual Reality Supportedをチェック Virtual Reality SDKsのリストにWindows Holographicが入っているを確認 ホログラムを作り Cubeでもシーンに入れて Cubeを選択された状態でインスペクターでPositionを(0,0,2)にしたらオブジェクトがユーザーのスタート位置から2m前にあるように見えます CubeのScaleも(1,1,1)だったら1mのCubeが見えますのでもうちょっと小さくしましょう(0.25,0.25,0.25)にしたら、25㎝のCubeになります。 シーンを保存 UnityからHoloLensでテスト(HoloLens必要) HoloLensのストアからHolographic Remoting Playerをインストールして、起動するとIPが表示され、待機状態になります UnityのメニューバーでWindow > Holographic Emulation.を選択…

GLSLで書いたシェーダーをUnityのマテリアルにセット、WebGL出力してみます

By |

GLSLで書いたシェーダーをUnityのマテリアルにセット、WebGL出力してみます

Unityでシェーダーを書く機会は中々ありませんでしたが、今後のためにもGLSLでシェーダーを書いてみます。 GLSLの特徴はOpenGLに使えるという点です。ということは、スマートフォンゲームやWebGL(ブラウザ)に応用することもできます。また、言語的には、ほぼCに近い、ポインタのないC言語といった印象があります。(今回、細かな言語仕様の説明は割愛させていただきます。) まずはGLSL on ブラウザで書く まずは純粋にGLSLのフラグメントシェーダーだけを書いて試してみたいと思います。 これにはGLSL Sandboxというサイトを使います。このサイトでは、WebGL経由でシェーダーのGLSLコードをリアルタイムプレビュー、さらにjsdoitのようにギャラリーやフォークなどもできます。先にここで書く理由は、ちょっと寄り道してみたかったからです。w WebでもUnityでもどっちでも動くと良いですし。 ちなみに、GLSL Sandboxの開発にはthree.jsの@mrdoob氏など、著名開発者が名を連ねています。 凝ると際限がないと思いますが、そこそこ見栄えしてきたら次のステップへいきます。 デモはこちら : http://glslsandbox.com/e#29054.0 ソースは以下の通りです。 ポイントは(というほどではありませんが・・)時間経過を元にして三角関数を動かしているところです。 #ifdef GL_ES precision mediump float; #endif uniform float time; uniform vec2 resolution; void main( void ) { vec2 position = ( gl_FragCoord.xy / resolution.xy ) – 0.5 ; vec3 col = vec3(0.0,0.0,0.0); //15個円を描く for(int i = 0; i…

Go Top