すだちキャンパス

すだちキャンパス

やってみたこと、学んだことなどのメモ。

プライバシーポリシー

ブログを行うにあたって、プライバシーポリシーは必須らしいので、作成してみました。
自分なりに調べて書いてみましたが、間違っていたらコメントなどでお知らせください。

広告の配信について

このブログでは、広告を掲載して紹介料を得るという仕組みのアフィリエイトプログラムである、Amazonアソシエイト・プログラムに参加しています。
そのため、第三者がコンテンツおよび宣伝を提供し、訪問者(閲覧者)から直接情報を収集し、訪問者(閲覧者)のブラウザにCookie(クッキー)を設定したりこれを認識したりする場合があります。

また、今後、第三者 (Google) 配信の広告サービス「Google Adsense グーグルアドセンス」を利用する可能性があります。
グーグルアドセンスの審査に通ったので、このサイトでのグーグルアドセンスの利用を開始しました。(2018/11/15)
広告配信事業者は、ユーザーの興味に応じた広告を表示するためにCookie(クッキー)を使用することがあります。
Cookie(クッキー)を無効にする設定およびGoogleアドセンスに関する詳細は「広告 – ポリシーと規約 – Google」をご覧ください。

アクセス解析ツールについて

このブログでは、Googleによるアクセス解析ツール「Googleアナリティクス」を利用しています。
このGoogleアナリティクスはトラフィックデータ(何時に人が見に来たか?など)の収集のためにCookieを使用しています。このトラフィックデータは匿名で収集されており、個人を特定するものではありません。この機能はCookieを無効にすることで収集を拒否することが出来ますので、お使いのブラウザの設定をご確認ください。この規約に関して、詳しくはこちらからご覧ください。

このブログへのコメントについて

当サイトでは、スパム・荒らしへの対応として、コメントの際に使用されたIPアドレスを記録しています。
これはブログの標準機能としてサポートされている機能で、スパム・荒らしへの対応以外にこのIPアドレスを使用することはありません。また、メールアドレスとURLの入力に関しては、任意となっております。全てのコメントは管理人が事前にその内容を確認し、承認した上での掲載となりますことをあらかじめご了承下さい。加えて、次の各号に掲げる内容を含むコメントは管理人の裁量によって承認せず、削除する事があります。

  • 特定の自然人または法人を誹謗し、中傷するもの。
  • 極度にわいせつな内容を含むもの。
  • 禁制品の取引に関するものや、他者を害する行為の依頼など、法律によって禁止されている物品、行為の依頼や斡旋などに関するもの。
  • その他、公序良俗に反し、または管理人によって承認すべきでないと認められるもの。

免責事項

当サイトで掲載している画像の著作権・肖像権等は各権利所有者に帰属致します。権利を侵害する目的ではございません。記事の内容や掲載画像等に問題がございましたら、各権利所有者様本人が、該当記事にコメントしていただきますようお願い申し上げます。確認後、対応させて頂きます。
当サイトからリンクやバナーなどによって他のサイトに移動された場合、移動先サイトで提供される情報、サービス等について一切の責任を負いません。
当サイトのコンテンツ・情報につきまして、可能な限り正確な情報を掲載するよう努めておりますが、誤情報が入り込んだり、情報が古くなっていることもございます。
当サイトに掲載された内容によって生じた損害等の一切の責任を負いかねますのでご了承ください。

よろしくお願いします!!!

unity1weekに参加しました(6回目)

こんにちは。年末のunity1weekに参加したので、感想などを書いておきたいと思います。
ちなみに、今回は時間がなかったためほぼ1日で作成しました。unity1weekならぬunity1dayですね。

作ったもの

こちら↓です。屏風から逃げてしまった虎を捕まえるゲームです。
unityroom.com
f:id:sweetgohan:20211230163039p:plain

制作過程

イデア出し(2-3時間)

イデア出しはそこそこ時間をかけたと思います。なぜなら、unity1weekに参加するかどうかをずっと迷っていたからです。
初めは木を削って彫刻を作るようなゲームを考えていたのですが、削る部分の処理が上手く作れなさそうで断念・・・やっぱり参加は諦めようかなと思っていたところ、削る処理を調べていた時に得た知識を使えばゲームになるのではないかと思いつきました。そして来年は寅年ということから屏風の虎を連想し、虎捕獲ゲームを作ることにしました。

