20200318のUnityに関する記事は4件です。

【AR】Vuforia EngineのAdvanced Model Targetについて

Vuforia EngineのAdvanced Model Targetって、無償開発者ライセンスでも20個まで作成できるって知りませんでした。
普通に考えると機能検証のための開発者ライセンスだからできて当たり前なんですけど、思い込みって怖いなと思いました。

はじめに

使ったバージョンは以下です。
- Vuforia Engine 8.6.10
- Unity 2019.3.1(要確認)

無償開発者ライセンス

無償開発者ライセンスはVuforia Developer Portalでレジスターするとすぐに使えるようになります。
https://developer.vuforia.com/vui/auth/register

モデルターゲット

Vuforia EngineはARコンテンツを作成するためのツールで、提供するARカメラを介して現実世界を認識して、その中にAR表示の対象となるターゲットを補足します。
ターゲットにはマーカー、写真画像など色々選べますが、3Dモデルを元に形状の特徴を作って、それに一致する現実世界の物体を識別するものがモデルターゲットです。
モデルターゲットではガイドビューと呼ばれる、物体の見る角度と遠近(大きさ)をターゲットに合致させる必要があります。
GuideVIew.jpg

アドバンスドモデルターゲット

だいたいモデルターゲットと同じですが、ガイドビューが大きく違います。
- Multiple Guide View:2つ、4つ、または6つの角度からのガイドビューを持てる
- Model Target 360:ガイドビューなしで360度あらゆる角度から認識できる
 (Multiple Objectもできますが、ここでは触れません)

モデルターゲットの作成方法(私はModel Target 360で操作してます)

こちらのサイトよりModel Target Generator(Windows 64bit版のみ)を入手し、画面操作でモデルターゲットが作成できます。
https://library.vuforia.com/content/vuforia-library/en/articles/Solution/how-to-create-model-target.html
1. ダウンロードしたModel_Target_Generator.exeを実行するとまずは認証が求められるので、自分のVuforia Engine Developer accountでログインします。
2. Generatorメニューが開いたら「Create New Model Target」を押します。
3. CADモデルの右側にあるSelectボタンでモデルターゲットに使いたい3Dモデルを指定し、Create Model Targetします。image.png
4. デバイスタイプとオリエンテーション(縦横向き)と、作成するモデルターゲットの種類(マルチビュー、Model Target 360)を選んで、Create ○ Guide Viewを押します。image.png
5. Edit Guide Viewボタンを押して、どの角度からのビューにするかを編集します。image.png
6. 準備ができたらGenerate Model Targetを押します。
7. メニュー左上のModel Targetsナビゲートボタンでトップメニューに戻ります。image.png
8. Advanced Model Targetのトレーニングデータを作成するために、右側Training SetsペインにあるCreate Databaseを押します。
9. マルチアングル、または360度どちらのトレーニングデータを作りたいかを選択し、Training Session Nameにわかりやすい名前をつけ、本物と同様の着色やテクスチャのモデルでしたら、Realisticを選択してCreate Databaseを押します。image.png
10. Select Model Targetsにて、トレーニングする3Dモデルデータを指定します。
11. Training Setsペインにトレーニングセッション(?)が追加されるので、Trainボタンを押します。
12. トレーニングが完了するまで結構時間がかかりますが、終わるとTrainボタンがExportボタンに変わります。
13. Exportボタンを押すと、データセット一式がローカルに保存され、そのなかの〇〇.unitypackageを実行することでモデルターゲットのデータをUnityに取り込むことができます。

この先はUnityでARカメラ階層のしたにターゲットを追加する、とかですがそのへんは他のターゲットを使うときと手順は同じなのでここでは割愛します。

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

shader graphメモ

shader見習いのチュートリアル的なメモ

 shaderを学習し始め、なぜかプログラムを書く前にノードベースでお勉強する

Toonのやり方

 初めに使用しているバージョンはunity2019.3.0f6です。

使用しているパイプラインはURP

では最初に完成したものを張っておきます。
image.png

基本的なToonの原理をただノードベースで実行しただけです。

処理内容

詳しいことは https://www.slideshare.net/UnityTechnologiesJapan/unity-75745044 こちらが参考になると思います。

※ここからは箇条書きになっています。

ライトの方向とメッシュの法線方向を内積する

image.png

こうすることで光の当たり具合を取得することができる。

