ソースに絡まるエスカルゴ

貧弱プログラマの外部記憶装置です。

【Blender】音付きで動画をレンダリングする方法

rikoubou.hatenablog.com

 以前の記事で「Blender上で音をつけてもレンダリング時には音が付かない」と書いていたのですが、色々設定をいじった結果「実はできる」ことが判明したので、そのやり方についての備忘録です。

 今回は簡単なアニメーションにBGMをつけるというのをやっていきます。


1:音楽ファイルを用意する
maoudamashii.jokersounds.com

 なんでも良いのですが今回はフリーで使える「魔王魂」さんの楽曲をお借りすることにします。
 以降の内容は「魔王魂」さんの「ジングル13」という楽曲を使用します。


2:Blenderで音付きのアニメーションを作成する
rikoubou.hatenablog.com
 作り方は以前の記事と同じように作成します。

 今回作ったものは以下のようなものです(実際にはビデオシーケンスエディタに追加した音も流れています)。
f:id:rikoubou:20180717180014g:plain


3:音付きでレンダリングする
 ここが本題です。やり方を説明していきます。

 はじめに「Renderアイコン」の「Output」の項目にある「PNG」となっているプルダウンから「FFmpeg video」を選択します。
f:id:rikoubou:20180717180248p:plain

 次に「Encoding」の項目にある「Presets」プルダウンから「h264 in MP4」を選択します。
f:id:rikoubou:20180717180534p:plain

 このままレンダリングボタンを押せば普通の動画出力と同じですが、ビデオシーケンスエディタに追加した音も一緒に出力する場合はもう一つの項目の設定も行います。

「Encoding」の項目にある「Audio Codec:」の「None」となっているプルダウンから「AAC」を選択します。
f:id:rikoubou:20180717180709p:plain

 すると以下のように設定されます。
f:id:rikoubou:20180717180846p:plain

 この状態で「Animation」ボタンを押します。
f:id:rikoubou:20180717181004p:plain

 すると以下のように音付きで動画が出力されます。


 以上がBlenderで音付きで動画をレンダリングする方法です。

 単に設定をいじればよかったというただそれだけでした。

【Blender】マンゴーっぽいものをモデリングする

 今までの知識を使って以下のようなマンゴーっぽいもの自己流モデリングをやっていこうかと思います。
f:id:rikoubou:20180705183600g:plain

 操作がわかっている人なら10分程度でできると思います。

 それでは始めます。


1:マンゴーの土台となる半円を作成する
 最初にBlenderを起動した時に出て来るCubeを削除します。

 左側から「Create」→「UV Sphere」を選択してSphereを作成します。
f:id:rikoubou:20180705171901p:plain

 このSphereを土台に作成していきます。
f:id:rikoubou:20180705172028p:plain

Sphere」オブジェクトを選択した状態で「Objectアイコン」を選択し「Rotation」のX座標に90と入力してSphereを90度回転させます。
f:id:rikoubou:20180705172151p:plain

 回転させたら「Edit Mode」を選択して編集モードに切り替えます。
f:id:rikoubou:20180705172442p:plain

 編集モードに切り替えたら、「B」キーでの矩形選択や「C」キーでの塗りつぶし選択などを使ってSphereの下半分の頂点を選択します。
f:id:rikoubou:20180705172719p:plain

 この状態で「X」キーを押して出てくる中から「Vertices」を選択して頂点を削除します。
f:id:rikoubou:20180705172932p:plain

 これで以下のように半円になりました。
f:id:rikoubou:20180705173056p:plain

 次に形を調節します。適当でよいですが、自分の場合はScaleを以下のように調節しました。
f:id:rikoubou:20180705173312p:plain

 ここまでできたら「Object Mode」を選択して一度オブジェクトモードに戻ります。
f:id:rikoubou:20180705173428p:plain

 オブジェクトモードに戻ったら「Modifiersアイコン」を選択し、「Add Modifiers」から「Decimate」を選択して追加します。
f:id:rikoubou:20180705173627p:plain

 追加した「Decimate」の「Un-Subdivide」を選択し「Iterations」の値を2にしてポリゴン数を減らし、「Apply」ボタンを押して適用します。
f:id:rikoubou:20180705173916p:plain

 その後左下の「Object」→「Apply」→「Rotation & Scale」を選択して今の角度やスケールを基準にします。
