20200116のUnityに関する記事は6件です。

【unity】questで動くbloomを実装したい

スクリーンショット 2020-01-16 22.46.31.png


TL;DR

  • 上の写真のような、ぼかしのかかった(?)物体を作りたいです
  • ググると「postprocessing」という手法が出てくるのですが、クエストだと重くて使えません
  • FastMobileBloomという天才アセットを使ってみました

はじめに

  • 日本語の実装記事がなさそうだったので。
  • また、unityの基本的な操作は触れませんが、やること自体簡単だと思います
  • 2020/1/16の記事です。

やったこと

こちらからアセットをインポートします。
3692a6b0-cd09-4e4e-b94b-20fe0e8db35f.jpg
これですね。

FastMobileBloomの中身はこんな感じです。(2020年1月現在)

FastMobileBloom
┣ FastMobileBloom.cs
┣ FastMobileBloom.shader
┣ FastMobileBloom.mat
┣ readme
┗ testscene/
  ┣ Hotel/
  ┣ Hotel.unity
  ┣ Materials/
  ┗ Neon_light.fbx

Hotel.unityを開くとイメージがつかみやすいです。

...で、開けてみてびっくりです。
なんと、cameraオブジェクトの「add component」で「FastMobileBloom」を追加するだけでした
(postprocessingよりもかなり楽)
スクリーンショット 2020-01-16 22.48.12.png
↑こんな感じで追加すればいいだけです。

before
スクリーンショット 2020-01-16 22.47.59.png

after
スクリーンショット 2020-01-16 22.46.31.png

プロパティで変更できる
thresholdやintensityは、自分で値をいじってみるとわかりやすく変化するので、説明することがないです。

素晴らしいですね。(中身ない記事になりすぎて困惑している)

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

UnityでOculus IntegrationのSampleFrameworkを使ってOculus Questのハンドトラッキングを試す

はじめに

前回は、公式通りにハンドトラッキングを試しました。
UnityでOculus Questのハンドトラッキングを使ってみる(タッチ&ピンチ)

今回は、SampleFrameworkを使ってみます。

サンプルの HandsInteractionTrainScene は試しましたか?
これを参考に、キューブをタッチしたら色が変わるシンプルなものを作っていきます。
ダウンロード.gif

環境

Unity 2019.2.17f1

事前準備

  • UnityでQuest用のビルドができること
  • Oculus Integration Assetsを追加していること

Scene作成

Hierarchy
Oculus > VR > Prefabs > OVRCameraRig を追加
(最初にあったMainCameraは削除しておく)

Inspector
OVR Manager (script) > Input > Hand Tracking Support → [Controllers and Hands]
OVR Manager (script) > Tracking > Tracking Origin Type → [Floor Level]

image.png

手を追加

Oculus > SampleFramework > Core > HandsInteractions > Prefabs > Hands

これだけで両手の表示ができ、タイプも指定できる
image.png

掌を手前にすると手が黄色くなるので、ホームに戻るジェスチャーをしやすい
ダウンロード (2).gif

インタラクティブツール追加

Oculus > SampleFramework > Core > HandsInteractions > Prefabs > InteractableToolsSDKDriver

これだけで指で操作ができる
image.png

FingerTipPokeToolIndex で、人差し指の先に青い丸が表示され、コライダーが付いている状態になる
FingerTipPokeToolMiddle を RightHandTools に追加すると、中指もインタラクティブになる
RayToolで手から線がでる

キューブ追加

Cube を追加して CubeButton とする
位置と大きさを適当に調整(Scale:0.2, position: 0, 0.5, 1)

CubeButton の下にCreateEmptyで空のGameObjectを4つ作り、それぞれ
ButtonProximity、ButtonContact、ButtonAction、ButtonPlaneCenter にしておく

image.png

Inspector

  • ButtonProximity はボタンの近接なので、Scaleを2にしておく
  • ButtonContact はボタンの位置なのでそのまま
  • ButtonAction は押した位置なので小さくしておく(positionY:-0.3, ScaleY: 0.4)

3つのGameObject全てに↓を反映

  • Box Colliderを追加し Is Triggerをチェック
  • Add Component で Button Trigger Zone(Script) を追加
  • Button Trigger Zone の Parent Interactable Obj に親のCubeButtonを指定

image.png

CubeButtonに↓を反映

  • Add Component で Button Controller (Script) を追加
  • Proximity Zone に ButtonProximity を指定
  • Contact Zone に ButtonContact を指定
  • Action Zone に ButtonAction を指定
  • Button Plane Center に ButtonPlaneCenter を指定
  • All Valid Tools Tags でどの動作をしたときに有効にするか選べる

  • CubeButtonController.csスクリプトを作成して CubeButton に追加する

CubeButtonController.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using OculusSampleFramework;

public class CubeButtonController : MonoBehaviour
{
    private Renderer renderer;