制作-機能実装(4-5時間)

とにかく時間が無かったためとりあえず最低限遊べるものを作ろうと思い、仮オブジェクト(ただのSphereやCubeなど)を使用して機能を実装することにしました。
実装順序としては、虎が屏風越しにしか見えないようにする機能→Pro Builderでステージ作成→捕獲する機能→UI作成→リザルト画面作成→タイトル画面作成 という風に作りました。

今回の実装で初めて挑戦した部分は、初めに作成した「虎が屏風越しにしか見えないようにする機能」のみだったので数時間でなんとかなったのかもしれません。
ちなみに、この機能はこちらの記事などを参考にして、シェーダーでZWriteをONにした後Render Queueを指定することで実現しています。

また、これは反省点でもあるのですが、「捕獲する機能」の実装時に使用したOnTriggerStay中のif文の判定がされない場合があるという問題がありました(原因不明)。
おそらくif文の判定に入る前に高速でExitとEnterを繰り返してしまっているのかなと思ったのですが・・・コライダを大きめに取れば良いかなとも思いましたがあんまり大きくするとかなり簡単になってしまうので、たまたまちょうどいい難易度になっていたこともあり今回はそのままにしました。
ExitとEnter時も判定するようにして、かつスペースキーを1度だけ押すのではなく連打するようにした方が良かったかなと思います。

制作-アセット探しと適用・アップロード(3-4時間)

必要な機能を実装した後はひたすらアセット(3Dモデル・画像・音)を探し適用するという作業をしました。ただ、実装途中の息抜きにアセット探しをした時間もあったのでここの時間は少し曖昧です。素材を作って配布してくださっている方々には感謝しかないです。

反省と感想

画像付きツイート機能を付けたのですが、今回は何人かツイートしてくださっている方がいてとても嬉しかったです!!少しシュールな雰囲気にしたのが良かったのかもしれません。
反省点としては、上記の仕様()に加えてトラの初期位置がランダムなので割と運要素が強めになってしまったことです。また、できれば向きを変えられるようにしてより自由に動き回れるようにしておいた方が良かったかなと思いました。


それでは、良いお年を。

NrealLightのアプリ開発~MRで魔法を使ってみた ~

こんにちは。冬が間近に迫っているのをひしひしと感じている今日この頃です。
NrealLightというMRグラスのアプリ開発を行う機会があったため、開発方法などをまとめておきたいと思います。

f:id:sweetgohan:20211117180749p:plain
サムネイル用です

NrealLightとは

まずNrealLightとは、nreal社が開発しているMRグラスのことです。MRグラスというとHoloLensなどを想像しますが、それよりもずっと普通のメガネに近く、視野角も広めという製品です。日本では、auショップもしくは公式サイトから購入することができます。
ちなみに、NrealLightにはNrealLight(単品)とNrealLight Developer Kitの2つがあります。それぞれの価格と特徴を簡単にまとめてみました。

  • NrealLight (単品)

価格: 約7万円 (ただしNreal Light対応のAndroidスマートフォンがないと動かないため、実質+10万円必要)
特徴: スマートフォンと接続していれば外(モバイル回線)でも使用可能。アプリストアから様々なアプリをインストールして使える。

価格: 約13万円
特徴: 開発用に特化しているため、デフォルトのサンプルアプリと自作アプリしか使えない(たぶん)が、Dev Kit単体で動作するためスマートフォンを購入する必要がない。

一長一短という感じですね。今回はNreaLight Developer Kitを使用して開発しました。
また、余談ですが今年の12月に別機種のNreal Airが発売される予定です。こちらは機能が減る代わりにより軽く、より安い値段で販売されるそうです。ディスプレイとしての機能に特化したバージョンという印象を受けました。新製品も楽しみです。

開発方法

サンプルを動かす

まずは公式で用意されているサンプルを動かしてみます。開発環境はUnity 2019.4系です(公式のおすすめ)。ちなみに、Unity 2020系を使うとハンドトラッキング機能が使用できなかったのでご注意ください。
さて、基本的にはこちらのQuickStartに従う形になりますが、一応日本語でもメモしておきます。
まずはこちらからNRSDKをダウンロードします。ダウンロードの前に会員登録とアンケート回答を求められるので、指示に従うとダウンロードできます。
また、簡単に実機にインストールするためにscrcpyというアプリをダウンロードしておきます。こちら↓の記事がとても分かりやすかったです。
note.com
ただ、ゴリゴリ開発する上では後述するワイヤレスデバッグを使う方が便利です。

