トマシープが学ぶ

Unity/VR/AR/デザイン好きのミーハー 記事内容は自分用のメモです

歩くアニメーションを永遠に前進させる【Unity】

1mぐらい前に進む歩くアニメーション。

ふつうにLoopさせただけだと1m進んだらまた元の位置に戻ってしまう。

ずっと前に進ませるにはどうしたらいいのか。

STYLYの講座の宿題?です(宿題ではない)

 fbxモデル

今回はfbxモデルにアニメーションが含まれているものを使う。

mixamoからダウンロードしたモデルだそうです。

Humanoid

まずモデルをHumanoidにする。(してないとRootTransformPositionが出なかった)

f:id:bibinbaleo:20190803170150p:plain

Animation

Animationタブの下の方に行く

f:id:bibinbaleo:20190803170158p:plain

RootTransformPosition(XZ)のBasedUponをOriginalにする

f:id:bibinbaleo:20190803170154p:plain

Apply。

他の記事ではBakeIntoPoseのチェックを外すって書いてあったけど、今回のモデルは最初からついてなかった。

sat-box.hatenablog.jp

これでできた!すごーい

f:id:bibinbaleo:20190803184621p:plain

Animator 

そしてAnimatorのApplyRootMotionにはチェックを入れる。

f:id:bibinbaleo:20190803170203p:plain

Macのマテリアル(おまけ)

MacだとfbxのMaterialsをLegacyにしてもいい感じにならない。

Windowsだとちゃんとマテリアルが付く

f:id:bibinbaleo:20190803181241p:plain

 

VRTKとInputField

VRTKのキーボード

VRTKのサンプルシーン(34)にあるキーボードを自分のシーンにもってきて入力する。

f:id:bibinbaleo:20190801115622p:plain

Keyboardプレハブ自体はこんな感じ。

f:id:bibinbaleo:20190801133822p:plain

UI_Keyboardでキー入力やEnterの処理をしている。

 

入力自体はすぐにできた。

InputFieldをクリックしなくてもVRTKのキーを入力したら反応する。

ただinputfieldのtextに文字を流しているだけ

input.text += character;

もはやただのText表示みたいなもの。InputFieldである必要性があんまりない。

使ってあるのPlaceholderぐらいでは(入力する前の「InputText...」という表示)

 

カーソルもなぜか出ていない。

サンプルシーンでは出ていたのか?サンプルシーンはエラーとか゚VRのレーザーが反応しなかったりでプレイできていない。

negi-lab.blog.jp

 

独自のInputField

今はWorldKeyboardというオブジェクトの子のInputFieldに反応するようになってるけど、自分で作った別の場所にあるInputFieldに入力内容が出るようにしたい。

f:id:bibinbaleo:20190801115627p:plain

スクリプトはこんな感じで自分の子のInputFieldを取得している。

input = GetComponentInChildren<InputField>();

自分で作ったInputFieldをインスペクタからセットする感じにした。

public InputField inputSearchTablet;

f:id:bibinbaleo:20190801115634p:plain

input = inputSearchTablet;

f:id:bibinbaleo:20190801115638p:plain

f:id:bibinbaleo:20190801115617p:plain

ちなみにもともとキーボードのスクリプト名はUI_Keyboardという名前だった。

いじっていくので別のスクリプトを作った。

別のスクリプトにしたらそれぞれのキーボタンの参照も変わる。ヒエラルキーで選んで全部一気に替えられた。

f:id:bibinbaleo:20190801133848p:plain

 

InputFieldをクリックでエラー

でもInputFieldをクリックするとエラーが出る。

NullReferenceException: Object reference not set to an instance of an object
UnityEngine.UI.InputField.ActivateInputFieldInternal () (at C:/buildslave/unity/build/Extensions/guisystem/UnityEngine.UI/UI/Core/InputField.cs:2835)
UnityEngine.UI.InputField.LateUpdate () (at C:/buildslave/unity/build/Extensions/guisystem/UnityEngine.UI/UI/Core/InputField.cs:1260)

今はinputFieldをクリックしなくてもキーを押したらすぐに入力が開始される。

動作はちゃんとするんだけど。

治った?

なんか治った。上のスクリプト変えるやつやったら出なくなった。

でもキーボードを表示してない状態でInputFieldを押すと同じヌルが出る

なんなんだろう。

ReadOnlyにしても変わらなかった。

f:id:bibinbaleo:20190801140552p:plain

tech.pjin.jp

InputFieldのクリックでキーボードを出す

InputFieldを押したらVRTKのキーボードをactiveにしたい。

でもInputFieldにClickの関数なんてない。

この方が同じようなことをしている。

tuti107.hatenablog.com

InputFieldを押したときってどうやってとるの?OnSelectが来た時ってこと?

docs.unity3d.com

ちなみにInputFieldにbuttonを付けようとすると怒られました。

f:id:bibinbaleo:20190801143505p:plain

 

buttonを上に重ねた

結局InputFieldの上に透明なボタンを重ねました。

 