f:id:rikoubou:20180705174144p:plain
f:id:rikoubou:20180705174315p:plain

 これでマンゴーの土台部分ができました。


2:肉付けをしていく
 再び「Edit Mode」を選択して編集モードに切り替えます。
f:id:rikoubou:20180705174449p:plain

「A」キーを押して全頂点を選択し、その状態で「Alt+Eキー」を押して「Region(Vertex Nomals)」を選択します。
f:id:rikoubou:20180705174700p:plain

 以下のようにマウスを動かして内側に厚みを持たせ、左クリックで確定させます。
f:id:rikoubou:20180705174907g:plain

 次に以下のようにマンゴーの上表面部分のみを選択します。
f:id:rikoubou:20180705175213p:plain
f:id:rikoubou:20180705175221p:plain

 その状態で「Alt+Eキー」を押して「Individual Faces」を選択します。
f:id:rikoubou:20180705175341p:plain
 
 以下のようにマウスを動かして外側に面を押し出し、左クリックで確定させます。
f:id:rikoubou:20180705175541g:plain

 これで形自体は完成です。
f:id:rikoubou:20180705175648p:plain


3:着色しソフトボディを追加する
 形ができたら「Object Mode」を選択してオブジェクトモードにします。
f:id:rikoubou:20180705181047p:plain

 オブジェクトモードにしたら左側の「Create」→「Sun」を選択して「Sun」を作成して光源を追加します。
f:id:rikoubou:20180705181649p:plain

 Sphereを選択した状態で「Materialアイコン」を選択し「New」ボタンを左クリックします。
f:id:rikoubou:20180705181217p:plain

 画面を「Rendered」にしてMaterialの「Diffuse」と「Specular」の項目で色をつけたりして調節します。
f:id:rikoubou:20180705181850p:plain

 次に以下の記事でやったソフトボディをこのオブジェクトに追加します。

 設定は以下のようにしました。
f:id:rikoubou:20180705183156p:plain

 これでアニメーションさせるとちょっとプルプルしすぎな感じもありますが、マンゴーっぽいものができました。
f:id:rikoubou:20180705183600g:plain


 以上がマンゴーっぽいもののモデリング方法です。もうちょっと簡単にできる方法があるかもしれませんが、とりあえず我流でここまでということで。

 一応今回作成したblendファイルも公開しておきます。


 最後に一言、「Shinzan Strong...」


・参考資料

【Blender】ソフトボディの使い方

 今回はBlenderでのソフトボディについての備忘録です。
 ソフトボディはぷにぷにしたもの(例えばスライムとか)を表現したいときに使います。

 以下のような四角いぷるぷるしたものを作っていきます。
f:id:rikoubou:20180702185709g:plain


1:ソフトボディにしたいオブジェクトを作成する
 Blenderを起動した時に作成されるCubeを使用していきます。

 Cubeを選択した状態で、3D Viewの左下にあるところから「Edit Mode」を選択して編集モードにします。
f:id:rikoubou:20180702175402p:plain

 編集モードにしたら「Aキー」を押してCubeの頂点を全選択します。
f:id:rikoubou:20180702175525p:plain

 その状態で「Wキー」を押し、出て来た中から「Bevel」を左クリックして選択します。
f:id:rikoubou:20180702175626p:plain

 マウスを移動させると以下のように面取りができるので、適当な形になったら左クリックで確定させます。
f:id:rikoubou:20180702175950g:plain

 これで形はできたので、次は色をつけていきます。

 3D Viewの左下から「Object Mode」を選択してオブジェクトモードに切り替えます。
f:id:rikoubou:20180702180118p:plain

 Cubeオブジェクトを選択した状態で「Materialアイコン」を選択します。デフォルトのCubeならMaterialが追加されていますが、Materialがない場合は「New」ボタンから追加してください。 
f:id:rikoubou:20180702180400p:plain

 Materialを設定します。自分の場合はレンダリング画面で以下のように見える設定にしました。
f:id:rikoubou:20180702180949p:plain

 これでソフトボディにするオブジェクトができました。


2:ソフトボディの設定
 次はソフトボディを設定していきます。やり方は簡単です。

 ソフトボディにしたい対象のオブジェクトを選択し、「Physicsアイコン」の「Soft Body」を選択します。