さて、準備ができたら先程のNRSDKをUnityのプロジェクトにimportします。この時、何か警告がでたら全てfixを押します。そして、NRSDK>Demos にあるHelloMRというSceneを開きます。すると、空にヘビ(nrealのロゴ)が浮いているシーンになります。
あとはBuild SettingsでプラットフォームをAndroidに変更した上で、Buildを押すとapkファイルが出力されます。
最後に、Nreal Lightのコンピューティングユニット(四角いやつ)をPCに繋いだ状態でscrcpy.exeを起動し、apkファイルをドラッグ&ドロップするとアプリがインストールされます。インストールが完了したらコンピューティングユニットとNrealLightを繋いで装着するとアプリのアイコン(デフォルトはUnityのロゴ)が表示されるので、クリックするとヘビが回転している様子を見ることができます。
また、視界の中に小さな丸いボタンが浮いていると思います。これをクリックするとパネルとボタンが表示され、他のサンプルデモを体験することができます。(但し、ビルドする時に体験したいSceneをScenes in Buildに加えておく必要があります。)

サンプルの説明

先程のNRSDK>Demos フォルダには色々なサンプルがあり、NrealLightの機能が網羅されています。私が役に立つと感じたサンプルについて簡単にメモしておきます。
・ImageTracking: 用意されている画像(こちら)を元にAR体験ができます。自分で用意した画像を元に作ることもできるみたいです。
・RGBCamera-Record: NrealLightで見ている画面を録画する機能のデモシーンです。私は画面録画を行う時にこのシーンをコピペしていました。
・HandTracking: ハンドトラッキングのサンプルです。デフォルトでは、指の関節が表示されたり手の動きにあわせてCubeが回転したりします。また、浮いている直方体は"NR Grabbable Object"というスクリプトがアタッチされており、掴むことができます。

画面録画について

次は画面録画についてです。といっても、先程RGBCamera-Recordに録画のサンプルがあると書いたので、ここでは録画した映像の取得方法について説明します。
まず、RGBCamera-RecordなどのSceneを実行して録画します。録画する時は、Startボタンを押すと開始されます。
撮影できたらStopを押して録画を終了し、コンピューティングユニットをPCにUSBケーブルで繋ぎます。そしてコマンドプロンプトを立ち上げ、

adb shell

と打ってシェルを起動します。(adbをインストールされていない方はこちらの記事などを参考にインストールしてください。)
起動するとデフォルトとは違う文字(C:\Users\[username]> などではない文字)が出てきて、コンピューティングユニットの内部にアクセスできる状態になると思います。そこでlsと打つとフォルダ・ファイル一覧が表示されるので、動画ファイルを探します。階層の移動はcdコマンドでできます。
私の場合は
/sdcard/Android/data/com.DefaultCompany.[アプリ名]/files
に録画したファイルがありました。
ファイルの場所が分かったらパスをメモしてexitコマンドでシェルを終了します。
そして最後に以下のコマンドを使用すると、指定した場所に保存されます!

adb pull [先程のファイルのパス] [保存したい場所のパス] 

ちなみに、この画面録画ですが一部写らないものもあるようです。私はパーティクルを使用したアプリを作ってみたのですが、なぜかパーティクルは録画に写りませんでした・・・。今後解決策を調べたいですね。

ハンドトラッキングについて

上でも少し説明しましたが、もう少し詳しい使い方について説明します。

ペン機能

初めは無効化されているので気づきにくいのですが、実はサンプルにペン機能(お絵かき機能)も用意されています。
ヒエラルキーのNRInput>Right>NRHand_R の下にLinePenCtrl_Rというオブジェクトがあります。これにチェックをいれてオンにしておくと、人差し指を立てて動かした時に線を描けるようになります。

f:id:sweetgohan:20211117163551p:plainf:id:sweetgohan:20211117163820p:plain

ジェスチャーに反応する機能を実装する

