- 投稿日:2020-01-07T23:11:46+09:00
HoloLens 2 開発入門 ~BoundingBoxとAppBar~(Unity2018.4.2f1、MRTKv2.2)
Cubeの表示は簡単なので、BoundingBoxとAppBarまでやります
開発環境
- HoloLens 2
- MRTK v2.2.0
- Unity 2018.4.2f1
- Visual Studio 2019
- Unity Hub 2.2.2
Unity プロジェクト作成
1.Unity Hubをインストールします
2. UnityのarchiveからUnity 2018.4.2f1をUnity Hubにインストールしてください
3.新規作成の右側の矢印から「Unity 2018.4.2f1」を選択、プロジェクト名を入力し、作成をクリックします
パッケージのインポート
1.MRTKv2.2.0から、下記5つのunitypackageをダウンロードし、Asset -> Import Package -> Custom Packageからインポートします
- Microsoft.MixedReality.Toolkit.Unity.Foundation.2.2.0.unitypackage
- Microsoft.MixedReality.Toolkit.Unity.Tools.2.2.0.unitypackage
- Microsoft.MixedReality.Toolkit.Unity.Extensions.2.2.0.unitypackage
- Microsoft.MixedReality.Toolkit.Unity.Examples.2.2.0.unitypackage
- Microsoft.MixedReality.Toolkit.Unity.Providers.UnityAR.2.2.0.unitypackage
設定
1.Build Settings から Universal Windows Platform を選択し、「Switch Platform」をクリックします
2.Consoleを見ると下記のエラーが出ているので、AR Foundationの設定を行います。Window -> Package Manager で、「AR Foundation」を検索する。見つからない場合は、Advanced -> Show preview packagesにチェックを入れておきます。
3.MRTK Project Configuratorが表示されたらApplyをクリックします
Cubeの配置
1.Mixed Reality ToolkitのAdd to Scene and Configure をクリックし、MRTKの設定を読み込みます(Mixed Reality Toolkitが見えない場合は、プロジェクトをReimport Allしてください)
2.HierarchyビューのMixed Reality Toolkitを選択し、InspectorビューのMixed Reality Toolkit(Script)からDefaultHoloLens2CongifurationProfileを選びます
3.Hierarchyビューの Create -> 3D Object -> Cube からCubeを作成、Transformを良い感じに設定します。
BoundingBoxおよびAppBarの表示
2.TMP Importer 画面が出るのでインポートします
3.文字がバグっているので、Projectビューで右クリックし、Reimport Allします
5.CubeのInspectorビューからBoundingBox.csをAddComponentし、Target ObjectとBounds OverrideにCubeをアタッチします
6.Audio SourceをAddComponentし、BoundingBoxのEventsの設定で、回転・スケールの開始終了時に音がなるようにします
7.AppBarのBoundingBoxにCubeをアタッチします
ビルドとデプロイ
1.Build SettingsからBuildをクリックし、Holo2フォルダを作成し、ビルドします
2.Holo2フォルダ内にある.slnファイルをVisualStudioで開き、Release・ARM・リモートコンピュータにし、IPアドレスを指定します。HoloLens2のIPアドレスの確認方法はHolographicRemotingアプリか設定のネットワークとインターネットから接続しているWiFiの詳細オプションに載っています
3.ペアリングしたことがないPCは、ピンコードを求められるので、HoloLens2の設定->更新とセキュリティ->デバイスの検出のペアリングで表示されるピンコードを入力してください
4.HoloLens2の電源をオンにしておき、Ctrl+F5でデプロイを開始、うまく配置されればUnity アプリが起動します。
デモ
Mixed Reality Captureで撮影した動画はズレているように見えますが、実際は触ってます。
BoundingBoxとAppBar #HoloLens2 pic.twitter.com/mijBVDvknk
— 藤本賢志(ガチ本)@HoloLens2 Ready (@sotongshi) January 7, 2020参考文献
- 投稿日:2020-01-07T18:54:11+09:00
バーチャルキャストですきすきチュッチュラブビームを撃ってみた
はじめに
本項目はバーチャルキャスト 1.8.3aで、バーチャルキャストでユーザーが自由に作成、取り込みが可能なVCIアイテムにアバター情報の取得機能が追加されました。
アバター情報の取得機能を使用し、ポーズに応じてエフェクトを再生するアイテムを作った際の備忘録です。
やりたいこと
1.アバター情報からボーンの情報を取得し、指の形を判定する。
2.指の形がハートかつ手が胸の前に1秒以上ある場合、待機エフェクトとして上昇するハートのエフェクトを再生する。
3. 待機エフェクト再生状態で腕を前に突き出すと、ハートの渦のエフェクトを再生する。
4. 指の形がハートから変化した場合、エフェクトの再生を取りやめる。指の形の判定
GetBoneTransform fun(boneName: string)を使用して、ボーンの情報を取得する。
boneNameについてはこちらを参照ボーンの回転量から指の形を判定する
GetBoneTransform(”ボーンの名前”).rotationでボーンの回転量を取得することが出来る。
Cubeを握り、コントローラーのボタンを押した際に、指のボーンの回転量を表示するようにしてみた
1回目
!!同じ指の形なのに、回転量が全く異なる...
指の曲がり具合(ボーンのローカル回転量)から指の形を判定しようとしていたが、変換処理を挟まないと出来ないらしい。ボーンの位置情報から指の形を判定する
ボーンの回転量から判定するには、変換処理が必要になる。どうしようかと検討していると、以下のコメントを頂いた。
作戦を変更し、ボーンの座標を取得し、位置情報(ボーン間の距離)から指の形がハートか以下の関数で判定する。
function LeftFingerHeartChk() local str = "" local flag = true -- 指の形の条件に合致するかのフラグ local handPos = Vector3.__new(0,0,0) local hand = owner.GetBoneTransform("LeftHand") -- 左手のボーン情報を取得する。 local retry = 0 while hand == nil and retry < 5 do -- ボーン情報取得APIは初回実行時にnilが返るため、リトライ処理を入れる hand = owner.GetBoneTransform("LeftHand") retry = retry +1 end if hand ~= nil then -- ボーン情報がnilでない場合、ローカル変数に手の位置情報をセットする。 handPos.x = hand.position.x handPos.y = hand.position.y handPos.z = hand.position.z else --print("hand") flag = false end local LeftFingerList = { LeftIndexIntermediate = { name = "LeftIndexIntermediate", pos={x=0,y=0,z=0}, dist = 0.0 }, LeftIndexDistal = { name = "LeftIndexDistal", pos={x=0,y=0,z=0}, dist = 0.0 }, LeftMiddleIntermediate = { name = "LeftMiddleIntermediate", pos={x=0,y=0,z=0}, dist = 0.0 }, LeftMiddleDistal = { name = "LeftMiddleDistal", pos={x=0,y=0,z=0}, dist = 0.0 }, LeftRingIntermediate = { name = "LeftRingIntermediate", pos={x=0,y=0,z=0}, dist = 0.0 }, LeftRingDistal = { name = "LeftRingDistal", pos={x=0,y=0,z=0}, dist = 0.0 }, LeftLittleIntermediate = { name = "LeftLittleIntermediate", pos={x=0,y=0,z=0}, dist = 0.0 }, LeftLittleDistal = { name = "LeftLittleDistal", pos={x=0,y=0,z=0}, dist = 0.0 } } for k, v in pairs(LeftFingerList) do -- テーブルをなめて、指の各ボーンの位置情報を取得、手のボーンとの距離を求める。 local trans = owner.GetBoneTransform(k) -- ボーン情報の取得 local retry = 0 while trans == nil and retry < 5 do trans = owner.GetBoneTransform(k) retry = retry +1 end if trans ~= nil and flag ~= false then v.dist = Vector3.Distance(handPos, trans.position) -- 手のボーンとの距離計算 v.pos = trans.position local idx = string.find(k, "Distal") if idx ~= nil then -- 第3関節のボーンの場合、距離に補正を入れる local header = string.sub(k, 1, idx-1) local name = header.."Intermediate" local dist = Vector3.Distance(LeftFingerList[name].pos, trans.position) v.dist = v.dist - (dist * 0.9) end else --print(k) end end -- 各指の第2関節と手のボーンとの距離、第3関節と手のボーンとの距離を比較する。 -- 第3関節が第2関節より、手首に近い場合、手の形がハートと判定する。 if flag ~= false then if LeftFingerList.LeftIndexIntermediate.dist < LeftFingerList.LeftIndexDistal.dist then --print("index") flag = false end if LeftFingerList.LeftMiddleIntermediate.dist < LeftFingerList.LeftMiddleDistal.dist then --print("middle") flag = false end if LeftFingerList.LeftRingIntermediate.dist < LeftFingerList.LeftRingDistal.dist then --print("ring") flag = false end if LeftFingerList.LeftLittleIntermediate.dist < LeftFingerList.LeftLittleDistal.dist then --print("little") flag = false end end return flag end※単純に第2関節と第3関節と手首の距離を比較した場合だと、アバターによっては第2関節の方が手首に近いと判定される場合があったので、補正をかけています。
上記は左手の場合、右手の指の形の判定も同様に判定関数を作成する。手が胸の前にあるか判定する。
手が胸の前にあるか判定する方法としては、胸から手までの距離が、肩からヒジまでの距離より短いかで判定することが出来る。
getBoneDist()を作成し、判定を行う。function getBoneDist() local flag = true -- 右手の座標取得 -- 左手の座標取得 -- 胸の座標取得 -- 右肩の座標取得 -- 左肩の座標取得 -- 右ヒジの座標取得 -- 左ヒジの座標取得 do if 右肩から右ヒジまでの距離 < 胸から右手までの距離 then flag = false end if 左肩から左ヒジまでの距離 < 胸から左手までの距離 then flag = false end end return flag end指の形がハートかつ手が胸の前に1秒以上あるか判定する
指の形と手の位置のチェックは全ユーザーで毎フレーム呼ばれるupdateAll()のイベントハンドラの中で行う。
エフェクトを仕込んだオブジェクトを移動させる必要があるため、オブジェクトの所有権を持つユーザーで判定処理は行う。---全ユーザーで毎フレーム呼ばれる function updateAll() local effItem = vci.assets.GetSubItem("effect") if effItem.IsMine == true then -- エフェクトを仕込んだオブジェクトを移動させるため、オブジェクトの所有権を持つユーザーで実行する。 local flag = LeftFingerHeartChk() local flag1 = RightFingerHeartChk() local flag2 = getBoneDist() if flag == true and flag1 == true and flag2 == true then -- 指の形がハートかつ手が胸の前にある条件を全て満たした場合 if effortTime == nil then -- 時間オブジェクトがnilの場合 -- 現在時刻から1秒後を時間オブジェクトにセットする。 effortTime = vci.me.UnscaledTime.Add(TimeSpan.FromMilliseconds(1000)) else local curr = vci.me.UnscaledTime local diff = TimeSpan.Compare(curr, effortTime) -- 現在時刻と時間オブジェクトを比較し、現在時刻が時間オブジェクトより大きい場合は、1秒経過と判定する。 if diff >= 0 then -- 待機エフェクトの再生 end end end end end待機エフェクトの再生
エフェクトはループ再生かつ、後で停止させたいため、グローバル変数でエフェクトのオブジェクトを覚えておく。
エフェクトオブジェクトがnilの場合のみ、エフェクトを取得し、再生する。if eff == nil then eff = vci.assets.GetEffekseerEmitter("Cube1") eff._ALL_Play() end待機エフェクト再生状態で腕を前に突き出すと、ハートの渦のエフェクトを再生する。
待機エフェクト再生状態で腕を前に突き出したかの判定と、エフェクトの再生もupdateAll()の中で同様に行う。
すでに記載した「指の形がハートかつ手が胸の前に1秒以上あるかの判定」は省略する。---全ユーザーで毎フレーム呼ばれる function updateAll() local effItem = vci.assets.GetSubItem("effect") if effItem.IsMine == true then -- エフェクトを仕込んだオブジェクトを移動させるため、オブジェクトの所有権を持つユーザーで実行する。 local flag = LeftFingerHeartChk() local flag1 = RightFingerHeartChk() local flag2 = getBoneDist() if flag == true and flag1 == true and flag2 == true then -- 指の形がハートの場合 -- 処理 elseif flag == true and flag1 == true then -- 指の形がハートの場合 if eff == nil then -- 待機エフェクトやハートの渦のエフェクトが再生状態でない場合 effortTime = nil -- 手の形や位置が変わったとして、経過時間の判定をキャンセル else -- グローバル変数で覚えているエフェクトの名前が待機エフェクトの場合 if eff.EffectName == "heart_upstream" then eff._ALL_Stop() -- 待機エフェクトを停止する eff = vci.assets.GetEffekseerEmitter("Cube2") -- ハートの渦のエフェクトを1度だけ実行する eff._ALL_PlayOneShot() end end end end end指の形がハートから変化した場合、エフェクトの再生を取りやめる。
本項も前述の項目と同様に、updateAll()の中で同様に行う。
---全ユーザーで毎フレーム呼ばれる function updateAll() local effItem = vci.assets.GetSubItem("effect") if effItem.IsMine == true then -- エフェクトを仕込んだオブジェクトを移動させるため、オブジェクトの所有権を持つユーザーで実行する。 local flag = LeftFingerHeartChk() local flag1 = RightFingerHeartChk() local flag2 = getBoneDist() if flag == true and flag1 == true and flag2 == true then -- 指の形がハートの場合 -- 処理 elseif flag == true and flag1 == true then -- 指の形がハートの場合 -- 処理 else effortTime = nil -- 時間オブジェクトはクリア if eff ~= nil then -- エフェクトのオブジェクトがnilでない場合はエフェクトを停止し、オブジェクトもnilクリアする eff._ALL_Stop() eff = nil end end end end最後に
スタジオ内にいる誰のボーン情報を取得するかの機能も入れ込んだが、こちらは基本的にこれまでもVCIで使用可能な機能を用いて実装したため、割愛する。
従来は装着可能オブジェクトをアバターに装着し、コントローラーを操作することでエフェクトの再生する等しなければいけませんでしたが、アバター情報の取得機能を使用することで、アバターの体勢変更などをトリガーに処理を行うことが出来るようになりました。
私も「魔貫光殺砲」を作られていた方に触発され、すきすきチュッチュラブビームをバーチャルキャスト内で撃てるようにしてみました。
皆様も自由な発想で、色々な技を発動してみてください。
- 投稿日:2020-01-07T17:06:40+09:00
UnityからOneDriveにアップロードやダウンロードしたい(更新中)
NuGetForUnityをインストール
ココ見ながらやる。
Unity であらゆる C#(.NET) パッケージを使う(例:opencv)Microsoft.OneDriveSDKをNuGetForUnityでインストール
1ボタンで依存パッケージを含めすべてインストールしてくれる。
が、不要なSystem系のものまでインストールされて、重複DLLが存在するというエラーを引き起こす。その時はNuGetForUnityの「Installed」タブを開いて不要なものをアンインストールしよう(結構数があってめんどくさい)。Getting startedを順番に
アプリケーションを登録する。次の手順に従って、アプリケーションをOneDriveに登録します。
Microsoft Graph 用のアプリの登録(続く)
参照
OneDrive/onedrive-sdk-csharp - Github
C#からOneDrive API(4) ファイルの保存、読み込み
Unity + OneDrive = Corrupt Projects
- 投稿日:2020-01-07T17:06:40+09:00
Unityメモ:UnityからOneDriveにアップロードやダウンロードしたい(更新中)
NuGetForUnityをインストール
ココ見ながらやる。
Unity であらゆる C#(.NET) パッケージを使う(例:opencv)Microsoft.OneDriveSDKをNuGetForUnityでインストール
1ボタンで依存パッケージを含めすべてインストールしてくれる。
が、不要なSystem系のものまでインストールされて、重複DLLが存在するというエラーを引き起こす。その時はNuGetForUnityの「Installed」タブを開いて不要なものをアンインストールしよう(結構数があってめんどくさい)。Getting startedを順番に
アプリケーションを登録する。次の手順に従って、アプリケーションをOneDriveに登録します。
Microsoft Graph 用のアプリの登録(続く)
参照
OneDrive/onedrive-sdk-csharp - Github
C#からOneDrive API(4) ファイルの保存、読み込み
Unity + OneDrive = Corrupt Projects
- 投稿日:2020-01-07T16:38:03+09:00
UnityでMicrosoft TeamsにIncoming Webhookを使って自動投稿したい
コードだけバーン
sample.cs//////////////////////////////////////////////////////////////////////////////// // // Light Wings GameProject // // (C) 2009 Light Wings GameProject. // // https://github.com/LightWings-GameProject // //////////////////////////////////////////////////////////////////////////////// using System; using System.Text; using UniRx; using UnityEngine; /// <summary> /// Microsoft Teams の Incoming Webhook /// </summary> public class MicrosoftTeamsIncomingWebhook { class PostData { public string text; // 投稿内容 public string username; // user名 } /// <summary> /// Webhook に対してメッセージを送信する /// </summary> /// <param name="url">IncomingWebhookで取得したURL</param> /// <param name="username">ユーザ名</param> /// <param name="text">投稿文</param> /// <returns>投稿リクエストのストリーム</returns> public static IObservable<string> Post(string url, string username, string text) { PostData data = new PostData(); data.username = username; data.text = text; string json_data = JsonUtility.ToJson(data); byte[] postBytes = Encoding.UTF8.GetBytes(json_data); return ObservableWWW.Post(url, postBytes); } }The MIT License (MIT) Copyright (C) 2009 Light Wings GameProject.不満な点
- Teamsは画像投稿に対応していない
- Teamsはメンションに対応していない
参照
UnityからSlack投稿する
Microsoft TeamsにC#で投稿
【MS Teams】Incoming Webhook経由で画像を送信する方法
Microsoft Teams に PowerShell で投稿してみる
- 投稿日:2020-01-07T16:38:03+09:00
Unityメモ:UnityでMicrosoft TeamsにIncoming Webhookを使って自動投稿したい
コードだけバーン
sample.cs//////////////////////////////////////////////////////////////////////////////// // // Light Wings GameProject // // (C) 2009 Light Wings GameProject. // // https://github.com/LightWings-GameProject // //////////////////////////////////////////////////////////////////////////////// using System; using System.Text; using UniRx; using UnityEngine; /// <summary> /// Microsoft Teams の Incoming Webhook /// </summary> public class MicrosoftTeamsIncomingWebhook { class PostData { public string text; // 投稿内容 public string username; // user名 } /// <summary> /// Webhook に対してメッセージを送信する /// </summary> /// <param name="url">IncomingWebhookで取得したURL</param> /// <param name="username">ユーザ名</param> /// <param name="text">投稿文</param> /// <returns>投稿リクエストのストリーム</returns> public static IObservable<string> Post(string url, string username, string text) { PostData data = new PostData(); data.username = username; data.text = text; string json_data = JsonUtility.ToJson(data); byte[] postBytes = Encoding.UTF8.GetBytes(json_data); return ObservableWWW.Post(url, postBytes); } }The MIT License (MIT) Copyright (C) 2009 Light Wings GameProject.不満な点
- Teamsは画像投稿に対応していない
- Teamsはメンションに対応していない
参照
UnityからSlack投稿する
Microsoft TeamsにC#で投稿
【MS Teams】Incoming Webhook経由で画像を送信する方法
Microsoft Teams に PowerShell で投稿してみる
- 投稿日:2020-01-07T15:43:34+09:00
【初心者向け】FireBaseとUnityの連携方法①【画像付き】
はじめに
僕「バックグラウンドをFireBaseで簡単に任せることが出来ることを知ったからゲームでも使いたい!」
公式HPを見ながら作業環境を構築してると知識不足なのか慣れてないのかよく分からなくて初心者泣かせだった。そんな、同じような方に向けて分かりやすい連携方法を紹介できればなと思います。
公式の連携方法ページ→https://firebase.google.com/docs/unity/setup?hl=ja
FireBaseの機能一覧でとても分かりやすかった→ https://qiita.com/hippoHippo/items/21cf7fb76bcf8591129f作業環境
・Windows
・Unity 2019.2.9f1
を使用して作業を行った結果です。事前準備として、Unityプロジェクトは個々で作っといてください。省略します。
作業一覧
①FireBaseの作業ドキュメントを作成する。
※ドキュメント名に数字を入れた所DataBaseを使用する際に、このドキュメント名が使われるが数字が文字化け?なのか省略されてるのかして数字だけが抜けるので、数字入れるのは避けた方が良い?かもしれません!
![]()
![]()
②アプリ追加
1.作成したドキュメントのトップページに移行したら、アプリ追加からUnityアイコンをクリックする。
2.IOS又はAndroidを選択する。(今回はAndroid)
3.パッケージ名、アプリのニックネーム(省略可)を入力する。★このパッケージ名はUnityのAndroidのPackageNameをコピペする。
※ここのパッケージ名の2つ目のドットの後は個々で作成した、Unityのプロジェクト名が入ります。
③設定ファイルのダウンロード
Androidなら「google-services.json」をダウンロードする。
④FirebaseSDKをダウンロード
zipファイルを解凍。
⑤Unityにインポートする
ここからが公式HP見ながら行った結果、結構戸惑いました。
Unity 2017.x 以降では、.NET 4.x フレームワークを使用できます。Unity プロジェクトで .NET 4.x を使用する場合は、dotnet4/FirebaseAnalytics.unitypackage をインポートします。
と、Unityのバージョン2017以降使っていればdonet4を使用することは分かりました。
上記のようにdotnet4/FirebaseAnalytics.unitypackageをインポートする。公式HPの解説→https://firebase.google.com/docs/unity/setup?hl=ja#add_sdk
⑥Google Play 開発者サービスの要件を確認する
正直ここはあまり理解していないが入力した
適当なスクリプトのStartまたはAwakeにHPにあるコードをコピペ公式HPの解説→https://firebase.google.com/docs/unity/setup?hl=ja#confirm_google_play_version
★⑦Unityで発生するエラーを解決する★ ここ重要
Unityに⑤で行った後にUnityにてエラーが起こるかと思います。
公式でも、そこに関して解説しているが画像付きで詳しく。公式HPの解説→https://firebase.google.com/docs/unity/setup?hl=ja#known_issues
Pluginsフォルダが以下の通りになっていること確認する。
公式HPにもある通り、
doNet45フォルダの外にある2つのピースのやつが⑤で行ったときにdotnet3のものをインポートした際に使用する物である。今回は、dotnet4をインポートしたためにdoNet45フォルダの中身の2つのピースを使用する。
まずは、使用しないdoNet45ファイル外の2つのピースを無効化または削除する。
↓無効化ならこの通りにする。
そして使用する、doNet45ファイル内の2つのピースを有効化する。
↓以下のようにすべて使うの、「Any Platform」を選択
ここでPlatform settingsを左からの一つずつ
Editor settings…UnityEditor上で動く
――― CPU OSともにANYで良いと思います。PC,MAC & Linux standalone settings…PC上でビルドしたものが動く
――― Windowsの場合はこうする。
![]()
※Macのチェックマーク等は外すAndroid settings…Android上でビルドしたものが動く
――― ここでの変更箇所はなし。変更したら、必ずApplyする。
おわりに
ここまでで、環境構築はおしまいです。
次は、RealTimeDataBaseを使ってUnityと繋げてみたいと思います。紹介
今まで学生で作ってきたポートフォリオを是非みてください。→https://keita0122neec.wixsite.com/portfolio
- 投稿日:2020-01-07T15:05:46+09:00
【随時更新】shaderでよく使う計算
自分用にまとめてます
思いついたら更新していくよく使う計算
「0 ~ 1」 → 「-1 ~ 1」 に変換
x = y * 2 - 1
- y = 0 の時
- 0 * 2 - 1 = -1
- y = 0.5の時
- 0.5 * 2 - 1 = 0
- y = 1の時
- 1 * 2 - 1 = 1
「-1 ~ 1」 → 「0 ~ 1」に変換
x = y * 0.5 + 0.5
- y = -1の時
- -1 * 0.5 + 0.5 = 0
- y = 0 の時
- 0 * 0.5 + 0.5 = 0.5
- y = 1の時
- 1 * 0.5 + 0.5 = 1
頂点から入力されたUV座標を 「移動」 「拡大縮小」 する
uv = float2( (inputUV.x - uvPosition.x) * 0.5f / uvSize + 0.5f, (inputUV.y - uvPosition.y) * 0.5f / uvSize + 0.5f, );色の平均値を求める
ただの平均の求め方
平均を求めてくれる関数があった気がするけど思い出せないaverageColor = (R + B + G) / 3ブレンドモード
加算
OutColor = A + B減算
OutColor = A - B乗算
OutColor = A * Bスクリーン
OutColor = 1 - ((1 - A) * ( 1 - B))マスク画像を元にAとBの画像をブレンド
OutColor = lerp(A, B, Mask);マスク画像の特定のカラーチャンネルのみにスクリーン合成をベースに画像を合成
OutColor = lerp(A, 1 - ((1 - A) * ( 1 - B)), maskChannel)
- 投稿日:2020-01-07T14:35:01+09:00
UnityでBuilding Gradle projectが一生終わらない場合の対応
はじめに
いつものようにUnityでAPK書き出しを行なおうとしたらビルドが下記画面から何時間経っても変わらない事象が発生したので対応方法をメモ
解決策
結論から話すと、ウイルス対策ソフトが原因でした
ESET Cyber Security Proのリアルタイムファイルシステム保護とファイアウォールをOFFにするとビルドが完了しましたネットで調査した際に見つけた対策案
gradleのアップデート
brew upgrade gradleでgradle自体をアップデートしますAndroidSDK&NDK をUnityHub経由でインストール
2020年1月7日現在ではAndroidSDKとNDKをAndroidStudioを使うことなくUnityHubから直接インストールできるようになりました
インストール→三点縦リーダーボタン→モジュールを加える ボタンからインストール可能です
プロジェクトをクローンし直す
要はキャッシュ削除ですね、自分も一度はこの方法でエラーメッセージが書き出されるようになったので影響はありそうです(ただもう一度ビルドし直すとビルドが終わらない元の事象に戻りましたが...)
- 投稿日:2020-01-07T13:10:23+09:00
UIWidgetsでAndroidのBackKey対応
はじめに
UIWidgetsでダウンロード確認Popup等を出した時にAndroidのBackKeyでPopされて
正常に処理されない事があったのでその対応の備忘録。対応
表示したいWidgetを
WillPopScopeで囲ってあげればOKだった。コード
public static Widget DisableBackKey(Widget 表示したいWidget) { IPromise<bool> promise = new Promise<bool>(); return new WillPopScope(child: 表示したいWidget, onWillPop: () => promise); }






