f:id:rikoubou:20180702181316p:plain

 この状態でアニメーションさせると以下のようにふよふよ浮いた状態になります。
f:id:rikoubou:20180702181541g:plain

 これでは困るので「Soft Body Goal」のチェックを外します。
f:id:rikoubou:20180702181734p:plain

 するとオブジェクトが落下するようになります。
f:id:rikoubou:20180702181920g:plain

 今度は落ちた先に地面を作成します。

 左の「Create」タブから「Plane」を選択します。
f:id:rikoubou:20180702182114p:plain

 作成したら「Sキー」を押しながらマウスを動かして適当な位置までPlaneを大きくします。
f:id:rikoubou:20180702182252p:plain

 次に「Plane」に衝突判定を持たせます。「Plane」を選択した状態で「Physicsアイコン」から「Collision」を選択します。
f:id:rikoubou:20180702182437p:plain

 これで「Plane」に衝突判定が加わり、地面が作成できました。

 Cubeを移動させ、高い位置から落下させると以下のようになります。
f:id:rikoubou:20180702182822g:plain

 ぐにゃぐにゃしていますが、最終的には形が崩れてしまいました。


3:ソフトボディの各種値を調節する
 ソフトボディを調節には「Soft Body Edges」の値を変更します。

 自分の場合は以下のように設定しました。
f:id:rikoubou:20180702183825p:plain

 この状態でアニメーションさせると以下のようになります。割といい感じかと思います。
f:id:rikoubou:20180702184008g:plain

 ちなみに複数のソフトボディのオブジェクトそのままだと、以下のようにオブジェクト同士がめり込んでしまいます。
f:id:rikoubou:20180702190115p:plain

 複数のソフトボディのオブジェクト全てにCollisionを設定すればめり込むことはなくなります。
f:id:rikoubou:20180702190321p:plain

 あとはこのオブジェクトを複製したり、Planeに色をつけたり、照明を調節したりすると冒頭のアニメーションになります。
f:id:rikoubou:20180702185709g:plain


 以上がソフトボディのやり方です。オブジェクトをぷるぷるさせたい場合はこの方法でできます。

 今回作成したblendファイルは以下に公開しています。


・参考資料

【Blender】オブジェクト同士を接地させるDrop To Groundアドオン

 Unityと平行してBlenderもちょくちょく触っています。
 その中で「Drop To Ground」という便利なアドオンを見つけたのでその紹介と使い方です。


1:Drop To Groundの紹介
www.youtube.com
 アドオンの制作者(多分)さんの動画で使い方の説明までされています。

 導入方法は

  1. 動画説明文にあるアドレスからzipファイルをダウンロードして解凍
  2. 解凍してできたファイルをBlenderにアドオンとして読み込ませればOK

 という手順でできます。

 アドオンの追加は以下の方法でできます。

 最初に「File」から「User Preferences」を選択します。
f:id:rikoubou:20180705165845j:plain

「Add-ons」タブを開き「Install Add-on from File」ボタンを左クリックします。
f:id:rikoubou:20180705170005j:plain

 対象のアドオンファイルを選択して「Install Add-on from File」ボタンを左クリックして追加します。
f:id:rikoubou:20180705170117j:plain

 対象アドオンが追加されるので、そのアドオンにチェックを入れて有効化します。そして「Save User Settings」ボタンを押すことで設定を保存します。
f:id:rikoubou:20180705170455j:plain


2:Drop To Groundの使い方
 ではDrop To Groundアドオンの使い方です。

 例えば以下のように地面を想定した「Plane」と地面に接地させたい「Cube」があるとします。
f:id:rikoubou:20180628143730p:plain

 先に接地させたいオブジェクトである「Cube」を右クリックで選択します。

 その後、地面を想定した「Plane」をShift+右クリックで選択します。
f:id:rikoubou:20180628144044p:plain

 その状態で左にある「Tool」タブの「Drop To Ground」ボタンを押します。
f:id:rikoubou:20180628144244p:plain

 すると以下のように手動で座標合わせをしなくても、ぴったりと接地してくれます。
f:id:rikoubou:20180628144357p:plain


 以上がDrop To Groundアドオンの紹介と使い方です。

 モデリングしたキャラクターなどを接地させる時とかにはとても便利なアドオンだと思います。