せっかくのハンドトラッキングなので、特定のジェスチャーに反応する機能を実装したいですよね。
そこで調べたところ、こちら↓のハンズオン資料がとても分かりやすかったです。
Nreal Lightハンズオン

ただ、ジェスチャーをカスタマイズする方法が書かれていなかったので、それについて書きます。
NRSDKでは"HandState.cs"というスクリプトに"HandGesture" という列挙型が用意されています。それを使えばここに載っているようなジェスチャーを使うことができそうです。
例えば、

if(handState.currentGesture == HandGesture.OpenHand && magicCircle==null)
        {
            magicCircle = Instantiate(magicCirclePrefab);
        }

のように書くと、手がパーの形の時に魔法陣を生成することができます。

ワイヤレスデバッグについて

NrealLightでは他のAndroidバイスと同じようにワイヤレスデバッグを行うことができます。有線ですとPCに接続した状態でデバッグできず、バグ探しなどが難しくなってしまうため、ワイヤレスデバッグがオススメです。
ワイヤレスで接続するためには、まずIPアドレスを調べる必要があります。コマンドプロンプトを開き、"adb shell"でシェルを起動します。そして次のコマンドを打ちます。

ip addr show wlan0

すると長いメッセージが表示されますが、inet の後の "192.xxx.x.xx/24"となっている太字の部分がIPアドレスです。
確認できたら、以下のコマンドでワイヤレス接続します。

adb tcpip [4桁のポート番号]
adb connect [確認したIPアドレス]:[開いたポート番号]

また、UnityのPackage ManagerからインストールできるAndroid Logcatを使用すると、ワイヤレスでもログなどをリアルタイムに確認することができます。

作ったもの

せっかくなので、魔法が使えるアプリのようなものを作ってみました。


(お部屋の隅にダンボールが積んであるのはVIVEのベースステーションの置き場所が必要だからです・・・)

このような感じで、手をパーに開くと魔法陣が出現し、ピンチの形にするとビームが出るようになっています。
が、何故か残念ながらビームが録画に写りませんでした・・・。一応ピンチした時にnrealのロゴがピンクになっているのがわかると思います。
また、魔法陣といえばピンクという印象があったためピンク色にしています。マテリアルエラーではないです。
魔法陣の素材はこちらのサイトからお借りしました。またビームはこちらの記事を参考にして作りました。

まとめ

NrealLightを使うと未来的なアプリが作れそうで楽しいですね。このようなスマートグラスがもっと普及していってほしいと感じました。

VIVE Pro Eye でARする方法 ( VIVE SRWorks SDKの使い方)

こんにちは。
VIVE Pro Eyeを使ってARコンテンツを作る機会があったので、やり方や注意点についてまとめてみました。

まず、VIVE Pro Eye にはフロントにカメラ(デュアルカメラ)がついているため、Depth(深度情報)を取得することができます。
そして、VIVE公式で用意されている VIVE SRWorks SDK というSDKを使うと、Depthを考慮したARコンテンツを作成することができます。

VIVE SRWorks SDK とは

公式サイトによると、色々できるSDKのようです。具体的には、深度情報の取得・空間マッピング・平面検出・仮想物体とのインタラクション・物体の識別(椅子かどうかを判定するなど?)などができるらしいです。
また、公式ドキュメントはこちら↓です。
hub.vive.com

導入方法

それでは、導入方法についてです。(基本的にはこの記事を書いている時点でのこちらの公式ドキュメントの手順に従っています。)
Unityは2019.3系を使用しました。また、SteamVRの設定でカメラはオン(有効)にしておきます。
f:id:sweetgohan:20211113225730p:plain

※あまり関係ないのですが、VIVE Pro EyeのカメラをWeb cameraとして認識し、その映像をスクリプトで取得してUnity上に表示することもできます。但し、この方法で映像を取得したい場合は上のSteamVRの設定でカメラをオフ(無効)にしないと取得できない(何も映らない/そもそもVIVE Pro Eyeのカメラを認識してくれない)という謎すぎる仕様がありましたので、一応ここにメモしておきます。


さて、まずはこちらから
・SRWorks Runtime
・SRWorks Unity Plugin
の2つをダウンロードします。
ちなみにSRWorks Unity Samples(Experienceというデモシーンが入ったunitypackageが入っています)というものもありますが、これを入れると何故か設定が進まず実行不可能になってしまうため、今回は使用していません。