    private void Awake()
    {
        renderer = this.GetComponent<Renderer>();
    }

    public void ColorChanged(InteractableStateArgs obj)
    {
        switch (obj.NewInteractableState)
        {
            case InteractableState.ProximityState:
                renderer.material.color = Color.yellow;
                break;
            case InteractableState.ContactState:
                renderer.material.color = Color.red;
                break;
            case InteractableState.ActionState:
                renderer.material.color = Color.green;
                break;
            default:
                renderer.material.color = Color.blue;
                break;
        }
    }
}

インタラクティブ情報を取得し、どのステートかによって色を変えています。

  • ButtonController の Interactable State Change で+をクリック
  • 追加したCubeButtonControllerスクリプトのColorChangeを反映

image.png

ビルド

最初青で、近くなったら黄色、キューブに当たったら赤、押し込んだら緑になる

ダウンロード (3).gif

さいごに

手を下に垂らしてお化けのポーズになると、手を認識してくれないので、
真上からボタンを押すことはできなかった。

単純に楽しむためなら、簡単で使いやすい。
サンプルのようにボタンの位置がカメラに追従したり、ボタンが凹んだり、色が付いたり、クリック音が鳴ったり、作り込むのはすごいなと思った。

次回はHandsを使ったピンチ操作を試します。
UnityでOculus IntegrationのSampleFrameworkを使ってOculus Questのハンドトラッキングを試す (2)

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

UnityとiPhoneでリアルタイムフェイシャルモーションキャプチャー

PC上のUnityとiPhoneでリアルタイムフェイシャルモーションキャプチャーするアプリ「iFacialMocap」と、ソフトウェア&スクリプトを公開しました。
https://ifacialmocap.jimdofree.com/
UnityGif.gif

現状の3DCG系のVTuberの多くは、おそらく人間の顔の動きをキャプチャせずに「リップシンク」と呼ばれる「声の音」に反応して表情が動いているものと思われます。

現状のVTuberの動きは、「あ」という声を出したら「a」のブレンドシェイプを動かして、「い」という声を出したら「i」のブレンドシェイプを動かして....といった感じで、現実の人間の動きを取り込んでいるわけではなく、音に反応しているだけです。OVRLipSyncというのを使っているのでしょう。

また、VTuberの目・眼球の動きはEyes Animatorというアセットを使っているのではないかと思います。

アニメ調のデザインのVTuberならそれでも良いのですが、ちょっと前にTwitterで伸びていた、以下のようなリアル寄りの3DCGを動かそうと思うと、リップシンクだけでは実現できません。

しかし、iFacialMocapを使用すると、人間の動きを取り込めるので、上記のツイートのようなモーションキャプチャーも可能です。(モデリングとシェーダーの技術さえあればの話ですが)

ダウンロードは以下から
https://ifacialmocap.jimdofree.com/download/

使い方は以下のYouTube動画から確認できます。
https://youtu.be/7zUSQ0tVZco
IMAGE ALT TEXT HERE

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

neovimをUnityの外部エディタにする(macOS)

Unityの外部スクリプトエディタ(External Script Editor)にneovimを登録するためにやったことをまとめます。

やりたいこと

Unity Editorでソースファイルやエラーメッセージをダブルクリックしたとき、

  • 端末(iTerm2 + tmux)上で起動済みのneovimにそのファイルを開かせる
  • カーソルを指定の行に合わせる
  • neovimのカレントディレクトリをUnityのプロジェクトパスに変更する

実行環境

  • macOS Mojave(10.14.3)
  • iTerm2
  • tmux
  • neovim v0.4.3
  • Unity 2018.3.0f2

実現方法

neovim-remoteによる遠隔起動

https://github.com/mhinz/neovim-remote
neovimは起動時に遠隔指示を受け付けるサーバを立ち上げてくれます。neovim-remoteはそれを利用して、起動済みのneovimに指定のファイルを開かせるコマンドです。
これを使って上記の挙動を実現すると次のようになります。

nvr --remote +(行番号) (ファイル名) -c 'cd (プロジェクトパス)'

となれば、あとはnvrを外部エディタとして登録し、引数をUnity側で設定してあげればOK……ではありません。nvrを外部エディタとして登録することができないからです。

Automatorで.App化する

macOS版Unity Editorに登録できる外部エディタはCocoa App形式に限られます。つまりnvrそのものや、nvrを実行するシェルスクリプトはそもそも登録することができなくなっています。
ではどうするか?幸いmacOSにはAutomatorがあるので、これを使いましょう。内部的にシェルスクリプトを実行するAppを作成することができます。

次のようにAutomator Applicationを設定します。

  • 新規Applicationを作成する
  • 「シェルスクリプトを実行」を追加し、次のように記述する。また、入力の引き渡し方法は「引数として」を選ぶ。