でクリックしたらKeyboardがActiveになるようにする。

f:id:bibinbaleo:20190801145319p:plain

キーボードはEnterを押したら自分が消えるようにしました。

public void Enter()
{
input.text = "";
this.gameObject.SetActive(false);
}

これでInputFieldのクリックが反応してエラーが出ることもなくなったしいいのでは。

ついでにキーボードに×ボタンもつけよう。

Android

InputFieldを押したらAndroidだとスマホのキーボードが出てくるそうです。

Questでやってみたけどさすがに出てこなかった。

ただ昔、VysorでGoの画面共有をした時はVysorのPCのほうに出てきた気がします。

この方は結局ボタンをInputFieldっぽくしています。

tuti107.hatenablog.com

最低限はこれでもいいし、むしろこっちのほうが楽な気はするけど、カーソルやPlaceholderのテキストとか゚が作れない。デザイン的なあれ。

InputFieldの入力を受け付ける機能は本当に要らないんだよな。

その他

inputField.ActivateInputField();でスクリプトからフォーカスを当てることはできるらしい。

gomafrontier.com

今まではInputFieldをクリックすることでフォーカス(文字を入力できる状態にすること)していましたが、スクリプトでフォーカスすることもできます。

【Unity入門】InputFieldに入力された文字列をテキストに反映させよう! | もぎブログ

最後に

というかなんでカーソル出てないんだろう?入力を受け付けていない??

ただテキストに流しているだけだから?

docs.unity3d.com



UnityEventの作り方

Buttonとかにくっついているあれを自分のスクリプトでつくる。多分UnityEventっていう。

作り方

using UnityEngine.Events;

public UnityEvent ToggleOn = new UnityEvent();
public UnityEvent ToggleOff = new UnityEvent();

f:id:bibinbaleo:20190729161946p:plain

それが呼び出されるところで?

ToggleOn.Invoke();

あってるか知らないけど、とりあえずやりたいことはできた。

これが全てではない気がする

最後に

意外と簡単にできた。楽しい。 

www.urablog.xyz

docs.unity3d.com

textのフォントサイズが50より大きくならない【Unity】

UI>textのfontSizeが50以上にならない。

インスペクタ上の数値は大きくなっているけど、実態に反映されない。

RectSizeを変えてもあれ。

そもそもRectSizeが小さかったら文字が消えたりするならわかるけど何の変化もしない。

 

多分親子関係のせいなのか?

あんまり切り分けできてないけど、フォントを変えてもダメだった。

同じ階層に初期設定のText作ってもやはり大きくならない。

 

ほかのプロジェクトでインスペクタ同じでやったら大きくなった。

 

ググって出たやつを試したけど変わらなかった。

answers.unity.com

vertical overflow to "overflow" instead of "Truncate"にしてもダメだった。

qiita.com

Best Fitにはチェック入っていない。

症状的には似てるんだけどなー

Unlit/Transparentを重ねたら角度によって奥に消える問題【解決】

Unlit/Transparentシェーダーのマテリアルを付けたQuadと、マテリアルのついてないImageを重ねておいたとき、Quadのほうが手前にあるのに、見る角度によってはQuadが奥に消えてしまうという現象が起きました。

ググったら同じ症状の方の記事があって、Unlit/TransparentCutoutにしたら解決していました。

korechipostit.hatenablog.com

私もこれで解決しました。

f:id:bibinbaleo:20190729150720p:plain

何が違うのか

Cutoutだとアルファが指定された値以下のとき描画されないらしい??

nakamura001.hatenablog.com

 

TiltBrushで描いたものをfbxでUnityに持ち込む【LookingGlass】

昔買ったけど全然使ってなかったTiltBrushのPC版。

store.steampowered.com

STYLYの作品作りに使えそうだなと思ったので、とりあえずUnityに取り込むとこまでやってみました。

fbx書き出し

手元のToolPanelから「...」> Labs > Exportで書き出しできる。

support.google.com

最初にAdvanceModeか何かにしないと...が表示されない

丸で囲んである床を押すと初心者モードとAdvanceModeが切り替わる。

f:id:bibinbaleo:20190728213133j:plain

これで右下に...が出る

f:id:bibinbaleo:20190728213126p:plain

真ん中のLab

f:id:bibinbaleo:20190728213129p:plain

Export

f:id:bibinbaleo:20190728213132p:plain

書き出されたものはDocument>TiltBrush>Exportの中にある。

f:id:bibinbaleo:20190728213510p:plain

Unityで見る

Unityで開いたらこんな感じだった><

f:id:bibinbaleo:20190728212627p:plain

もとはこれ。fireとかsmokeを使ったらテクスチャが変になってる。

f:id:bibinbaleo:20190728212621p:plain

 

線だけだといい感じ。

f:id:bibinbaleo:20190728214311p:plain

なぜか下のほうが消えてる。

色はついてなかったから自分で変えた。

こんな感じの作りになっていた。
f:id:bibinbaleo:20190728212618p:plain

tilt-brush-toolkit-UnitySDK-v20.0.2.unitypackage