ダウンロードできたら、まずVIVE_SRWorksInstaller_(バージョン).msi ファイルをダブルクリックで実行します。画面に従ってインストールできたらOKです。
次にUnityで新しいプロジェクトを作成し、先程ダウンロードしたPluginをセットアップしていきます。が、ここではまだSteamVR Pluginを入れないで下さい!
VIVEを使用するのでもちろんSteamVR Pluginを使うのですが、先にSteamVR Pluginを入れてしまうと何故か動きませんでした (私だけかもしれませんが・・・)。
なのでまず先に、ダウンロードしたVive-SRWorks-Unity-Plugin.unitypackageをimportします。Importできたら、念の為Unityを再起動しておきます。そして、Assets>ViveSR>Scenes>ViveSR_Sampleを開きます。
すると設定画面が表示されると思うので、全て勧められるがままに設定します。
ここまできたらSRWorksの設定は完了です!あとはUnityでVIVEを使えるようにSteamVR Pluginを入れたら実行できるはずです。

デフォルトで用意されている機能について

先程開いたViveSR_SampleというSceneを開いて実行してみます。すると、カメラの映像が見えることが確認できると思います。
また、Game画面をクリックした状態でSとRを同時押しすると、画像のようなUIが表示されます。
f:id:sweetgohan:20211113225744p:plain

これのDepthタブからDepth ProcessingとDepth Colliderをオンにすると、深度情報に合わせた青い壁が表示されるようになります。
ちなみに、これは実行中にDontDestroyOnLoad > [SRwork_Framework] > DualCamera (head) のインスペクタの下の方にある "Enable Depth Processing" を押して表示される "Update Depth Collider"を押しても表示されます。
f:id:sweetgohan:20211113225957j:plain

さらに、"Update Depth Material"にチェックを入れるとMaterialsフォルダにあるDepthImageに深度情報を含む画像が生成されていることがわかります。
f:id:sweetgohan:20211113230255p:plain

他にもDepth Collider Clip Distanceを調整すると特定の距離だけ青い壁が表示されるようになるなど、色々なことができるので、このインスペクタで色々遊ぶと楽しいかもしれません。
また、適当なオブジェクトをScene上に配置してDepth ProcessingをONにするとそのオブジェクトの位置を把握して適宜オクルージョンしてくれるので、ARコンテンツを簡単に作ることができます。


VIVEなどのHMDでもARできる!という記事でした。

チームラボさんのインターンに行ってきました

こんにちは。
なんと、今年の夏はあのチームラボさんのサマーインターンに行くことができました。そこで、忘れない内にその様子をレポートしたいと思います。

※この記事は、チームラボの社員の方に確認していただいてから公開しております。

志望理由と経緯

まず、今年の夏は(エンジニア職の)インターンに行きたいと考えていたため、色々な会社に応募しました。
その中でも、チームラボさんは2週間(9日間)というそこそこの長さであること、またオフライン開催であること(※)に魅力を感じ、「インタラクティブエンジニア」に応募しました。(もちろん1番の動機は、チームラボさんの素晴らしい作品の数々が、どのように生み出されているのかを知りたかったというところにありますが。)
しかし、インタラクティブエンジニアでは残念ながらお祈りという結果に・・・なってしまったのですが、なんと「カタリスト」という職種では選考に進めるという連絡が来たため、そちらで選考していただくことになりました!
というのも、カタリストという職業が具体的にどのような業務を行なっているのかに興味があったことと、前述のようにチームラボの内側を見てみたい!という思いが強くあったためです。

そして課題選考と面接で合格をいただき、晴れて空間演出カタリストとしてインターンに行くことになりました。


※オフライン開催ではありましたが、新型コロナウイルス感染予防対策についてオフィス内では全員マスク着用、毎朝のフロア消毒や検温、換気なども徹底して行われていました。また、オンラインでの参加を希望する場合はそれも可能でした。

インターンの様子

取り組んだこと

空間演出カタリストチームのインターンは、インターン生が全員同じ課題に取り組み、最後に発表してレビューしていただくという内容でした。
事前に過去のインターン生の方のブログなどを読んだりして、実際の業務に関われるのではないかと期待していたので少し残念でした・・・が課題の内容はかなり実践的なものでしたし、何よりとてもボリューミーだったので、終わる頃には課題でよかったかもという気持ちになっていました。汗 (詳しい内容は書けませんが、SketchUpIllustratorなどを使用して頑張るような課題でした。)
また、メンターさんが(お忙しい中)相談にのってくださったりして、大変ありがたかったです。