【Raspberry Pi】Raspberry Piの最低限のセットアップ方法

 Raspberry Piのセットアップ方法を毎回調べるのは面倒なので、ネットに繋いだり日本語入力をできるようにしたりなどの最低限の設定方法を備忘録として残しておこうと思った次第です。

 Raspberry Piとタイトルにありますが、Raspberry Pi Zero Wなどでも同様の手順で環境構築をすれば問題ないです。

 ちなみに今回はMacでの手順となり、Windowsでは違う手順になる場合がありますのでご了承ください。

 では始めます。


0:Raspberry Piを動かすのに必要な一式を揃える
 Raspberry Pi本体だけを購入しても動かすことはできません。基本的なことですが以下のものが必要になります。

1:Raspberry Pi 3 Model B+(Element14製) - スイッチサイエンス
 Raspberry Pi本体。

2:ラズパイ3Bおよび3B+に最適なACアダプター 5V/3.0A USB Micro-Bコネクタ出力 - スイッチサイエンス
 Raspberry Pi用の電源。USB Micro-Bコネクタ。5V-3Aのものが良い。(最低でも5V-2.5A)

3:シリコンパワー microSDHCカード 16GB
 Raspberry PiのOSとストレージを入れるためのもの。OS自体が4GB以上あるため、最低16GB以上のMicroSDカードを用意しておくのが良いと思われる。

4:【Bonss】モニター 7インチ ディスプレイ 内蔵スピーカー Raspberry Pi用 1024*600解像度
 HDMI接続のモニター。すでにお持ちであればそれでも良いですがRaspberry Pi専用のモニターであれば取り回しのよい小さめのサイズがオススメです。

5:Amazonベーシック USBマウス MSU0939
 USB接続のマウス。USB接続であればなんでもよいです。

6:エレコム 有線ミニキーボード 静音タイプ
 USB接続のキーボード。USB接続であればなんでもよいです。

7:PC
 Raspberry PiのOSを書き込むために必要になります。

※特に電源のボルト数とアンペア数には気をつけてください。またMicroSDカードについてはどの程度の使うかを考えて最適な容量のものを買うようにした方が良いです

 以降はこれらの一式が揃っているという前提で始めます。


1:Raspbian(Raspberry Pi用のOS)をMicroSDカードに書き込む
www.raspberrypi.org
 始めに上記のRasoberry Pi公式のダウンロードページからRaspbian(Raspberry Pi用のOS)をダウンロードします。

 末尾が「DESKTOP」となっているものと「LITE」というものの二種類ありますが「DESKTOP」の方をダウンロードしてください。(2GB近くあるので気長に待ちましょう)
f:id:rikoubou:20180625173313p:plain

 ダウンロードしたzipファイルを解凍すると以下のようにimgというイメージファイルができます。(今回はファイル名が「2018-04-18-raspbian-stretch.img」。5GB近くある)
f:id:rikoubou:20180625180202p:plain

 イメージファイルの準備ができたら以下のページから「SD Card Formatter」をダウンロードしてインストールします。

 インストールできたらRaspberry Piで使用するMicroSDカードをPCに接続した状態で「SD Card Formatter」を起動させます。
 すると以下のような画面になるので「カードの選択」というところに出ている「disk●●」という部分をメモしておきます。
f:id:rikoubou:20180625181645p:plain

 新品のMicroSDカードでない場合や何が入っているかわからない場合は、上書きフォーマットを選択した状態で「フォーマット」ボタンを押してMicroSDカードをフォーマットします。

 次にターミナルを立ち上げて以下の2つのコマンドを実行します。

$ diskutil unmountDisk /dev/{disk●●}
$ sudo dd if=/{イメージファイルまでのパス}/{イメージファイル名}.img of=/dev/r{disk●●} bs=1m

 1つ目のコマンドでMicroSDカードをアンマウントし、2つ目のコマンドでイメージファイルをMicroSDカードに書き込んでいます。

 具体的な例としてメモしたdisk●●が「disk2」、イメージファイルまでのパスが「Users/hogeイメージファイル名が「2018-04-18-raspbian-stretch.img」の場合は以下のコマンドになります。