公式のSDKを入れるとTiltBrushで見たのと同じまま表示されます。

github.com

このunitypackageを入れた後にfbxファイルだけ入れると・・・

f:id:bibinbaleo:20190728215312p:plain

すごーーい!炎もかくかくだけどアニメーションしてる!!!

これを入れる前はStandardShaderだったのが独自のshaderが自動でついてる。

f:id:bibinbaleo:20190728215252p:plain

パラメーターをいじって炎の強さを変えることもできた。

以前は下が消えていたトマシープちゃんも全部表示された!

f:id:bibinbaleo:20190728220235p:plain

いったんfbxは入れなおさないといけない。pngは要らない。fbxだけ。

 

ドキュメント

docs.google.com

 

qiita.com

LookingGlass

LookingGlassで表示したらこんな感じ。

 

もうちょっと本気で描いていい感じの作りたい。

最後に

めっちゃいいね!!!

STYLYの作品用のモデルをどうやって作るか悩んでたけど、君に決めた!

 

OVROverlayのサンプルを見てみる【Unity】

OVROverlayというのを使うとQuadに貼ったテクスチャがとてつもなくきれいに表示されるそうです。
developer.oculus.com

サンプル

OculusIntegrationにOVROverlayというサンプルがあります。

f:id:bibinbaleo:20190722093311p:plain

Questで動かしてみると普通の時と比較してテクスチャの文字もくっきり見えます。

一応Questでのキャプチャ画像でも違いが分かる。生で見るともっと違う気がする

f:id:bibinbaleo:20190722093701p:plain

Riftで見ると見えるけど、Editorではパネルは見えなくなる。

まあそれはメインのカメラでは描画しないからなんだけど。

あとサンプルでもわかるけどOverrayは普通のUIより前面に出る。

f:id:bibinbaleo:20190719173614j:plain

サンプルの実装をみてみる

サンプルではどう実装されているのか?

f:id:bibinbaleo:20190719173637p:plain

こんな感じのヒエラルキー

f:id:bibinbaleo:20190722094313p:plain

Quad

OvrlayerUIGeometryの下にTileがある。

各タイルはQuadになっていてLayerはなにも選ばれていない!

f:id:bibinbaleo:20190722094339p:plain

他は特にスクリプトとかはついていない

f:id:bibinbaleo:20190719173641p:plain

Quadを映すカメラ

これらのQuadを映す用のカメラがある。

f:id:bibinbaleo:20190719173623p:plain

CullingMaskがこちらもNothingですらない。何も選択されていない。

f:id:bibinbaleo:20190719173644p:plain

TargetTextureに何かついている。

f:id:bibinbaleo:20190719173628p:plain

これに伴い、メインのカメラはNothingとEverything以外が選択されている形になっていた。

f:id:bibinbaleo:20190722174454p:plain

OVROverlay

単独で空のゲームオブジェクトに付いている。

f:id:bibinbaleo:20190722094448p:plain

スケールと位置がQuadらへんになっているのが気になる。

特にQuadとの紐づけとかはない。

 

 OVROverlaySample

これらはすべてOVROverlaySampleというスクリプトで制御されているっぽい??

f:id:bibinbaleo:20190722103817p:plain

中身はまだ見ていない

最後に

要素が多すぎて自分で実装するのがめんどくさそうだった。よくわからない。

LayerとCullingMaskがお互い何も選択されていないけど、自分でやってみたけどできない><

適当な新しいLayerを作るのでも行けるのかな?まだ試していない。

重なり描画順

Quad同士を重ねると表示順はいびつになる。

QuestとRiftでも結果が違ったし、重ねたらいけないのかもしれない。

f:id:bibinbaleo:20190719173614j:plain

f:id:bibinbaleo:20190719173633p:plain

 

 

 

 

どこでもドアができるポータルアセット二つ使わない

World Portal System

PortalPairプレハブをシーンに置く

f:id:bibinbaleo:20190721103854p:plain

できたけど、見た目がそうなるだけでポータルをくぐったら向こう側に行けるというわけではない

その機能があるのかは知らない。

Pocket Portal VR

こっちは以前開きましたがエラーが出てできませんでした。

 

bibinbaleo.hatenablog.com

前回2019.1で試してダメだったから2018.3で試したけどまたMissingPrefabで大量エラー出てたのでやめ!!!

もうやだああ

めんどくさいんじゃ

最後に

この記事をUnityAssetアドベントカレンダーにしようかと思ったけど、めんどくさいしモチベーションが上がらないので何か別の記事を考えます。

なににしよう。。。

VRでのスプラッシュイメージ(起動画面ロゴ)を変える【Unity】

スプラッシュ 

ゲーム開始時に出てくるUnityのロゴがビューって出てくる演出のこと

Splashイメージは、変えたら垢抜けるのでUnity1weekの作品でも毎回変えています。

f:id:bibinbaleo:20190710162652p:plain

背景を起動したときのゲーム画面にするのが最近のマイブームです。

f:id:bibinbaleo:20190710162649p:plain