全体として、インターン期間中は毎日朝から晩までひたすら課題に取り組んでいたためとても大変でしたが、ランチ会や元々志望していたインタラクティブエンジニアの方々と交流することもできたため、楽しく過ごすことができました。

ランチ

なんと、お昼ご飯は社員の方(メンターさん)に何度かご馳走していただきました。

f:id:sweetgohan:20210915121801j:plain
豪華なランチ・・・!

それからランチ会として、他の職種の方や同じ大学出身の方と交流する場なども設けてくださり、とても楽しかったです。
ちなみに、最後の方は課題の進捗がかなりやばかったためコンビニで買ったおにぎりを食べつつ黙々と作業していました。

交流会など

インターン生の交流会としてボドゲ部の方にボドゲ会を開いていただき、とても楽しかったです。社内には他にも色々な部活があるようでした。
それから、私がインタラクティブチームにとても興味があったため、インタラクティブエンジニアの方のお仕事を見学したりお話をお聞きする機会も設けていただいたりしました。

さらにインターン期間中に、チームラボプラネッツとチームラボボーダーレスに無料で招待していただきました!!

f:id:sweetgohan:20210915121825j:plainf:id:sweetgohan:20210915121829j:plain

f:id:sweetgohan:20210915121832j:plain
飲み物とアイスクリームにお花が咲きます

とても綺麗で感動しましたし、取り組んでいる課題との繋がりを感じて不思議な気持ちになりました。また、他のインターン生の方々との交流の場としても楽しい時間を過ごせました。


感想

2週間のオフラインインターンということで、とても充実した時間を過ごすことができました。とても楽しかったですし、何より「カタリスト」という立場での考え方などを学べたことが大変貴重な経験になったと感じています。
ただ一方で、インタラクティブエンジニアという職種に改めて強く惹かれたという面もありました。またシェーダーの勉強などを頑張っていきたいと思います!

2週間、本当にありがとうございました!!

LiDARを使ったARアプリ作成

こんにちは。久々の更新となってしまいました。

今回は、iPhone 12 Proを手に入れたので、LiDARの機能を使ったiOSアプリを作って遊んでみました。割とほぼ自分用のまとめです。
以前書いたこちらの改良版的な立ち位置です。

できたもの

先に完成物を貼っておきます。

このように、3Dキャラクター(今回はアリシアちゃん)のポーズを切り替えて自然な写真を撮ることができます。

作り方

UnityでARアプリを作る準備をする

今回使用したバージョンはUnity 2020.3.12fです。
まず、UnityでiOS向けのARアプリを作るために、Window>Package Manager から AR FoundationとARkit XR Pluginをインストールします。それから、SceneのMain Cameraを削除し、AR SessionとAR Session Originを配置します(右クリック>XRから配置できます)。そして、画像のようになるようにAdd Componentからスクリプトを追加します。

f:id:sweetgohan:20210713183218p:plainf:id:sweetgohan:20210713183222p:plain

これで準備は完了です。

オクルージョン用のシェーダーを用意する

次に、現実の物体が3D物体の手前にある場合に、重なっている部分の3Dモデルが隠れて表示されるようにします。そのために、ARMeshManagerを利用します。先ほど作成したAR Session Originの子として新しく空のオブジェクト(適当に"Meshing"と名前をつけました)を作成します。そしてそれにAdd ComponentからAR Mesh Managerを追加します。そして画像のようなPrefabを作成し、AR Mesh ManagerのMesh Prefabに指定します。

f:id:sweetgohan:20210713183957p:plainf:id:sweetgohan:20210713184017p:plain

最後に、このPrefab用のシェーダーを作成します。こちらの記事↓で説明されているシェーダーを使用すると上手くいきました。
qiita.com
そして作成したシェーダーを、先ほどのPrefab(OcclusionMeshPrefab)のマテリアルに設定すればOKです!

配置とサイズ調節を行えるようにする

配置するためのスクリプトは次のようにしました。

