2021-01-11に更新

ARでユニティちゃんを表示したい

せっかくiPhone12Proを買ったので、LiDARを使って遊んでみたい。
ということで調べたことをまとめていきます。

できればかわいい女の子を自分の部屋に召喚したい...。

2021/01/09追記
App Storeにリリースしました

ユニティちゃんAR表示のためにやったこと

  1. ユニティちゃんをAssetStoreから入手
  2. ARFoundationのサンプルのOcclusionMeshesのシーンを表示(このシーンを編集して実装を進める)
  3. タップした箇所にユニティちゃんを追加するスクリプトを「ARがわかる本」4章の通り実装
    →実行サンプル動画

ユニティちゃんの目線を自分に向けたい

このままではユニティちゃんが立っているだけなので、現実感に欠ける。
こっちを向くように実装したい。

下記スクリプトを設定したところ、想定した動作になった。
Unityちゃんの見る方向をIKで変える方法 - Qiita

ちゃんとこっちむいてる

ただし後ろに回っても顔だけ変えようとするのが微妙
怖い...

とりあえず、カメラがユニティちゃんの後ろに行ったらこちらを見ないように実装して回避

ユニティちゃんを動かしたい

ボーッと立っててもアレなので、ランダムでユニティちゃんが動くように実装
下記のように基本の立ちポーズから、色々なモーションに移行するようなAnimatorを作成。
あとはコードでランダムに移行させる。

Conditionsに移行条件を設定しておく

public enum UnityChanMotion
{
    Pose1,
    Wait3,
    Wait2,
    Wait1,
    Win0,
    Lose0,
}

 private Animator _animator;
 private UnityChanMotion _motion;
  void Start()
    {
        _animator = GetComponent<Animator>();

        _motion = UnityChanMotion.Pose1;
        _animator.SetInteger("AnimationPattern", (int)_motion);
        StartCoroutine("StartRandomMotion");
    }

    private IEnumerator StartRandomMotion()
    {
        while (true)
        {
            if (_motion != UnityChanMotion.Pose1)
            {
                _motion = UnityChanMotion.Pose1;
                _animator.SetInteger("AnimationPattern", (int)_motion);
                yield return new WaitForSeconds(1.0f);
            }

            //一定の確率で何もしない
            if (UnityEngine.Random.Range(1, 100) < 90)
            {
                yield return new WaitForSeconds(1.0f);
                continue;
            }

            int max = (int)Enum.GetValues(typeof(UnityChanMotion)).Cast<UnityChanMotion>().Max();
            int cnt = UnityEngine.Random.Range(1, max + 1);
            _motion = (UnityChanMotion)cnt;
            _animator.SetInteger("AnimationPattern", (int)_motion);

            // 指定した秒数だけ停止
            yield return new WaitForSeconds(3.0f);
        }
    }

AppStoreにリリース!

このあたりを参考させて頂いて準備して提出!
iOS アプリ申請のためXcodeでアップロードする
個人開発のUnityアプリをApp Storeに公開するまで - Qiita
個人開発者がAppStore用にプライバシーポリシーを書く - Qiita

1度リジェクトを食らう
「During review, we found that your app includes TrueDepth APIs. However, we were not able to locate any features in your app that use TrueDepth APIs.」
True Depth API使っているけど、アプリにその機能がないよ。いらないなら消してね。という感じ。
これが若干詰まった。ARFoundationのサンプルプロジェクトでインストールされている、ARKit Face Trackingのパッケージがダメらしいのだが、removeしても消えない。なぜか自動的に再インストールされる
【Unity】App Store申請時にTrueDepth APIでRejectされた際の対応(Unity AR Foundation使用)Part.1 : Lab 7 in Singapore

なんとAssets¥XR¥Settingsフォルダ下にあるAR Kit SettingsのFace TrackingがTrueになっていると自動でインストールされるみたい。
オフにして解決。
この機能いる?
スクリーンショット 2021-01-11 18.17.53.png

参考URL等

メインで参考にさせて頂いたもの