VRでも変えられるらしいのでやってみます。

やり方

VirtualRealitySplashImageに画像を差し込むだけ。

f:id:bibinbaleo:20190710161339p:plain

背景は黒固定。(Unityだけのときはグレーなのに)

画像の色をいい感じに広げたりとかはしてくれません。

黒い世界の中にポツンとロゴが出るだけ。

pngにしたらちゃんと透過されます。

そして無料アカウントユーザーでもオリジナルロゴを設定したらUnityロゴが消えるそうです。

BackGroundは変えても意味がない。

Preview

Androidモードじゃなければ、previewボタンを押したらGame画面にスプラッシュイメージのプレビューがでるけど、Androidモードだとでない。

そしてVRSplashImageはどちらにせよ出ない。

f:id:bibinbaleo:20190710162821p:plain

確認するにはビルドするしかないのかな?

できない

別のプロジェクトでできなくなった。スプラッシュ自体が出ない。

設定同じなのに

最後に

昔はできなかった気がする。昔VR作品作ったときに必死に変えようとしたけどできなくてあきらめた記憶がある。少なくともVirtualRealitySplashImageなんてわかりやすいものはなかった・・・と思うけどあったのかな~

UnityのCache Serverを設定したらアップロードとか゚インポートが早くなるらしい。

UnityにSTYLYのアセットを入れたら「CatchServerを設定することを強くお勧めします」って言われた。

f:id:bibinbaleo:20190721090250p:plain

なんだ~?って思ってEdit>PreferenceからCacheServerをみたらDisableになっていた。

f:id:bibinbaleo:20190721090248p:plain

LocalとRemoteがある。

キャッシュサーバーをもつと何かの読み込みが早くなる。

docs.unity3d.com

チームでネットワーク越しにプロジェクトを共有して、他人の変更を読み込むときとかに、差分だけ読み込まれるという感じなのか??

STYLYにアップロードするときの時間が短縮されるらしい。

styly.cc

Localにしたらいい。

f:id:bibinbaleo:20190721091241p:plain

最後に

なんかほかにもいろいろ早くなるらしい。

qiita.com

いまいちよく分からなかった。

私の使っているUnityの便利機能

私がよく使っているUnity便利機能まとめ

追記していきます。

シーンビューをのGame画面に 

カメラを選んでCtrl+Shift+Fでシーンでの見え方がGameビューに反映される。(カメラがその位置に来る)

f:id:bibinbaleo:20190707141202p:plain

f:id:bibinbaleo:20190707141200p:plain

インスペクタで四則演算

インスペクタで足し算とかできる。

f:id:bibinbaleo:20190706160009p:plain

シーンで使っている場所を探す

プロジェクトビューにあるものを右クリック>FindReference In Sceneで

 

f:id:bibinbaleo:20190707141208p:plain

シーンでどこに使われているかが見える。

f:id:bibinbaleo:20190707141205p:plain

最後に

もっとある気がする。。。思い出したら追記する。

bibinbaleo.hatenablog.com

【unity1week】パクパクマンがトマトをあつめるゲーム【お題:あつめる】

前回に引き続き意地でも参加します。

bibinbaleo.hatenablog.com

完成したものがこちら

youtu.be

公開されたら下のリンクから行けるはず

https://unityroom.com/games/omato_gather

画面サイズ370*670

今回の目標

毎回一つでも新しいことを習得できればいいという低い目標で参加しているので、ゲームのクオリティはうんこですが気にしない。

そして今回の目標は

・UniRXを使う

命名とかコードをきれいにする

・働きながら、体調を壊さず、投稿までする

今回、働き始めてから初めてのUnity1weekなのでどうなるかな~~ 

ゲーム内容

ゲーム内容は昔この本で作ったような、落ちてくるものを集めるやつにしようと思います。

bibinbaleo.hatenablog.com

f:id:bibinbaleo:20190212195600g:plain

記憶だと、箱を動かして落ちてくるものを取るかと思ってたけど違った・・・

どうしようかな~


 トマシープちゃんがいっぱい落ちてきて、食べるパックマンを動かすようにします。

f:id:bibinbaleo:20190705084953p:plain

Paint3Dで書いた。

トマト落下

Rigidbody2Dで落ちる。

プレハブ化

f:id:bibinbaleo:20190703203618p:plain

インスタンス

Instantiate(tomato, pos, Quaternion.identity);

・生成される範囲をランダム指定

Vector2 pos = new Vector2(Random.Range(-3.0f, 3.0f), 4f);

・XX秒ことに

画面外に出たら消す

if (!GetComponent<Renderer>().isVisible) {
Destroy(this.gameObject);
}

qiita.com

インスタンス化されたゲームオブジェクトってどうとればいいんだろう?

GameObject obj;

obj=Instantiate(tomato, pos, Quaternion.identity);

Destroy(obj.gameObject);

でいいのかな?いっぱい生成されたトマト全部に適用されるのかな?

gametukurikata.com