$ diskutil unmountDisk /dev/disk2
$ sudo dd if=/Users/hoge/2018-04-18-raspbian-stretch.img of=/dev/rdisk2 bs=1m

 MicroSDカードに書き込むのにはしばらく時間がかかるので気長に待ちます。

 進行状況は表示されませんが、書き込んだバイト数などが表示されていれば書き込みは完了しています。
f:id:rikoubou:20180625190132p:plain


2:Raspberry Piを起動させ、表示言語などの設定を行う
 Raspberry Piに1のMicroSDカードを差し込み、キーボードやマウス、モニターを接続して電源を入れます。

 しばらくするとデスクトップの画面になるので、以下のように左上にあるRaspberry Piのボタンを左クリックして「Preferences」→「Raspberry Pi Configuration」を選択します。
f:id:rikoubou:20180626182520p:plain

 出てきたダイアログの「Localisation」タブを開いて「Set Locale」ボタンを左クリックします。
f:id:rikoubou:20180626184042p:plain

「Locale」画面が出てくるので、Languageを「ja(Japanese)」、Countryを「JP(Japan)」、Character Setを「UTF-8」に設定して「OK」ボタンを左クリックします。
f:id:rikoubou:20180626184155p:plain

 次に「Set Timezone」ボタンを左クリックします。
f:id:rikoubou:20180626184537p:plain

「Timezone」画面が出てくるので、Areaを「Japan」に設定して「OK」ボタンを左クリックします。
f:id:rikoubou:20180626184715p:plain

 次に「Set Keyboad」ボタンを左クリックします。
f:id:rikoubou:20180626184836p:plain

Keyboad Layout」画面が出てくるので、Countryで「Japan」を選択して出てきた中にある「Japanese(OADG 109A)」を選択して「OK」ボタンを左クリックします。(接続しているキーボードにあったキー配列を選択する必要がありますが、大体は「Japanese(OADG 109A)」で大丈夫です)
f:id:rikoubou:20180626185213p:plain

 次に「Set WiFi Country」ボタンを左クリックします。
f:id:rikoubou:20180626185330p:plain

WiFi Country Code」画面が出てくるので、Countryを「JP Japan」に設定して「OK」ボタンを左クリックします。
f:id:rikoubou:20180626185519p:plain

 全部の設定が終わったら右下にある「OK」ボタンを左クリックし、出てくるダイアログで「Yes」ボタンを左クリックしてRaspberry Piを再起動させます。
f:id:rikoubou:20180626185803p:plain

 再起動が完了すると、以下のようにメニューなどが日本語表示になります。
f:id:rikoubou:20180626190052p:plain


3:ディスプレイサイズの設定を行う
 2での再起動が完了したら、画面左上にある「LXTerminal」のアイコンを左クリックして起動させます。
f:id:rikoubou:20180626190202p:plain

 黒い画面の「LXTerminal」が立ち上がるとキーボードでコマンドを入力することができるので、以下のコマンドを入力して実行します。

$ sudo leafpad /boot/config.txt

 すると「config.txt」を開いたテキストエディタが立ち上がるので、スクロールした先にある「hdmi_group」と「hdmi_mode」のところの「#」を消して適切な値に書き換えます。基本的には「hdmi_group=2」で「hdmi_mode」は接続しているモニターの解像度に合わせてください。
f:id:rikoubou:20180626190853p:plain

 hdmi_modeの値は以下のページ内を「These values are valid if hdmi_group=2」というキーワードで検索した先にある解像度一覧を参考に入力してください。

「config.txt」の編集が終わったら上書き保存し、テキストエディタを終了させます。


4:WiFi接続の設定を行う
 続いてWiFi接続設定を行います。
「LXTerminal」を立ち上げて以下のコマンドを入力して実行します。SSID名やパスワード、その他のコマンド部分などの打ち間違いに注意してください。

$ sudo sh -c “wpa_passphrase {SSID名} {パスワード} >> /etc/wpa_supplicant/wpa_supplicant.conf”

 例として接続させたいWiFiSSID名が「HogeWiFi」、パスワードが「Password123」の場合は以下のようなコマンドになります。

$ sudo sh -c “wpa_passphrase HogeWiFi Password123 >> /etc/wpa_supplicant/wpa_supplicant.conf”

 上記のコマンド実行後、以下のコマンドを実行して作成されたファイルを開きます。

$ sudo leafpad /etc/wpa_supplicant/wpa_supplicant.conf

 コマンドがちゃんと実行されていると以下のような内容になっているので、赤枠で囲った「#psk=...」となっている行を削除して上書き保存します。