ARKit3.5およびAR Foundation4.0を試しました - じゅころぐAR
→「ARがわかる本」を買ってARの基本をざっと試してみた

Unity-Technologies/arfoundation-samples: Example content for Unity projects based on AR Foundation
→ARFoundationのサンプル

以下情報集めに利用

iPhone 12 Pro(LiDAR) + ARFoundationで ARゲームことはじめ - カミナシ開発者ブログ
→ARFoundationでLiDARの機能を使うやり方

iPhone 12 Pro(LiDAR) + ARFoundationで ARゲームことはじめ - カミナシ開発者ブログ


以下自分用メモ

新規プロジェクトでARFoundation4.1.1が動かない

  1. 「ARがわかる本」2章を参考にプロジェクトを作成
  2. ARFoundation,ARKitを4.1.1にUpdate(LiDAR関連の機能使いたかった)
    →実行したら真っ暗なので、断念

ユニティちゃんが落ちる

  • 「ARがわかる本」7章の通り、Characterを動かすスクリプトを実装
    →落ちていくユニティちゃん(AR Plane Managerがないから?)
  • それならばとy軸に落ちる処理を消す
    →明後日の方にいくユニティちゃん。(上にめり込んだ)

CharacterControllerのチェックを外すと落ちなくなった。

ボールとユニティちゃんの当たり判定を追加

ユニティちゃんにCapsule Collidar,Rigidbodyを追加

ユニティちゃんをAnimationで動かしたい

CharacterControllerの使い方について【Unity】 | グッドラックネットライフ
→CharacterControllerでキャラを動かせそう

Unity初心者のためのアニメーションの基礎の基礎 - Qiita

Unityのアニメーションの切り替えシステムとスクリプト | Unityを使った3Dゲームの作り方(かめくめ)
【UnityC#講座】ユニティちゃんでもっとAnimator Controllerを上手く使いたい | Unityで魔物使い♀ゲームを作る

ユニティちゃんおいたら何かメニューが出る

unitychan_dynamicのFace Updateのチェックを外したら出なくなる

ユニティちゃんのAnimatorControllerについて

UnityChanActionCheck

デフォルトである
床設置しなければ落ちる
キーを押すと設定されているアニメーションが順に実行される
image

UnityChanARPose

キーを押すと設定されているアニメーションが順に実行される(ポーズ系)

ユニティちゃんを振り向かせたい

ユニティちゃんの背後に回った時に、後ろを振り返って欲しい
回転に関しては下記を参考に実装
Unityでオブジェクトを回転させる方法まとめ | tama-lab

        //指定した方向にゆっくり回転する
        _target = Quaternion.Euler(0, 90f, 0);
        Quaternion nextAngle = Quaternion.RotateTowards(transform.rotation, _target, step);
        transform.rotation = nextAngle;

        //終了検知
        if (Mathf.DeltaAngle(transform.rotation.x, _target.x) == 0 &&
            Mathf.DeltaAngle(transform.rotation.y, _target.y) == 0 &&
            Mathf.DeltaAngle(transform.rotation.z, _target.z) == 0)
        {
            _needRotate = false;
            //Debug.Log("Rotation end");
        }

他参考

【Unity】アスペクト比や解像度に合わせてUIの位置とサイズを固定する方法 | ぺんごや
【Unity】タップされた位置がボタンの上だったら反応させない - Kludge Factory
【Unity】カメラのシャッターエフェクト(フラッシュ)を実装してみる | ぐるたかログ
[Unity4.6 Unity UI (uGUI)のCanvas内で表示順(重なり)を調整する - タカシカンパニーブログ](http://takashicompany.hatenablog.com/entry/2014/09/02/234901

写真の保存

info.plistに下記項目を追加し、アクセス権限要求文言を追加
Privacy - Photo Library Usage Description

ツイッターでシェア
みんなに共有、忘れないようにメモ

carl0967

Crieitは誰でも投稿できるサービスです。 是非記事の投稿をお願いします。どんな軽い内容でも投稿できます。

また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!

有料記事を販売できるようになりました!

こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください。
ボードとは?

コメント