シェルスクリプトを実行
eval "/usr/local/bin/nvr" "--remote" $@
  • 上記Applicationを保存する
  • Unity側でPreferencesを開き、External Tools画面のExternal Script Editorに上記Applicationを指定する
  • 同画面のExternal Script Editor Argsに下記を指定する
"+$(Line) $(File) -c 'cd $(ProjectPath)'"

これで完成です!Unity Editor上でC#スクリプトやシェーダファイルをダブルクリックすると、neovimが起動済みであればそちらで開かれます。

今後の課題

ファイルを開いたときにneovim(を起動しているiTerm2)にフォーカスを移したいのですが、これは上記Automator Applicationに追加処理を記述することで実現できそうです。
また、今回はneovimがすでに起動していることが前提になっており、neovim未起動の状態でファイルを開こうとするとエラーになります。ここはどうにか改善したいところです。

以上です。

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

【DOTween】ポップにアニメーションするボタンを作る【Unity】

はじめに

開発中のアプリDOTweenを使った簡単なボタンアニメーションを作ったので紹介します。

Jan-16-2020 07-46-16.gif

使用しているUIアセット(有償): Simple UI - Asset Store

コード

使用する場合は以下のスクリプトをプロジェクトにインポートし、Buttonコンポーネントの変わりにアタッチしてください。CC0です。

Gist: PopButton.cs

PopButton.cs
using UnityEngine.UI;
using DG.Tweening;
using UnityEngine;

namespace nkjzm
{
    /// <summary>
    /// ポップに押されるボタン
    /// </summary>
    public class PopButton : Button
    {
        Tweener tweener = null;
        new void Start()
        {
            base.Start();

            // ボタンアニメーション
            onClick.AddListener(() =>
            {
                // 再生中のアニメーションを停止/初期化
                if (tweener != null)
                {
                    tweener.Kill();
                    tweener = null;
                    transform.localScale = Vector3.one;
                }
                tweener = transform.DOPunchScale(
                    punch: Vector3.one * 0.1f,
                    duration: 0.2f,
                    vibrato: 1
                ).SetEase(Ease.OutExpo);
            });
        }
    }
}

余談

ボタン押下時の機能をAddListenerするとアニメーションの途中で見えなくなってしまう場合があるので、機能によっては0.2f秒のラグを入れてあげると良いかもしれません。

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

【Unity】[Serializable]なSoundPlayerという名前のクラスを作るとビルドは通るがAndroid実機で落ちる

はじめに

タイトルままです。
調べても対処法が出てこず、2時間ぐらい詰まったのでメモ。

環境

開発環境
Unity 2019.2.17f1
Windows 10
確認Android環境1
FireHD 10(Fire OS 5.3.7.0)
確認Android環境2
BlueStacks4(OnePlus 5)

エラー本文

logcatで怪しかったところ.txt
01-15 01:46:13.567: E/Unity(15508): The file '/data/app/com.XXX.XXX-2/base.apk/assets/bin/Data/level0' is corrupted! Remove it and launch unity again!
01-15 01:46:13.567: E/Unity(15508): [Position out of bounds!]

解決法

[System.Serializable]なSoundPlayerというクラスの名前を別のものにする(今回はSoundProviderという名前にリネームして解決)

Before

SoundPlayer.cs
namespace Hoge
{
    [System.Serializable]
    class SoundPlayer{
        [SerializeField]
        AudioClip hogehoge;
~~中略

After

SoundProvider.cs
namespace Hoge
{
    [System.Serializable]
    class SoundProvider{
        [SerializeField]
        AudioClip hogehoge;
~~中略

原因

正直よく分からないですが、元々System.Media名前空間にSoundPlayerというクラスがあります。

SoundPlayer クラス (System.Media) | Microsoft Docs
https://docs.microsoft.com/ja-jp/dotnet/api/system.media.soundplayer?view=netframework-4.8

おそらくですが[Serializable]ではない同名のクラスが存在するとこのエラーが発生すると考えられます。apk起動時にシーン内のオブジェクトに紐付いたHoge名前空間のSoundPlayerをSystem.Media名前空間内のSoundPlayerでデシリアライズしようとしているとか。

おまけ:解決に至るまで試したこと

上記のエラーをググるとエディタ関係のエラーで参照が切れていると発生するといった記事が出てきます。
が、検索結果に出てきた「LibraryとTempフォルダを削除」、「Reinportする」をしてビルドしても症状は変わらず。

この時点で完全に手詰まりで頭を抱えました。
Previewの「2D Pixel Perfect」パッケージを外してみたりしたものの改善せず。
音を付ける前は起動できていたので最近追加した音周りが怪しいということで音周りのコードを確認しました。
で、SoundPlayerという名前のクラスが別にあったので、自作のSoundPlayerの方の名前を変えたら解決しました。

当てずっぽうだったので、あんまり褒められたものではありませんが、なんとか前に進むことができました。

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