if(Input.GetMouseButtonDown(0) && EventSystem.current.currentSelectedGameObject == null)
        {
            if(raycastManager.Raycast(Input.GetTouch(0).position, hitResults, TrackableType.PlaneWithinPolygon))
            {
                GameObject obj = Instantiate(objectPrefab, hitResults[0].pose.position, Quaternion.identity);
                tagObjects = GameObject.FindGameObjectsWithTag("alicia");
                if (tagObjects.Length > 1)
                {
                    obj.name = "after";
                }
                else
                {
                    obj.name = "before";
                }

                //1人だけにする処理
                Debug.Log(tagObjects.Length);
                if (tagObjects.Length > 1)
                {
                    GameObject kesu = GameObject.Find("before");
                    kesu.SetActive(false);
                    Destroy(kesu);
                    GameObject.Find("after").name = "before";
                }

		obj.transform.LookAt(Camera.main.transform, Camera.main.transform.up);
                obj.transform.eulerAngles = new Vector3(0, obj.transform.eulerAngles.y, 0);
		Debug.Log("Object created.");
            }
        }

Prefabを作成して置き換えるという処理は、3Dモデルが増殖したように見えないようにするための処理です。
また、3Dモデルを拡大・縮小する処理は前に書いた記事に載せたスクリプトそのままなので、割愛します。ちなみに、拡大・縮小の処理は配置する処理の前に書きました(そうしないと配置が優先されてしまうためです)。

ボタンでアニメーションを切り替えられるようにする

最後に、ボタンでアニメーションを切り替えられるようにします。今回は、次の3つのアニメーションを使わせていただきました。ありがとうございます。

さて、使用するアニメーションを用意したら、まずAsset上にAnimator Controllerを作ります。そしてそれをダブルクリックし、アニメーションを設定していきます。
ここからは単純作業になります。まずCreate Stateで状態を作成、そしてParametersにパラメータ(Bool)を作成します。そして作成したStateに用意したアニメーションを設定します。今回は"Wait"と"Walk"の2つのStateを用意し、それぞれにアニメーションを設定しました。また、パラメータは"isWalk"としました。
次にTransitionを作成します。Stateの上で右クリックすると"Make Transition"という選択肢があるので、それをクリックして遷移先に繋げます。今回はWaitからWalk, WalkからWaitに繋げました。そして遷移条件を設定します。繋げた線をクリックするとインスペクタに画像のような情報が表示されます。Conditionsの+を押すと条件を追加することができるので、ここでは"isWalk"が"True"なら遷移、という条件にしてあります。
f:id:sweetgohan:20210713185459p:plain

最後に、ボタンを押すと遷移するようなスクリプトを作成します。今回は次のようなスクリプトを作成しました。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class animationChangeScript : MonoBehaviour
{
    private Animator animator;
    void Start()
    {

    }

    void Update()
    {
      animator = GameObject.Find("before").GetComponent<Animator>();
    }

    public void toWalk(){
      toIdle();
      animator.SetBool("isWalk", true);
    }

    void toIdle(){
      animator.SetBool("isWalk", false);
      animator.SetBool("isHello", false);
      animator.SetBool("isSit", false);
      animator.SetBool("isSitFloor", false);
      animator.SetBool("isLieDown", false);
      animator.SetBool("isStand1", false);
      animator.SetBool("isStand2", false);
      animator.SetBool("isStand3", false);
      animator.SetBool("isStand4", false);
      animator.SetBool("isJump1", false);
      animator.SetBool("isJump2", false);
      animator.SetBool("isJump3", false);
      animator.SetBool("isJump4", false);
    }
}

ここでポーズをリセットする処理はtoIdle()にまとめてあります。今回作成したアプリでは13個のモーションを切り替えられるようにしたため、パラメータの数がとても多くなったからです。
そしてあとはボタンを作成し、スクリプトをアタッチすればOKです。
f:id:sweetgohan:20210713190924p:plain

Buildする

最後にBuildしますが、その前にEdit>Project SettingsからCompany Nameを好きな名前に変えておくと(Xcodeの方で)エラーが出にくくなります。
f:id:sweetgohan:20210713191528p:plain

あとはBuild SettingからPlatformをiOSに切り替えて、作成したシーンをScenes in Buildに追加します!そしてBuild And Runを押して出力先を指定し、iPhoneMacに繋いでしばらく待つと、自動でXcode Projectが開かれ、実行されます!