f:id:rikoubou:20180626192341p:plain

 上書き保存したらテキストエディタを終了させます。

 ファイルの編集が終わったら左上のRaspberry Piのボタンを左クリックして「Shutdown」ボタンを左クリックします。
f:id:rikoubou:20180626192527p:plain

 出てきたダイアログの「Reboot」ボタンを左クリックしてRaspberry Piを再起動させます。
f:id:rikoubou:20180626192711p:plain

 再起動させてデスクトップが表示されると、3のディスプレイ設定が適応されています。

 また起動させてしばらくすると画面右上にあるWiFiアイコンが以下のように接続された状態になります。
f:id:rikoubou:20180626192839p:plain

 WiFiのアイコンを左クリックし、ちゃんとコマンドで入力したSSIDWiFiに繋がっているかの確認もできます。
f:id:rikoubou:20180626193159p:plain

WiFiに繋がらない場合は「sudo sh -c “wpa...」のコマンド入力が間違えている可能性が高いので確認してください。


5:日本語入力の設定を行う
 WiFiに接続できているのを確認できたら、続いて日本語入力の設定を行います。(以降はネットに繋がっていること前提になります)

「LXTerminal」を立ち上げて以下のコマンドを入力して実行します。

$ sudo apt-get update

 実行してしばらくすると以下のような表示になって、コマンドが完了します。
f:id:rikoubou:20180626193638p:plain

 完了したら、続いて以下のコマンドを入力して実行します。

$ sudo apt-get install uim uim-mozc

 実行途中で以下のように「続行しますか?」と尋ねられるので「Yキー」を入力してから「Enterキー」を押して続行させます。
f:id:rikoubou:20180626193921p:plain

 コマンドが完了すると以下のように再びコマンドが入力できる状態になります。
f:id:rikoubou:20180626194146p:plain

 あとは4の時と同じ手順でRaspberry Piを再起動させます。

 再起動完了後、画面上の部分に「あ」のマークが追加されます。テキストエディタやブラウザなどを立ち上げ、キーボードの「半角/全角」キーを押してから入力すると日本語入力ができるようになっています。
f:id:rikoubou:20180626194336p:plain


 以上、かなり長々となってしまいましたが、Raspberry PiのOSを書き込むところから最低限のセットアップまでの方法でした。

 Linux系に慣れていない人にとっては手順が多くてつらいとは思いますが、これは慣れなので仕方ないところです。(自分もコマンドほとんど覚えてない)

 とはいえ、Raspberry PiはちょっとしたPC程度の機能を持つ上にGPIOピンもあって電子工作にも使えるので、扱えるようになっておいた方が色々と活用できると思います。


・参考資料

【Unity】オブジェクト同士の衝突判定、重なり判定

 今回はUnityでのオブジェクト同士の当たり判定についての備忘録です。

 オブジェクト同士の当たり判定には「オブジェクト同士の衝突判定」と「オブジェクト同士の重なり判定」の2種類があるので、それぞれについて説明していきます。(といっても、玉転がしのチュートリアルに書いてありますが整理のためにやります)


0:当たり判定に使用するオブジェクトを作成する
unity3d.com

「はじめてのUnity」にあるような壁をCubeで作成、地面をPlaneで作成、PlayerであるSphereを作成し、以下のように配置します。
f:id:rikoubou:20180621213711p:plain

 この状態でPlayerである「Sphere」を選択し、「Add Component」から「Rigidbody」を選択して追加します。
f:id:rikoubou:20180621213944p:plain

 追加した「Rigidbody」の「Use Gravity」のチェックを外します。
f:id:rikoubou:20180621221827p:plain

 次にSphereがちゃんと映るような位置にカメラを移動・回転させ、Sphereにドラッグ&ドロップしてSphereの子にします。
f:id:rikoubou:20180621221342p:plain

 ここまでできたら以下のスクリプトを「PlayerController」という名前で作成します。

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

/**
 * PlayerController
 */
public class PlayerController : MonoBehaviour {

	private Transform _playerTrans;
	private float DIFF = 0.5f;

	// Use this for initialization
	void Start () {
		_playerTrans = this.transform;
	}
	
