20200107のUnityに関する記事は10件です。

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」を選択、プロジェクト名を入力し、作成をクリックします
02.PNG

4.Unityの画面が表示されたら完了です
01.PNG

パッケージのインポート

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」をクリックします

05.PNG

2.Consoleを見ると下記のエラーが出ているので、AR Foundationの設定を行います。Window -> Package Manager で、「AR Foundation」を検索する。見つからない場合は、Advanced -> Show preview packagesにチェックを入れておきます。
03.PNG
09.png
10.PNG

3.MRTK Project Configuratorが表示されたらApplyをクリックします
11.PNG

Cubeの配置

1.Mixed Reality ToolkitのAdd to Scene and Configure をクリックし、MRTKの設定を読み込みます(Mixed Reality Toolkitが見えない場合は、プロジェクトをReimport Allしてください)
12.png

2.HierarchyビューのMixed Reality Toolkitを選択し、InspectorビューのMixed Reality Toolkit(Script)からDefaultHoloLens2CongifurationProfileを選びます
13.PNG

3.Hierarchyビューの Create -> 3D Object -> Cube からCubeを作成、Transformを良い感じに設定します。
14.PNG

BoundingBoxおよびAppBarの表示

1.AppBarをCubeの子オブジェクトにします
15.PNG

2.TMP Importer 画面が出るのでインポートします
16.PNG
17.PNG

3.文字がバグっているので、Projectビューで右クリックし、Reimport Allします
18.PNG
19.png
20.PNG

4.その際、Sceneは保存しておきます
21.PNG

5.CubeのInspectorビューからBoundingBox.csをAddComponentし、Target ObjectとBounds OverrideにCubeをアタッチします
24.PNG

6.Audio SourceをAddComponentし、BoundingBoxのEventsの設定で、回転・スケールの開始終了時に音がなるようにします
25.PNG

7.AppBarのBoundingBoxにCubeをアタッチします
26.PNG

ビルドとデプロイ

1.Build SettingsからBuildをクリックし、Holo2フォルダを作成し、ビルドします
22.PNG

2.Holo2フォルダ内にある.slnファイルをVisualStudioで開き、Release・ARM・リモートコンピュータにし、IPアドレスを指定します。HoloLens2のIPアドレスの確認方法はHolographicRemotingアプリか設定のネットワークとインターネットから接続しているWiFiの詳細オプションに載っています

23.PNG

3.ペアリングしたことがないPCは、ピンコードを求められるので、HoloLens2の設定->更新とセキュリティ->デバイスの検出のペアリングで表示されるピンコードを入力してください

4.HoloLens2の電源をオンにしておき、Ctrl+F5でデプロイを開始、うまく配置されればUnity アプリが起動します。

デモ

Mixed Reality Captureで撮影した動画はズレているように見えますが、実際は触ってます。

参考文献

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

バーチャルキャストですきすきチュッチュラブビームを撃ってみた

はじめに

本項目はバーチャルキャスト 1.8.3aで、バーチャルキャストでユーザーが自由に作成、取り込みが可能なVCIアイテムにアバター情報の取得機能が追加されました。
アバター情報の取得機能を使用し、ポーズに応じてエフェクトを再生するアイテムを作った際の備忘録です。
2020010514054637.jpg

やりたいこと

1.アバター情報からボーンの情報を取得し、指の形を判定する。
2.指の形がハートかつ手が胸の前に1秒以上ある場合、待機エフェクトとして上昇するハートのエフェクトを再生する。
3. 待機エフェクト再生状態で腕を前に突き出すと、ハートの渦のエフェクトを再生する。
4. 指の形がハートから変化した場合、エフェクトの再生を取りやめる。

指の形の判定

GetBoneTransform fun(boneName: string)を使用して、ボーンの情報を取得する。
boneNameについてはこちらを参照

ボーンの回転量から指の形を判定する

GetBoneTransform(”ボーンの名前”).rotationでボーンの回転量を取得することが出来る。

Cubeを握り、コントローラーのボタンを押した際に、指のボーンの回転量を表示するようにしてみた
1回目
指の角度1.jpg

2回目
指の角度2.jpg

!!同じ指の形なのに、回転量が全く異なる...
コメント1.jpg
指の曲がり具合(ボーンのローカル回転量)から指の形を判定しようとしていたが、変換処理を挟まないと出来ないらしい。

ボーンの位置情報から指の形を判定する

ボーンの回転量から判定するには、変換処理が必要になる。どうしようかと検討していると、以下のコメントを頂いた。
コメント2.jpg

作戦を変更し、ボーンの座標を取得し、位置情報(ボーン間の距離)から指の形がハートか以下の関数で判定する。

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で使用可能な機能を用いて実装したため、割愛する。
従来は装着可能オブジェクトをアバターに装着し、コントローラーを操作することでエフェクトの再生する等しなければいけませんでしたが、アバター情報の取得機能を使用することで、アバターの体勢変更などをトリガーに処理を行うことが出来るようになりました。
私も「魔貫光殺砲」を作られていた方に触発され、すきすきチュッチュラブビームをバーチャルキャスト内で撃てるようにしてみました。
皆様も自由な発想で、色々な技を発動してみてください。

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

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

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

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

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

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.

不満な点

参照

UnityからSlack投稿する
Microsoft TeamsにC#で投稿
【MS Teams】Incoming Webhook経由で画像を送信する方法
Microsoft Teams に PowerShell で投稿してみる

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

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.

不満な点

参照

UnityからSlack投稿する
Microsoft TeamsにC#で投稿
【MS Teams】Incoming Webhook経由で画像を送信する方法
Microsoft Teams に PowerShell で投稿してみる

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

【初心者向け】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にインポートする

:point_up:ここからが公式HP見ながら行った結果、結構戸惑いました。

ここで2つのファイルがあることを確認できる。

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

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

【随時更新】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)
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

UnityでBuilding Gradle projectが一生終わらない場合の対応

はじめに

いつものようにUnityでAPK書き出しを行なおうとしたらビルドが下記画面から何時間経っても変わらない事象が発生したので対応方法をメモ

スクリーンショット 2020-01-05 23.39.56.png

解決策

結論から話すと、ウイルス対策ソフトが原因でした
ESET Cyber Security Pro のリアルタイムファイルシステム保護とファイアウォールをOFFにするとビルドが完了しました

ネットで調査した際に見つけた対策案

gradleのアップデート

brew upgrade gradle でgradle自体をアップデートします

AndroidSDK&NDK をUnityHub経由でインストール

2020年1月7日現在ではAndroidSDKとNDKをAndroidStudioを使うことなくUnityHubから直接インストールできるようになりました

インストール→三点縦リーダーボタン→モジュールを加える ボタンからインストール可能です
スクリーンショット 2020-01-07 14.28.58.png

プロジェクトをクローンし直す

要はキャッシュ削除ですね、自分も一度はこの方法でエラーメッセージが書き出されるようになったので影響はありそうです(ただもう一度ビルドし直すとビルドが終わらない元の事象に戻りましたが...)

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

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);
}
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む