- 投稿日:2021-04-27T19:44:48+09:00
【MRTK】 HoloLens2 Azure 音声認識サービス チュートリアル やりました
HoloLens2 Azure 音声認識サービス チュートリアル をやりました。 開発環境 HoloLens2 Windows 10 pc Unity 2019.4.1f1 MRTK ver2.5.3 出来たもの 音声認識 & 文字起こし MRTK Tutorial Azure Speech Services を使用した文字起こし#MRTK #Unity pic.twitter.com/RlWgZmaYrw— 原口昂弥 (@k_haraguchi55) April 27, 2021 音声コマンド HoloLens2 Azure 音声認識サービス チュートリアルやりました。#MRTK #HoloLens2 pic.twitter.com/9xF4U4sCpl— 原口昂弥 (@k_haraguchi55) April 26, 2021 音声認識 & 翻訳 MRTK TutorialAzure Speech Translation を使用した翻訳#MRTK #Unity pic.twitter.com/FiwRQTPhbv— 原口昂弥 (@k_haraguchi55) April 27, 2021 自然言語理解 MRTK TutorialAzure Language Understanding を使用した自然言語理解 pic.twitter.com/NYBreU5dsu— 原口昂弥 (@k_haraguchi55) April 27, 2021 Unityの音声認識は内部でWindowsの音声認識を使用するのでOSで設定された言語で認識します。(Macでは動作しません) なので今回は日本語でこの部分を行いました。 やり方 1. LUISアプリの作成時のカルチャーを"Japanese"にする。 2. 学習データを日本語にする。 3. LunarcomIntentRecognizer.ProcessResults を書き換える。 LunarcomIntentRecognizer public void ProcessResults(string targetButton = null, string actionToTake = null) { switch (targetButton) { //case "launch": case "打ち上げ": CompleteButtonPress(actionToTake, targetButton, LaunchButton); break; //case "reset": case "リセット": CompleteButtonPress(actionToTake, targetButton, ResetButton); break; //case "hint": case "ヒント": CompleteButtonPress(actionToTake, targetButton, HintsButton); break; case "hints": CompleteButtonPress(actionToTake, targetButton, HintsButton); break; default: CompleteButtonPress(); break; } } これで日本語で進めることができます。
- 投稿日:2021-04-27T16:48:47+09:00
unityでfbxのテクスチャが反映されない、外れる時
Unityにfbxをインポートすると、テクスチャが張られていない時があります。 モデルが真っ白になっていますね そんな時は、モデルの同階層にTextureのフォルダを作ってあげて InspectorからTextureのExtractTextureをクリックして 先ほど作ったテクスチャファイルを出力先に選択すると モデルにテクスチャが付き テクスチャデータがTextureフォルダに出力されます Unityにインポートするとなぜ反映されてないんでしょう、、、 今回こちらの3Dモデルを使用させてもらいました https://free3d.com/ja/3d-model/one-dollar-bill-79687.html
- 投稿日:2021-04-27T16:48:47+09:00
unityでfbxファイルインポート時にテクスチャが反映されない、外れる時
Unityにfbxをインポートすると、テクスチャが張られていない時があります。 モデルが真っ白になっていますね インポートしたモデルデータからマテリアルを外部アセットとして抽出することで テクスチャを反映させることが出来るようです。 インポートしたモデルのInspectorからMaterialsタブを選択し LocationのUse External Materials(Legacy)を選択してApplyボタンを押しましょう。 すると、テクスチャフォルダとマテリアルのフォルダが出力され モデルにテクスチャが反映されましたね Scene Viewで確認します モデルにテクスチャを当てることが出来ました。 また、モデルのシェダーを変更することが出来ます。 モデルに影を落としたくなければShedlerからUnlitのTextureを選びます。 すると、光情報なしにテクスチャがそのまま表示されます モデル表面に影がかからず明るくなりましたね テクスチャデータだけ抽出したい場合は モデルの同階層に抽出先になるTextureのフォルダを作ってあげて InspectorからTextureのExtractTextureをクリックして 先ほど作ったテクスチャファイルを出力先に選択すると モデルにテクスチャが付き テクスチャデータがTextureフォルダに出力されます 余談ですが、まつ毛とかのテクスチャはUnlitにすると透明部分が黒くなってしまうので Standerd にシェダーを変更しRenderring ModeをCutoutとかに変更していますが、何かいい方法があったら教えてください 参考にさせてもらったサイトはこちら https://sirohood.exp.jp/20190219-1973/ Unityリファレンス Materials https://docs.unity3d.com/ja/2018.4/Manual/FBXImporter-Materials.html 今回こちらの3Dモデルを使用させてもらいました https://free3d.com/ja/3d-model/one-dollar-bill-79687.html
- 投稿日:2021-04-27T13:33:27+09:00
【Unity】NCMBでプッシュ通知を実装しよう!
今回はニフティクラウドバックエンド(NCMB)というサービスを使って、Unityアプリにプッシュ通知を実装してみました。 その流れや実装方法についてお伝えしていきたいと思います。
- 投稿日:2021-04-27T12:42:33+09:00
ゲームでよくあるアイテムが手前に来るやつ
ゲームでよくあるやつ 先日、推しが配信で「フードデリバリーサービス」というゲームをプレイしていた。 そのゲームの以下のような描写を見て「作れそう」と思ったので作りました。 ソースコード LookingItemBehaviour.cs using UnityEngine; public class LookingItemBehaviour : MonoBehaviour { [SerializeField] private Transform target; [SerializeField] private float moveDuration = 2f; private float moveProgress = 0f; private bool isNeedMove = false; private bool isNeedReturn = false; private Vector3 startPosition; private Quaternion startRotation; void Start() { startPosition = transform.position; startRotation = transform.rotation; } void Update() { // Test if (Input.GetKeyDown(KeyCode.Return)) StartMove(); if (Input.GetKeyDown(KeyCode.Space)) StartReturn(); if (isNeedMove) { moveProgress += Time.deltaTime / moveDuration; if (moveProgress >= 1f) moveProgress = 1f; transform.position = Vector3.Lerp(startPosition, target.position, moveProgress); transform.rotation = Quaternion.Lerp(startRotation, target.rotation, moveProgress); } else if(isNeedReturn) { moveProgress -= Time.deltaTime / moveDuration; if (moveProgress <= 0f) moveProgress = 0f; transform.position = Vector3.Lerp(startPosition, target.position, moveProgress); transform.rotation = Quaternion.Lerp(startRotation, target.rotation, moveProgress); } } public void StartMove() { isNeedMove = true; isNeedReturn = false; } public void StartReturn() { isNeedReturn = true; isNeedMove = false; } } 仕組みはいたって単純 ターゲットを指定してそのターゲットと同じpositionとrotationに指定時間で変化するというもの。 動作テスト SmartPhoneというオブジェクトにLookingItemBehaviourをアタッチしています。 シーンビューの赤い球がtargetに指定してあるItemPositionの位置です。 テスト用にEnterキーで手前に、Spaceキーで元の場所に戻るようコード内に記述をしています。 以下、動作している様子 うごいたー 今後の改良 このままではゲームに組み込みづらいので移動終了時のイベントなどを追加してもっと汎用的に使えるよう改良しようと思います。いつか
- 投稿日:2021-04-27T12:20:30+09:00
Oculus Quest 2で Unity のサンプルVRアプリを実行する
概要 Oculus Quest 2でUnityのサンプルVRアプリを実行するまでの手順。 スマートフォンはAndroid 10、開発環境はMac(macOS Big Sur)。 以下のサイトを参考に、Macで開発手順をなぞった程度。 Unity + Oculus Quest 2 開発メモ 1. セットアップ 1.1. Unity Hubのインストール Unity公式サイト(日本語)の個人向けプランから、Personalの「はじめる」をクリックする。 「新規ユーザー」の「始めよう」をクリックする。 利用規約を確認し、「同意してダウンロード」をクリックすると、Unity Hubのインストーラーがダウンロードされる。 Unity Hubのインストール、またHubによるUnityのインストールがうまくいかない場合は、「リピートユーザー」のUnity Hubダウンロード画面から「Instration Assistant」をダウンロードしてUnityを個別にインストールすることもできる。 ただし、AndroidなどはSDK、NDKなどの外部ツールのバージョンを手作業で合わせることがあるため、うまくバージョン調整をしてくれるHubをなんとかインストールする方が無難。 ダウンロードしたインストーラーを起動し、規約に同意、Applicationフォルダにドラッグアンドドロップでインストールする。 1.2. Unity IDの初期設定 Unity Hubを起動する。 画面の指示に従い、Unityのインストール、Unity IDを作成する。 マイクロゲームは「3D」を選択する。 Unityが起動する。(一旦ここまで) 1.3. Unityのインストール 初期設定で、最新LTSのバージョンがインストールされている。 他のバージョンや追加モジュールをインストールする場合は、Unity Hubを使用する。 Unity Hubを起動する。 画面左の「インストール」を開く。 右上「インストール」をクリックする。 画面の指示に従い、Unityをインストールする。 Unityのバージョンを選択する。 モジュールをインストールに加える。 ここでモジュールを選択するが、失敗する場合は本体のみインストールし、ログで ログはUnity Hubの右上のアカウントから、「トラブルシューティング > ログフォルダーを開く」で参照できる。 「実行」をクリックする。 1.4. プロジェクトの作成 Unity Hubを起動する 左メニューの「プロジェクト」の「新規作成」にて、対象のUnityバージョンをクリックする。 VRの場合はテンプレート「3D」を選択し、「プロジェクト名」と「保存先」を記入し、「作成」をクリックする。 プロジェクト名は数字はじまりなどはNG(ビルドできない) Unityが起動すれば完了となる。 2. サンプルVRアプリのビルド 参考動画:【xR Tech Tokyo枠】xR Developers Community Conference 2.1. アプリの設定 Unity Hubから"2020.3.5f1"でプロジェクトを作成する。 Android Build Supportを追加する。 一緒に追加するとインストールが終わらなかったため、本体をインストール後、モジュールの追加でインストールした。(固有の問題?) gitでバージョン管理をする。 設定が複雑なことと、設定変更やビルドにかなり時間がかかるため、gitで戻れるようにしておくと便利。 .gitignoreは以下としている。 /Library /Logs /Temp プロジェクトの設定をする。 「File > Building Settings」を開き、以下を設定する。 Android Texture Compression: ASTC 「Switch Platform」を実行する 「Building Settings」の左下の「Player Settings」、または「Edit > Project Settings」で「Player」を選択し、以下を設定する。 Company Name: 任意 Product Name: 任意(数字始まりなどはNG) Other Settings Color Space: Linear Vulkan→削除 Package Name: (Company Name、Product Nameを確認) Minimum API Level: Pie 28(参考サイトは23) Scripting Backend: Mono リリース時はIL2CPP、Target ArchtectureをARM64にしないと審査が通らないが、ビルドがかなり時間がかかる。 今回は軽くするためMono、 ARMv7にする。 Oculus Integrationをインストールする。 「Window > Asset Store」を開く。 「Search Online」をクリックし、ストアを開く。 ストアで「Oculus Integration」で検索し開く。(結果の2つ目にある) 「Open In Unity」をクリックし、Package Managerに読み込む。 Package Manager右下の「Download」をクリック、その後「Import」をクリックする。 Importリストで不要なコンポーネントは除く。(Avatar、LipSync、SampleFramewokなど) Importをする。Upgradeを求められれば実施する。 必要なパッケージをインストール、設定する。 Package Manager右上のPackagesで「Unity Registory」を開き、以下をインストールする。 「XR Plugin Management」を選択し、「Install」をクリックする。 「Oculus XR Plugin」を選択し、「Install」をクリックする。 「Edit > Project Settings」を開き、以下を設定する。 XR Plugin Management Android > Plugin Providor: Oculus PC > Plugin Providor: Oculus XR Plugin Management > Oculus Android > Stereo Rendering Mode: Multiview PC > Stereo Rendering Mode: Single Pass Instanced ここで、PC/Mac用のアプリであればビルドができる。 PCは「Building Settings」でPCを選択して「Build & Run」を実行する。 2.2. Oculus Quest 2 の開発者モード化 スマートフォン(Android)にOculusアプリをインストールし、画面の指示に従い、初期設定を行う。 Quest 2スタートガイドの「Oculus Quest 2ヘッドセットを設定するには、どうすればよいですか。」を参照。 Oculus Quest 2とOculusアプリがペアリングするところまで実施する。 Oculusアプリを開き、右下の「設定」を開く。 接続されている Oculus Quest 2をタップで開いて「その他の設定」を開く。 「開発者モード」を選択し、「オン」に変更する。 2.3. アプリのビルド Oculus Quest 2をUSB Type-CケーブルでPCに接続する。 Oculus Quest 2の画面に「USB デバッグを許可しますか?」などいくつかダイアログが出るので許可する。 2.1で作成したUnityプロジェクトにて、Assets > Oculus > VR > Scenes > ControllerModels(VRのサンプル)を開く。 File > Building Settingsを開き、「Build & Run」を実行する。ダイアログなどが出たら許可する。 Oculus Quest 2にアプリが表示されればビルド完了。 終了するときはQuest 2側で、アプリを閉じる。
- 投稿日:2021-04-27T06:29:56+09:00
【2021年版】俺が耳にした技術
あなたはプログラミングの文法を学びました。 では今から作りたいものを作ろうと思い、コンソールアプリ作成を始めます。 しかし、ちょっと待ってください。 それって本当にその方法しかないのでしょうか?もっと効率的で革新的な道具があるのではないでしょうか。 「知る機会」という言葉があるように、その効率的で、革新的で、魅力的で、世界中で議論を巻き起こしているツールはあなたが自発的に調べる、または他人から聞くまでは存在しないも同然です。もちろんその世界中の議論も、あなたの友人がちょっとだけ楽をして良い成績を残している事実も存在しないままなのです。 情報っておそろしいですよね。今回はそんな知る機会の足しになるように、とこの記事を作らせていただきました。 (年内は俺が耳にする限り随時更新) と長い前書きでしたが要は流行に乗り遅れないように頑張る凡人のおぼえ書です。いやぁ情報にセンシティブにありたいなぁ、と感じます。ここにない技術をお知りでしたら「〇〇」みたいに簡単にコメントを残してもらえると幸いです。勝手に調べて勝手に足しておきます。 構成 技術を大分類に分けています。マジの基本的なことは書いてないのでそこらへんのすごい人が書いた入門記事とかつまんだり、チュートリアルで一杯やってから帰ってきてください。 易しい技術ほど上に来るように配置しています。 必須になる技術は書きません。多分普通に生きてればぶち当たると思うので。 基本系:プログラミングするならこれ知っとけ、っていうやつ web系 Unity系 人工知能系 基本系 VScode:すごい。すごいエディタ。SSHもできるしこれ一本で開発環境は完結しがち。 git:バージョン管理システム。とりあえずプロジェクト放り込んどけ。個人では保険、チームでは必須。 仮想環境:言語のバージョンを管理してくれる。これを使えばチーム間でのバージョン統一が楽だったり恩恵がすごい。 cron:定期的にプログラムを動かしてくれるやつ 公開鍵・秘密鍵:いつもの認証をなくすことができる。 bashrc、bash_profile:ログイン時やバッシュ立ち上げ時に自動でいろんなことやるためのもの Docker:仮想環境をプロセスごと割り当てれるようにしたもの。 Web系 Node.js:javaの仮想環境。 React:javaのwebフレームワーク。DMの必要な部分のみを更新できる。しかもサーバー側の変更が勝手に反映される(この仕組みは自分もよくわかってない) ElasticSearch:カラムを事前に設定する必要がないデータベース。 クロスプラットフォームフレームワークは色々あるので必要に応じて検索してどれが良いか決めると良いと思います。 AzureやAWSなどは死ぬほどあると思うので自分で決めてください。 Unity系 アセットストア:ゲームに使える素材を配布または売っている。ゲーム全部作るのは無理。楽できるところは楽しよう。 PlayMaker:スクリプトが書けなくてもゲームが作れるようにしたもの。使ったことない。 TextMeshPro:正直文字出したいなら使うしかない。 uGUI:俗にUIと言われる部分はこれで作るべき。じゃないとサイズ調整とかが大変。(もちろん例外もある) TileMap:特に2Dの俗にいうタイル移動をするゲームで使えるシステム。 NavMesh:簡単に敵AIが作れる機能。 Chinemachine:アニメや映画のような滑らかなカメラワークを自動で作ってくれる。 Timeline:動画などキャラクターが順番に動くようなものに使う。 リグ(Humanoid):キャラクターを動かすための仕組み。 Photon:リアルタイム通信ゲームを作ろうと思ったときに一番簡単に導入できる。 Fungus:ゲームの対話シーンを簡単に作れる。 Dotween:アニメーションのパラメーターをスクリプト内で動的に変化させられる。 Live2D:2.5次元みたいなやつ。立体的な二次元のキャラクターが作れる。 ポストプロセッシングエフェクト:カメラをちょっといじっていい感じにする。 HDRP:UnrealEngineのような、よりリアルなゲームを作るためのUnityの機能。 Atlas:スプライト(画像)をまとめて一枚の画像にしてサイズを小さく抑える仕組み。 UniRX:Unityで非同期処理・イベント処理を簡単に書ける。 シェダー:書ける人すごいよね。動的にオブジェクトの表面を変える技術。 LINQ:コレクションの中から条件に合うものを取り出しやすくなる。データベースのように扱える。 ECS:アーキテクチャパターンの一種。考え方や作り方が変わるのかな。 アセット系 RayFire:有料アセット。物体を粉々に壊してくれる。 EasyPerformantOutLine:物体の輪郭に光る線を追加してくれる。ゲームの視覚効果の基本が簡単に実現できる。 人工知能系 フォトグラメトリー:写真から3Dモデルを生成する技術。 スクレイピング:Web上にある情報をボットでとってくる。 BeautifulSoup:スクレイピングができるライブラリ。これくらいしか知らない。 tensorflow、keras:言わずと知れた人工知能ライブラリ。 torch:上のをちょっと細かく書かせてくるライブラリ。使いづいわけではない。 OpenCV:画像認識ならこれ!って言われてる。 numpy:特に深層学習においてデータを計算可能な配列にするときに使う。 pandas:いろんなデータを学習で扱いやすい形式にしてくれる。 形態素解析:文を意味のある最小単位に切ること。例えば「太郎は花子だ」→「太郎/は/花子/だ」を自動で行う。 openpose:画像に写ってる人物の骨格推定に使う。モーションキャプチャに利用可能。 BERT:文脈を読めるようになった奴。 GPT-3:勝手に文章の続きを書くすごいやつ。自らがAIを説明する精巧な文章を書いたことで有名になった。自然言語生成のみだけではなく画像生成や口語の説明からHTML生成なども行える。 DeepFake:人の顔を他人の顔で置き換えて表情もつけるすごいやつ。逆に人の顔を自分の顔に連動させて動かすことも可。 GAN:敵対的生成ネットワーク。実在しない人や物を生成できる。
- 投稿日:2021-04-27T04:09:11+09:00
【Unity】ボタンを押している間だけ数字を増やす
完成形 要素 ・ボタンを押す、離す判定 ・ボタンを押したままの状態(Hold)の処理 ・スコアのテキスト変換、表示 ・何秒毎に数値を増やす スクリプト CountScript.cs using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; public class CountScript : MonoBehaviour { public Text countText; private int count = 0; private bool buttonDownFlag = false; private float timeleft = 0.04f; void Update() { if (buttonDownFlag) //buttonDownFlagがtrueの時 { Debug.Log("Hold"); timeleft -= Time.deltaTime; if (timeleft <= 0.0) { timeleft = 0.04f; //1秒間に+25したい=1/25秒毎に+1 count++; countText.text = count.ToString(); } } } //ボタンを押した時の処理 public void OnButtonDown() { Debug.Log("Down"); buttonDownFlag = true; } //ボタンを離した時の処理 public void OnButtonUp() { Debug.Log("Up"); buttonDownFlag = false; } } 細かい手順 1, UI設置 Unity上でTextとButtonを配置する 2, Buttonの設定をする スクリプトを書き、Buttonにアタッチする アタッチしたらButtonにEventTriggerをつけ、 PointerDown と PointerUp をつける。それぞれ関数を紐付ける 参考:https://sole-game-creater.com/unit-button-hold-it-down/ 3, カウント設定 スクリプトの最初に「using UnityEngine.UI;」が無かったら書き足す Unity上でHierarchyのTextオブジェクトをButtonに紐づいているスクリプトにアタッチしておく。(GetComponentの代わり) あとは上記のスクリプト通り(Updateのif(buttonDownFlag)の中) ここでは1秒ごとに25足したい(4秒押し続けると100になるようにしたかった)ので、 1/25つまり0.04秒毎に+1をする処理にした。 なのでtimeleft = 1 にすると、1秒ごとに1増える普通のカウントになる。 つまづいたこと 初めてやったときにつまづいたこと。 ・PointerDownだけでHold判定になっていると思っていた このEventTriggerで押し続けている処理になってると勘違いしてました。 実際はボタンを押した時だけの処理です。 押し続けているHold状態の処理をするためにFlagを使います buttonDownFlagというものを用意して、ボタンを押したらtrue、離したらfalseにします。 そしてUpdateの中(=1フレーム毎に実行)でtrueの時の処理を書くことで、「押し続けている間処理をし続ける」ことができます ・1秒毎に+25をそのまま書いたら思ってたのと違った よく考えたら当たり前だけど、完成形のように数字を増やしたかったのに1秒で+25をそのままスクリプトに書いたら25、50、75・・・と段々に切り替わる感じで表示されてしまった(だから0.04秒毎に1増えるという書き方をしている) カウントする数値に上限を設けたい Updateの中のif文に書き足す CountScript.cs if (buttonDownFlag && count < 100)