おまけ: サンプルで遊ぶ

こちら↓のサンプルをCloneしてそのままBuildすると、色々な機能が試せて楽しいです。
github.com

終わりに

基本的なことでも久々に触ると忘れていたりするので、簡単にですがまとめてみました。
それではまた。

基本情報技術者試験に合格しました

こんにちは。2月に基本情報技術者試験(FE)を受験して、無事に合格したので合格体験記(?)を書きました。

勉強量と勉強方法

まず、勉強方法などについてです。試験日は2/14だったのですが、実際に勉強を始めたのは1/23,4くらいだったと思います。12月くらいから勉強しないとなあと思ってはいたんですけどね・・・まあ受かったのでヨシとします。。
さて、それではここから具体的な勉強内容について書いていきます。

参考書(1週間)

最初の1週間は「出るとこだけ!基本情報技術者」という参考書を一読しました。
具体的には、「ざっと説明を読む→例題と練習問題を解く」という流れで一応全て読みました。前半の内容はもともと知っている内容も多かったのですが、後半は知らない事項も多かったので、おおまかな新知識のインプットとしては役に立ちました。ですがやはり知識が一番身についたのは過去問演習のおかげだったので、参考書はもっと軽く流し読みする程度でも良かったかなと思います。

過去問道場(2週間)

午前対策

参考書を読んだ後は本格的な試験対策に入りました。
基本情報技術者試験ドットコムという神サイトがありまして、この中の過去問道場を使ってひたすら過去問を解きまくりました。
最初は分野別に全て1周しようとしていたのですが、途中で無理だと気づいて直近の過去問を演習していました。分野かつ年度で出題される問題を絞れるので、「1分野の5~10年分の過去問を解く→休憩」を繰り返しました。
また、直前の3日間は復習に徹しました。過去2回で間違えたことのある問題のみを出題できる機能があったので、全ての分野で直近5年分の問題を1度は正解できるように解き直しました。

一応過去問道場の成果画面も晒しておきます。
過去問道場の達成率1
過去問道場の達成率2

午後対策

次に午後対策ですが、ほとんどなにも勉強しませんでした・・・。一応過去問は少しだけ解きましたが、1問が重くて腰が上がらなかったため、画像の分しか解いていません。
過去問道場の達成率3
過去問道場の達成率4

まあ午後は午前の知識と集中力があれば大丈夫だと思います。

試験当日の様子

当日の朝は会場が混むと思ったので30分前くらいに到着しました。すると着いた人から本人確認をして荷物をロッカーにしまい、注意事項の説明を聞いて席に案内されるというシステムだったので、想定より早く試験を受けることになりました。午前試験と午後試験の間の休憩時間が増えるから良いといえば良かったのですが、会場で直前の復習をしようと思っていたので少し辛かったです。
また、船舶免許を本人確認の身分証明証にするつもりだったのですが、NGが出てしまい予備として持ってきていたパスポートで本人確認を行いました。自動車免許ならOKなのになぜ・・・。

試験自体は問題なく受験できました。CBT方式で操作しにくいかなと少し不安でしたが、過去問道場を解く時にPC+ノートとシャーペンというスタイルで解いていたのでむしろスムーズに解くことができました。

結果

試験後、すぐにスコアレポートがメールで届きます。私の結果は以下の通りでした。

f:id:sweetgohan:20210403175544p:plain
午前試験の結果
f:id:sweetgohan:20210403175512p:plain
午後試験の結果

午前試験は87.5点と合格点が出たのですが、午後はシステム上点数が出ないそうです。午後が配点によっては落ちていそうなのと、問題の選択ミスをしていないかも不安だったので、合格発表の日まで結構ドキドキでした。
無事に合格していて本当に良かったです!

余談ですが、スコアレポートのログイン画面で何回名字を入力しても結果を見られなくてかなり焦りました。実は午前試験の直後に結果を見ようとしたのですが、何度試しても見られなかったので諦めて見なかったのです。午後試験も終わった後で試行錯誤したところ、名字を漢字で入力しないと見られないことが判明しました(スマホの言語設定を英語にしているため分からなかったというオチ)。

f:id:sweetgohan:20210403175236p:plain
名字は漢字で入力しましょう