ちなみにライトの取得ですが、初めはunity公式ブログのインクルードファイルから取得する方法を試みたのですがなぜかshadowcodeがないとかなんとかでエラーがでてできなかった。。。
 理由を調べてもわからなかったので他の人がやっていたスクリプトで直接ライトから取得することにしました。
リンク張ろうと見たサイト探してたらすごい人がいたので https://github.com/simplestargame/VRM-Toon-for-Universal-RP 
見たサイト見つからなかった。。。。

スクリプトの処理張っときます
image.png

正直あとはラップで影の値と通常の値を求めるだけだから説明するとこない。。

完成はこんなの

https://media.giphy.com/media/UrWFWqgY6CRQlhari9/giphy.gif

 一応Githubにソース上げときます。
https://github.com/kobayashiyuuhi/ToonshaderGraph

以上!!
shader言語勉強しなきゃ。
パイプラインいじってる人見ると自分もやりたくなる。。

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

【Unity】全角を2、半角を1としてbyte文字数を数える

プレイヤー名やモンスターのニックネームなど文字数の制限を行いたい場合に、全角は2、半角は1として合計30まで、といった数え方で文字数を制限したいケースの実装方法です。

よくある内容ですが、実際に実装するのはなかなか手順が多く大変でした。

要点

  • Shift_JISでByteにエンコードする
  • 「I18N.CJK.dll」と「I18N.dll」をプロジェクトにインポートする

Shift_JISでByteにエンコードする

通常のエンコードといえばUTF8だと思いますが、UTF8だと漢字が3byte、かなが2byteだったりするため、文字数のカウントには向いてません。

そこで、文字数のカウントではShift_JISへのエンコードを行います。

using System.Text;

public static class StringEncodingExtension 
{
    public static int GetSJISByteCount(this string text)
    {
        return Encoding.GetEncoding("Shift_JIS").GetByteCount(text);
    }
}

拡張メソッドで書いておけば、適当な場所でstringのbyte文字数を数えられます。

using UnityEngine;

publi class StringEncodingExtension 
{
    public void Start()
    {
        string nickName = "キラーマシン2";
        // >>> 13
        Debug.Lot(nickName.GetSJISByteCount());
    }
}

「I18N.CJK.dll」と「I18N.dll」をプロジェクトにインポートする

Unityエディタならコード書くだけで済みますが、実は実機でやろうとするとShift_JISエンコードがサポート対象外となってエラーになってしまいます。

対応策として、「I18N.CJK.dll」と「I18N.dll」をプロジェクトにインポートさせてあげると上手くいきました。

参考

http://baba-s.hatenablog.com/entry/2019/03/18/155000

感想

完全にぼやきですが、なんで文字数数えたいだけなのにこんな苦労しなきゃならないんだ...? って思いました。

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

UniRx で特定の期間にx回入力があったときに購読するヘルパーを作ってみた

マウスのダブルクリックを検知したかったり、あるキーを3回押したときだけデバッグモードの画面表示したかったりしませんか?
UniRx で簡単にダブルクリックなどを検知できますが、回数や検知期間を設定できるヘルパー関数を作ってみました。
これでいつでも簡単にデバッグ画面が開けます。

ヘルパー関数

using System;
using System.Collections.Generic;
using UniRx;

public class UniRxHelper
{
    public static IObservable<IList<long>> InputCountDetection(Func<bool> input, int count = 2, int waiting = 200)
    {
        var stream = Observable.EveryUpdate().Where(_ => input());
        var throttle = stream.Throttle(TimeSpan.FromMilliseconds(waiting));
        return stream.Buffer(throttle).Where(i => i.Count >= count);
    }
}

仕様

  • 検知したいイベント、回数、検知が成立する期間を設定することができます。
  • 回数と検知期間を設定しなかった場合、2回、200ms以内に発生したときに、イベントが発行されるようになっています。

使用例

マウスの左ボタンのクリックが、3回、500ms以内に、押されたことを検知して、ログを表示する例です。(面白くなくてすいません)

using UniRx;
using UnityEngine;

public class MouseInput : MonoBehaviour
{
    void Start()
    {
        UniRxHelper
            .InputCountDetection(() => Input.GetMouseButtonDown(0), 3, 500)
            .Subscribe(_ => Debug.Log("トリプルクリックを検知しました。"))
            .AddTo(this);
    }
}

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