	// Update is called once per frame
	void Update () {
		if (Input.GetKey(KeyCode.Space)) {
			rollPlayer ();
		} else {
			movePlayer ();
		}
	}

	/**
	 * Playerを矢印キーで動かす関数
	 */
	private void movePlayer() {
		if (Input.GetKey(KeyCode.UpArrow)) {
			_playerTrans.Translate (Vector3.forward * DIFF);
		} else if (Input.GetKey(KeyCode.RightArrow)) {
			_playerTrans.Translate (Vector3.right * DIFF);
		} else if (Input.GetKey(KeyCode.LeftArrow)) {
			_playerTrans.Translate (Vector3.left * DIFF);
		} else if (Input.GetKey(KeyCode.DownArrow)) {
			_playerTrans.Translate (Vector3.back * DIFF);
		}
	}

	/**
	 * Playerを左右に回転させる関数
	 */
	private void rollPlayer() {
		Quaternion q = _playerTrans.localRotation;
		if (Input.GetKey(KeyCode.LeftArrow)) {
			q = q * Quaternion.Euler(0f, -DIFF, 0f);
		} else if (Input.GetKey(KeyCode.RightArrow)) {
			q = q * Quaternion.Euler(0f, DIFF, 0f);
		}
		_playerTrans.localRotation = q;
	}

	/* オブジェクト同士の衝突判定 */
	// オブジェクトが衝突したとき
	void OnCollisionEnter(Collision collision) {
		Debug.Log ("Collision Enter: " + collision.gameObject.name);
	}
	 
	// オブジェクトが離れた時
	void OnCollisionExit(Collision collision) {
		Debug.Log ("Collision Exit: " + collision.gameObject.name);
	}
	 
	// オブジェクトが触れている間
	void OnCollisionStay(Collision collision) {
		Debug.Log ("Collision Stay: " + collision.gameObject.name);
	}

	/* オブジェクト同士の重なり判定 */
	// オブジェクトが重なったとき
	void OnTriggerEnter(Collider other) {
		Debug.Log ("Trigger Enter: " + other.gameObject.name);
	}

	// オブジェクトが離れた時
	void OnTriggerExit(Collider other) {
		Debug.Log ("Trigger Exit: " + other.gameObject.name);
	}

	// オブジェクトが重なっている間
	void OnTriggerStay(Collider other) {
		Debug.Log ("Trigger Stay: " + other.gameObject.name);
	}

}

 作成したスクリプトSphereにドラッグ&ドロップして適用させます
f:id:rikoubou:20180621222302p:plain

 この状態でゲームを再生させると以下のように矢印キーで前後左右に動き、スペースキーを押しながら矢印の左右のキーで視点を回転させることができます。
f:id:rikoubou:20180621222628g:plain

 これで準備ができました。


1:オブジェクト同士の衝突判定
 オブジェクト同士の衝突判定の場合の説明です。

 実際に存在するものの当たり判定(オブジェクトの中を通り過ぎたりしないようにしたい時など)に使用します。

 使い方としては0の準備ができていれば、特に変更することなくこの当たり判定を使用できます。

 衝突する自身のオブジェクトのスクリプト(ここではSphereに適用したPlayerControllerスクリプト)にある以下の記述で、それぞれの場合において衝突先のオブジェクトを取得することができます。

// オブジェクトが衝突したとき
void OnCollisionEnter(Collision collision) {
	Debug.Log ("Enter: " + collision.gameObject.name); // 衝突先のオブジェクト名を取得
}
	 
// オブジェクトが離れた時
void OnCollisionExit(Collision collision) {
	Debug.Log ("Exit: " + collision.gameObject.name); // 衝突していたオブジェクト名を取得
}
	 
// オブジェクトが触れている間
void OnCollisionStay(Collision collision) {
	Debug.Log ("Stay: " + collision.gameObject.name); // 触れているオブジェクト名を取得
}

 実行すると、以下のようになります。
f:id:rikoubou:20180621225458g:plain

 Sphereが回転しているのは反発係数などがデフォルトで設定されているためです。

 これを防ぐためには、以下のように「Physic Material」を作成します。
f:id:rikoubou:20180621225800p:plain

 名前はなんでもよいですが「NoPhysic」という名前にし、各種値全て0にします。