トマト生成と同じスクリプトに書こうと思ったけど、Destroyの処理は別のスクリプトに書いてトマトプレハブに付けておいたほうがいいのかな。。。

 ふりがなの本ではどうしてたっけ・・・?プロジェクトが手元にないから確認できないや。

というか!GetComponent<Renderer>().isVisibleって消すオブジェクトのRendererを見てるのか??

結局プレハブにつけた。無事消えた。

パックマン左右キーで画面内移動

qiita.com

player_pos = transform.position; //プレイヤーの位置を取得

player_pos.x = Mathf.Clamp(player_pos.x, -4.8f, 4.8f); //x位置が常に範囲内か監視
transform.position = new Vector2(player_pos.x, player_pos.y);

 

左右キーで画面内を移動

if (Input.GetKey (KeyCode.LeftArrow)) {
player_pos.x = player_pos.x - moving_distance;
}
if (Input.GetKey (KeyCode.RightArrow)) {
player_pos.x = player_pos.x + moving_distance;
}

moving_distanceが移動量。ちゃんとネーミングしてえらい!

パックマン食べる

トマトがパックマンに当たったらトマトを消して、点数を追加

当たり判定は当ブログおなじみの距離判定!

private void PackmanEat()
{
float dis = Vector3.Distance(thisPos, tomatoPos);
if (dis < eat_distance) {
///tomato消す
point++;
Debug.Log("食べた");
}
}

この処理パックマン側とトマトプレハブどっちに書けばいいんだ

トマトプレハブに書いた場合、パックマンスクリプトで取得するのか・・・?

もう距離じゃなくてcollider判定にしたほうがよさげかしら

TriggerEnter2D

Trigger判定にしました。トマトプレハブ側に付けます。

    void OnTriggerEnter2D(Collider2D other)
    {
        if (other.tag == "Player")
        {
            Destroy(this.gameObject);
        }
    }

TriggerとかColliderは全人類設定を間違えて詰まることがあると思うのですが、そんなときはこちらの記事で確かめればいいと思います。

indie-du.com

私は2Dにしていませんでした。知らなかった。

あとrigidbodyのついていないほうをisTriggerにしても意味がないらしい。

どちらもisTriggerチェックした。

これで無事消えました。

 

15秒で終わり

freesworder.net

    public Text timeText;
    public int nowTime=15;
    public float totalTime=15.0f;

    private void Timer()
    {
        if (nowTime > -1)
        {
            totalTime -= Time.deltaTime;
            nowTime = (int)totalTime;
            timeText.text = nowTime.ToString();
        }
    }

終わったら結果画面を出す

UniRXの使いどころ

 お勉強したUniRXを使います。自分のプロジェクトで使うのは初めてなのでうまくできるかな。

bibinbaleo.hatenablog.com

スタートボタンを押したら、

・トマト生成開始

・カウントダウン開始

    void Start()
    {
        startButton.onClick.AsObservable().Subscribe((_) => isGameStart=true);
    }
  void Update()
    {
        if (isGameStart) {
            TomatoMake();
            Timer();
        }
    }

パックマンが食べたら(tomatoからGameManagerに

・音ならす

・ポイント追加

    void Start()
    {
        tomatoDestroy.OnEat.Subscribe(_ => { Eat(); }).AddTo(this);
    }
    private void Eat()
    {
        eatSound.Play();
        point++;
        pointText.text = point + "点";

    }

天才なので割とすぐできてしまった。

Updateを使うのはあってるのか?

色気

フォントを変えました。

f:id:bibinbaleo:20190705083820p:plainf:id:bibinbaleo:20190705083818p:plain

PixelMplusというフォント。再配布可能で感じもあってすごくいい!

itouhiro.hatenablog.com

背景

背景が淡色だと寂しいのでいい感じのテクスチャないかなと思って、安心信頼のTopeconHeroesさんのサイトを探したら、パターン素材サイトもありました!!神

bg-patterns.com

しかもプチトマトまでありました。マジで神

f:id:bibinbaleo:20190705085025p:plain

bg-patterns.com

f:id:bibinbaleo:20190705084911p:plainf:id:bibinbaleo:20190705084440p:plain

パターンにするにはImageTypeをTiledにするとできた!

f:id:bibinbaleo:20190705115445p:plain

完成

f:id:bibinbaleo:20190705194800p:plain

公開されたらここから。2019/7/7の20時から

https://unityroom.com/games/omato_gather

なんかUnityroomだとwebGLの読み込みが終わらない。。。

f:id:bibinbaleo:20190705201957p:plain

割り当て領域も変えてみたけどだめだった。

256MBにしたらすぐに読み込まれた。

軽いゲームだと思ってデフォルトの32MB周辺をいじってたけどそういうことじゃないのかな?

最後に

UniRX使わなかったらどうやって実装するんだ?っていうのあった。

ネーミングは気を抜いて若干適当なところがあるけど、当社比とてもがんばってる。

最初spriteじゃなくてCancasのImageでトマトやパックマン作ってて途中で間違いに気づいた。久しぶりに2D触るとそういうこともあるよね。

というかずっと最近uGUIばっかり触ってたからな~~

 

使ったスクリプト

gist.github.com

【Unity】OculusAvatar触る【Quest】

GoやQuestで設定する自分のOculusAvatarを自作アプリで使えるかやってみます。

通信もしたいけど、まだ知識がない。。。

追記に追記を重ねぐちゃぐちゃになった。

アバター

ここでいうアバターとはこれです。

f:id:bibinbaleo:20190702120404p:plain

前まで目は眼鏡などでかたくなに隠れていたけど、いつの間にか眼鏡なしverも選べるようになってる!!

眼鏡の下からも目が見えた。

Unityでのダミーアバターの下も目がきょろきょろしている

f:id:bibinbaleo:20190704172544p:plain

本物っぽくなるらしい。

vrinside.jp

喋りに合わせて表情もかわるとも書いてるけど、Questのアバター作成画面で試した限りは変わらなかった。

SDK

OculusIntegrationにAvatar関係も入っています。

assetstore.unity.com

f:id:bibinbaleo:20190702092234p:plain

 

Oculus Avatar SDKというのもありますが、最新版(1.31.0)にはすでにUnity向けのものは入っていなくて、上で言ったIntegrationだけを使えばいいみたいです。

developer.oculus.com

昔はこっちにUnity向けのも入っていたみたい。

 

2年前と少し古いですがこちらの記事を参考に触ってみます。

www.moguravr.com

LocalAvatar

 LocalAvatarというサンプルシーンを触ります。

f:id:bibinbaleo:20190702093410p:plain

実行すると大きいアバターと小さいアバターがいます。自分は大きいアバターに乗り移っています。

f:id:bibinbaleo:20190702093316p:plain

ShowFirstPersonをはずすと

f:id:bibinbaleo:20190702093408p:plain

自分の頭は非表示になります。音と手は表示されるようです。

f:id:bibinbaleo:20190702093311p:plain

どちらも外すと声も手もなくなりました。

f:id:bibinbaleo:20190702093916p:plain

f:id:bibinbaleo:20190702093313p:plain

ちなみにStartWithControllersにチェックを入れるとコントローラーが出ます。

f:id:bibinbaleo:20190702102631p:plain

何も設定してないとQuestのコントローラーでした。

f:id:bibinbaleo:20190702102635p:plain

ここがActiveになってる。

f:id:bibinbaleo:20190702103203p:plain

でも手動ではactiveにできない

RemoteLoopback

鏡のように自分と同じ動きをするアバターが出ます。

f:id:bibinbaleo:20190702103205p:plain

少しだけ動きが遅れていました。

このサンプルではLocalAvatarの動きのデータをPacketという形で送り出し、それを目の前にあるRemoteAvatarが即受け取ることで同じ動きを表現している、ということになります。

Oculus Avatar SDKの使い方&アバター通信サンプル 面白法人カヤック VR部ラボ 第4回 | MoguraVR News - VRの「いま」を掘りだすニュースメディア

 ここのサンプルをいじれば通信ができるのか~

Questビルドでアバターが表示されない

とりあえずAndroidビルドしてQuestで動かしてみます。

Editor上だと仮のアバターだけどQuestなら自分のアバターになるのかな?

・・・そもそも表示されませんでした><

f:id:bibinbaleo:20190702112842p:plain

調べたらアプリをアルファ版に登録しないといけないらしい。

qiita.com

I had to upload to app to oculus store in alpha channel and add myself and my test accounts as testers

そういえば以前そういうツイート見た気がする。。。

 おわり!

QuestはGoでは簡単にできたアルファリリースとかも審査が必要でできない。
note.mu

ただQuestでの動きを取ることはできる。

 あくまで個人のアバターを表示することができない、ということかな?

追記:AppID追加

Goでやる場合など、appIDを手に入れられた場合。

UnityEditorの上のOculus>Avatar>EditorからAppIDを入れるところがある

f:id:bibinbaleo:20190704092806p:plain

古いIntegrationだとOculusAvatar>からこんな感じ。

f:id:bibinbaleo:20190703172830p:plain

あとLocalAvatarにはOculusUserIDを入れる場所がある。これは勝手に入ってた??

f:id:bibinbaleo:20190703172827p:plain

これが必要なのかよくわからない。

あとOculus>Platform>EditにもAppIDを入れるところがあった。

f:id:bibinbaleo:20190704104254p:plain

Rift時代の情報しかなかった。

tips.hecomi.com

framesynthesis.jp

でもOculusGoでAvatar使っているやのせんさんも凹みさんの記事を参考にしたらしい。

公式情報

公式情報みます。 

https://developer.oculus.com/documentation/avatarsdk/latest/concepts/avatars-gsg-unity-mobile/#avatars-gsg-unity-gearvr

Goで書いてる。

テストのためのUserIDも書いてあった。

手順通りにやったけどAndroidでもEditorでもオリジナルアバターは表示されなかった。

ただUserIDをtext表示したらEditorでは数字が表示されたけど、Androidだと何の数字も表示されなかった。

f:id:bibinbaleo:20190704172541p:plain

マジでわからん

フォーラム

forums.oculusvr.com

OculusUserID

凹みさんの記事を参考に、UserIDを取得して自分のモデルを出す。

ここに入力して、

f:id:bibinbaleo:20190704104254p:plain

下のコードでDebugLogにIDが表示されるはず・・・

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Oculus.Platform;

public class getAPI : MonoBehaviour
{
void Start()
{
Core.Initialize();

Users.GetLoggedInUser().OnComplete(msg => {
Debug.Log("自身の ID" + msg.GetUser().ID); // 自身の ID(16 桁の数字)を表示
Debug.Log("自身の ID文字列" + msg.GetUser().OculusID); // 自身の ID(文字列)を表示
});
}

なかなかされない、生成直後はされないって記事にも書いてあった。

そもそもDebugLogの部分が呼ばれていない。

切り分け???

・OculusGo用でアルファリリースして、自分をテストユーザーに招待してもアプリは表示されない。

f:id:bibinbaleo:20190704094051p:plain

Go用に登録したappIDを入れる

f:id:bibinbaleo:20190704092806p:plain
・この状態でdebugモードでAndroidビルドしてQuestに入れたらダミーのものが表示された!

f:id:bibinbaleo:20190704100128p:plain

古いIntegrationだと下のほうに頭が表示されていたがユーザー独自のものではない。しかも動かない。謎の頭

f:id:bibinbaleo:20190704094141p:plain
・AppID入れない状態でもダミー表示された!??なにもわからん。前は表示されなかったのに


・AppIDを入れてwindowsビルドしたらEditorと同じダミーアバターが表示され動く

f:id:bibinbaleo:20190704094047p:plain

寄り道(飛ばして

アバター表示されない原因を探ってた時の寄り道。関係なかった

参考記事を見たら

Oculus Avatarは、ビルドされたアプリ上だとデフォルト状態で描画されません。これを解決するためには、以下の2点を設定した上でビルドしてください。

・Edit > Project Settings > Graphicsの設定項目の1つ、「Always Included Shaders」のSizeを3つ増やし、Project内のOvrAvatar > Content > Materials にあるAvatarSurfaceShaderAvatarSurfaceShaderSelfOccluding、AvatarSurfaceShaderPBS

を新たな3項目に設定する

 

Build SettingのArchitectureをx86_64

 とありました。

Build SettingのArchitectureをx86_64はWindowsビルドの話かな?

shaderを追加するのはできました。

f:id:bibinbaleo:20190702105919p:plain

これでビルドしたけど表示されなかった。。。

追加したシェーダーってアバターに使われているものなのか?

でも現在のアバターAvatar_Mobile_SingleComponentを使っている・・・

f:id:bibinbaleo:20190702110822p:plain

f:id:bibinbaleo:20190702110813p:plain

これを追加してビルドしても無理だった!!!

f:id:bibinbaleo:20190702111245p:plain

こちらの記事の「Oculus Questアプリをビルドするには」を参考にビルドの設定を変えた。

framesynthesis.jp

「Player Settings… で Graphics APIs の Vulkan を削除する」の部分が見つからなかったけど、AutoGraphicsAPIのチェックを外したら表示されるのかな?と思ってチェック外したら大量に処理が走って時間がかかかかかかかか

f:id:bibinbaleo:20190702112844p:plain

手順的にもIntegrationを入れる前にやることだし、やらかした感

docs.unity3d.com

アバター使っている事例

今回できなかったけど、逆にアバター使えている公式以外のアプリってあるのかな?

こちらのSlidesGoというアプリでは使っていた!

 Goはアルファリリースが割と簡単にできるので使えるのか

 

他はあんまり思いつかないな~VR55とか

あんまり使ってないのかな

あとQuestってOculusRoomsなくなったから余計にアバター見ない。

最後に

「oculus avatar quest」で検索したらVRchatの記事ばっかり出てくる!!!!

Qiitaで探したら出てきた。

かといって「oculus avatar quest -vrchat」で検索してもそんなに出てこない

 

【ARkit2+Unity】現実の3Dオブジェクトをスキャンしてマーカーにするやつ試す。【途中まで】

こちらの記事を見てやりたくなりました。

nn-hokuson.hatenablog.com

jyukoさんも以前やっていました。

www.jyuko49.com

トライ&エラーしてたので、ぐちゃぐちゃ記事になりました。

そしてあきらめる。

環境

Requirements:

だそうです。https://bitbucket.org/Unity-Technologies/unity-arkit-plugin/src/default/より

 

ARkit2

ここからでいいのかな?

bitbucket.org

と思ったら下のほうに「2019/6/3の時点で非推奨!ARFoundationを使え!」って書いてありました。

f:id:bibinbaleo:20190628121202p:plain

ARFoundationはUnityのパッケージマネージャーから入れるやつですね。

tsubakit1.hateblo.jp

www.jyuko49.com

ARkit3も入っているらしい。でもios13を入れられるのはappleにお金払ってる人だけだから私は試すことはできないのか。

blogs.unity3d.com

せっかくなのでAR Foundation使ってみます。

ARkitSDKについて理解するのに1時間かかった・・・

そしてXcodeを頑張ってインストール。久しぶりだ

 そしてこのタイミングでiMacがまた劇遅くんになった。

3Dデータを取る

マーカーにする物体のデータを取るアプリをビルドしないといけない。

ここのARKit ScannerプロジェクトをXcodeでビルドしてもいいし、

developer.apple.com

UnitySDKのExampleに入っているUnityObjectScannerシーンをビルドしてもいい。

どちらにせよXcodeは必要なのか。

ARKit Scannerのほうがやりやすいらしいです。

 ビルド。

点が出てくる。ボックスの中に入れる。

f:id:bibinbaleo:20190629101732j:plain

Scanを押したら6つの面を全て埋めていくように舐め回す。

f:id:bibinbaleo:20190629101735j:plain

そのあとusdzモデルをLoadして表示できるらしい。

f:id:bibinbaleo:20190629101739j:plain

ただ表示したいだけならもうこれで良いじゃん。

わざわざusdzファイル作ってロードしようとしたけど、なぜかロードしてくれなかった。ファイルを選んでもなんのアクションもない。

USDZの作り方はこちら

Vectary×GoogleSiteで超簡単マーカー無しWebAR!!(iosのみ) - トマシープが学ぶ

 

Saveでdropboxとかにに「.arobject」拡張子のデータを保存してPCに送る。

Unityでデータをセット

ARFoundation準備

ARFoundationとArkitPluginを入れました。

ヒエラルキー右クリック>Create>XR>ARSession OriginとARSessionを入れます。

f:id:bibinbaleo:20190628223834p:plain

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

Xcodeが11.0betaじゃない人は最新のARパッケージを入れるとエラーでビルドできません。

ARkit3が入っていないバージョンのをどちらも入れたほうがいいかも。

f:id:bibinbaleo:20190629152149p:plain

詳しくは下の方orコメント欄

f:id:bibinbaleo:20190629152049p:plain

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

アイコン出た。MainCameraは消す

f:id:bibinbaleo:20190628223837p:plain

.arobject

.arobjectを入れました。写真付きなんだ。

f:id:bibinbaleo:20190628223856p:plain

f:id:bibinbaleo:20190628223851p:plain

Reference Object Library

これをセットするためのLibraryを作らないといけない。参考記事では"Create" > "UnityARKitPlugin" > "ARReferenceObjectsSetAsset"でできるらしいけど、ARFoundationだとない。

代わりに

Projectで右クリック>Create>XR>Reference Object Libraryがあった。これでいいのか

f:id:bibinbaleo:20190628223840p:plain

それっぽい。

f:id:bibinbaleo:20190628223844p:plain

セットできた。

f:id:bibinbaleo:20190629094211p:plain

UnityARCameraManagerのDetection Objectsなんてない

参考記事ではUnityARCameraManagerオブジェクトのUnityARCameraManagerのDetection ObjectsにLibrary的な奴をセットしていたけど、そんなものはない。

しなくていっぽい

f:id:bibinbaleo:20190629094215p:plain

表示する仮想物体の設定

参考記事では空のオブジェクトにGenerateObjectAnchor.csを付けて、Libraryと表示したいprefabをセットしていました。

ただそんなものはない。

AR Tracked Object Managerがそれっぽい。

f:id:bibinbaleo:20190628223848p:plain

これをARSessionOriginにつけた。

f:id:bibinbaleo:20190629094206p:plain

なぜならARTrackedObjectManagerをつけるともれなくAR SessionOriginが自動でついてくるから。それなら最初からついてるAR SessionOriginオブジェクト?につけようと思った。あってるかは知らない。

これにLibraryと表示したい仮想物体のプレハブをセットした。

追記

ArFoundationの公式サンプルの中にObjectTrackingあった。

github.com

開いたらシーンの構成同じだった。天才か?

強いて言えば、ARSessionにSetTargerFramerateがついていたぐらい。

f:id:bibinbaleo:20190629100848p:plain

XcodeBuild(失敗)

UnityでビルドしてXcodeでビルドしたらエラーで来てできなかった。

f:id:bibinbaleo:20190629094203p:plain

undefined symbol:_OBJC_CLASS_$_ARCOllaborateData

なんか設定間違ってるのんなだろうな。雰囲気でやってるから 

コメントで教えてもらいました。

Arkit3の機能がXcodeでUndefinedされているそうです。確かによく見るとARBodyAnchorとかARkit3の機能ですね。

PackageManagerでArkit3が入っていないバージョンのARFoundationとARKitXRPluginを入れると良いかもです。

もしくはサンプルを2.1にしたらよいそうです。サンプルはUnity2019.1以降って書いてました。

おまけ

 これどうやってるんだろう?

 

自分用メモ:ARkit_Obj,ARfoundation-sample-master (iMac)2018.3.8f1