f:id:rikoubou:20180621230051p:plain

 衝突対象の全てのオブジェクト(ここではSphereとfloorとWallの全部)に「NoPhysic」をドラッグ&ドロップして適用させます。
f:id:rikoubou:20180621230422p:plain

 この状態で実行すると以下のようになります。
f:id:rikoubou:20180621231209g:plain

 PlaneにSphereが接しているため最後は無重力のようになってしまっています。

 Sphereを接していない部分まで高さを与えてやると以下のように反発することなく止まるようになります。
f:id:rikoubou:20180621231333g:plain


2:オブジェクト同士の重なり判定
 オブジェクト同士の重なり判定の場合の説明です。

 実際に存在しないものの当たり判定(ゴールエリアなど実際には存在しない範囲などの当たり判定など)に使用します。

 実際に存在しないものとして扱われるので、オブジェクトがあってもすり抜けます。

 0までの準備が済んだ状態で以下のようにColliderの「Is Trigger」にチェックを入れれば使用できます。
f:id:rikoubou:20180621224620p:plain

※このチェックが入っているか入っていないかでオブジェクトの衝突判定になるか、重なり判定になるかの切り替えになります。

 重なる自身のオブジェクトのスクリプト(ここではSphereに適用したPlayerControllerスクリプト)にある以下の記述で、それぞれの場合において重なった先のオブジェクトを取得することができます。

// オブジェクトが重なったとき
void OnTriggerEnter(Collider other) {
	Debug.Log ("Trigger Enter: " + other.gameObject.name);
}

// オブジェクトが離れた時
void OnTriggerExit(Collider other) {
	Debug.Log ("Trigger Exit: " + other.gameObject.name);
}

// オブジェクトが重なっている間
void OnTriggerStay(Collider other) {
	Debug.Log ("Trigger Stay: " + other.gameObject.name);
}

 実行すると、以下のようにオブジェクトをすり抜けて移動します。
f:id:rikoubou:20180621224504g:plain


 以上がオブジェクト同士の衝突判定と重なり判定です。

 基本的なことですが、Playerの移動範囲の制限やゴール地点などに使うことになると思います。


・参考資料

【OculusGo / Unity】OculusGoにインストールしたUnity製自作アプリの削除方法

rikoubou.hatenablog.com

 過去の記事でOculusGo向けのビルド方法を紹介しました。

 Unityで自作アプリをOculusGoにインストールした場合、以下のように「提供元不明」という項目に追加されます。

 容量を空けるためや不要になったりして、この「提供元不明」に出てくる自作アプリを削除したいと思う時が出てくると思います。

 今回はその方法についての備忘録です。

 以下の赤枠で囲っている自作アプリを削除対象アプリの例として進めます。
f:id:rikoubou:20180611151042p:plain


1:削除するアプリのパッケージ名をメモしておく
 パッケージ名とは「提供元不明」の欄に出てくる()の中の記述です。
 今回の例では以下がパッケージ名になります。

com.hoge.TestApp


2:ターミナルまたはコマンドプロンプトを立ち上げて削除コマンドを実行する
 1で削除するアプリのパッケージ名がわかったら、OculusGoとPCをUSBで接続します。

 その状態でMacOSなら「ターミナル」、Windowsなら「コマンドプロンプト」を立ち上げます。

 そして以下のコマンドを入力して実行すれば1のアプリを削除できます。

$ adb uninstall {パッケージ名}

 今回の例では以下のようになります。

$ adb uninstall com.hoge.TestApp

 削除が成功すると「Success」という文字が表示されます。
f:id:rikoubou:20180616230729p:plain

 コマンド実行後、OculusGoの「提供元不明」を見ると該当のアプリが削除されているのを確認できます。
f:id:rikoubou:20180616231341p:plain

※Successと出たはずなのに削除されていない場合は、一度別の画面やアプリを表示させたあとにもう一度「提供元不明」を確認してみてください。

 ちなみに存在しないパッケージ名の場合は、以下のようにエラーメッセージが表示されます。
f:id:rikoubou:20180616231011p:plain


 以上がOculusGo自作アプリの削除方法です。これで実験用の不要なアプリを削除して綺麗にすることができますね。
 ただし誤って他の必要なアプリを消してしまう可能性もあるのでパッケージ名をちゃんと確認してから削除コマンドを実行するようにしましょう(自戒も込めて)。


・参考資料