インストールから始まるunity開発日記
https://gyazo.com/92d9a0ef110d53ee7453153628229e17
oculus questを用いてVRコンテンツを作成することになった。
雑記、記録、あるいは超初歩的技術の備忘録としてここに書き記す。
twitter感覚でどうでもいいことも書く。
unity経験は0。プログラミング経験はHSPとProcessing、あとJavaScript,HTML,CSSをほんの少し。
現状の決定事項は「インタラクティブなコンテンツ」ということのみ。
まあそうじゃなきゃVRの意味ないんですけど。
いずれにせよoculus questの良さ、特徴を活かしたい(体動かす系とか)
とりあえずunityをインストールするところから。
この時点での既有知識は「ゲーム作るやつ」くらい。
記法とかも何も知らないのでマジで怖い。
これを機にunity習得できたらいいな。
unity 2019.4をインストールしとけば間違いない的なことを言われたのでそれにした。
「unity oculus quest 開発 」でググったらちょうどよさそうなのが出てきた。
https://framesynthesis.jp/tech/unity/oculusquest/
マジで助かる。ていうかoculusってandroidベースなんですね。
assetのOculus IntegarionのインポートとUnity の XR サポートの有効化をした。
自分でも何を言っているのか分かりません。
今更気付いたけど自分のPCにUSB Type-Cポートないじゃん。
付属のケーブルc to cだから接続できないしこの先進めないのでc to aの3mのやつ購入。
明日届けてくれるらしい。prime会員でよかった。
13:30にケーブル来た。amazon神。
quest開発者モードにして、pcに接続して、なんか許可みたいなのして、Oculus/VR/Scenes/ControllerModelsとやらを選択しおもむろにbuild and run。
https://gyazo.com/d833d78597978e88dfce0a8bd9c66aa5
謎の空間にご招待された。なんだこれ怖い。誰。何。
何も知らずにやったからかなり動揺した。
まあひとまずこのサンプル見るだけでかなり勉強になりそう。
多分オブジェクトの集合をセクションごとに管理してるっぽい。
まず中央に光源があって、Roomセクションで6つの箱で囲むように部屋ができてる。
でその中に箱をいっぱい並べてある感じかな。
周囲の箱がGrabbablesってセクションに入ってるのに触れない。
デフォでコントローラーが表示されてるのはOVRCameraRigのLeft/RightHandAnchorにOVRControllerPrefabとやらが"アタッチ"されてるからみたい。
最初アタッチってなんだよと思ったけど、オブジェクトに何かを紐づけることっぽい。
おそらく性質付与みたいなもんなんだろうと思っておく。
でその性質みたいなのが1日目に入れたアセットにわんさか入ってた。助かる。
試しにCustomHandLeft/Rightをアタッチしたら手とコントローラーが同時に表示された。
別にコントローラーを持ってる手を描画してるわけじゃないから手が埋まった。
これをアタッチしたら周囲の箱をつかめるようになった。
Grabbablesって書いてあったのに触れないからおかしいなとは思ってたんだけど、CustomHandLeft/Rightの中の何かしらの設定がないとそもそもgrabの動作が存在しないのかな。
掴んだオブジェクトを足の辺りににぶつけたら高速で振動して場外にぶっ飛ばされるバグを発見。
自分で作る時もカメラ関係はここから丸々持ってきて微調整するだけでよさそう。
雰囲気掴めてきた気がするので今日はここまで。
なんかアセットで色々となんとかなりそうな気がしてきた。
ただアタッチとadd componentの違いがまだよく分からない。
componentはそもそもobjectの構成要素みたいなもの?
言い換えるとobjectはcomponentの集まり?な気がしてきた。
居合切りシミュレータみたいなゲーム思いついた。
刀を持つと時間が止まって、収めると動き出す。
イメージはルパン三世の石川五ェ門とか。
目にもとまらぬ速さで斬って、納刀するとばらばら崩れるみたいなやつVRでできたら面白そう。
ていうか自分がやりてえ。誰か隻狼みたいな雰囲気でゲーム化して。
で、何が必要そうか列挙
オブジェクトの切断
持ってる刀と切断するオブジェクトとの接触判定、接触位置、方向、面とか?
刀の3Dモデル(刀を持った手)
アセットストアとかにあるのか?
切断するオブジェクトはただの直方体でいい
途中で人型でもいけそうなら変更するかも。
時間停止の実装
切断って結構難しい処理な気がしてきた。
頂点とかどうするんだろ。
まあ前例はありそうだからまずは調べる
https://qiita.com/ushikunv/items/eebe435bef24c027ed16
https://qiita.com/edo_m18/items/31961cd19fd19e09b675
素晴らしすぎるサンプルコードが出てきた。
やっぱり切断とか破壊は難しい処理らしい。そもそもデフォルトの機能では無いそう。
superhotとかどうやってるんだろう。
切断オブジェクトにmesh cutのスクリプトをアタッチして
刀オブジェクトにcutterのスクリプトをアタッチすればもういいのか?
そもそもunityで使うためのスクリプトの書き方を知らないのでそっからググる
https://docs.unity3d.com/ja/2019.4/Manual/CreatingAndUsingScripts.html
書いてある通りにやったらすぐできた。
停止させるのはこれでいいかな。停止っていうか無重力だけど。
https://mogi0506.com/unity-rigidbody-stop/#Rigidbody-2
本当は時間停止させたいけど、初期状態よりオブジェクトが増えまくるからそれらを全部止めるのは難しそう。
居合切りは一回までっていう制約がついちゃうけどしょうがないかな。
まあ真の剣豪は一度の居合で勝負を決するので何も問題ないでしょう。
自分の身体がぶっ飛ばないかが心配。
とりあえずやってみる。
場所は以前招待されたイカれた空間。
良い感じ無料の刀アセットがあったので頂戴する。
https://assetstore.unity.com/packages/3d/props/weapons/wakizashi-short-sword-144679?locale=ja-JP#description
Wakizashi Short Swordって名前なんか良いですね。
Wakizashiは右手に固定。
固定の場合刀を手の子オブジェクトにすると良いらしい。
インストールしたアセットのmeshにあったWakizashiを右手にドラッグアンドドロップでできた。
デフォだと刀が切腹直前みたいな位置だったので微調整して持ってる風に。
これ手を常に閉じるのどうやるんだ。
周りのオブジェクトを一つだけにしてmeshcutのスクリプトをアタッチ。
Wakizashiにbox colliderのコンポーネント(当たり判定のやつ)を追加。
デフォだと刀全体を覆ってたので刃のみに調整。
colliderの is Triggerにチェックを入れて、cutterのスクリプトをアタッチ。
これで準備できたはず。なんかシュールな画になったけど。
https://gyazo.com/b3b5126f08c58c5fba135a7f5b7f0368
build and runでテスト。斬れた。すごい。
先駆者たちのおかげで何も理解してないのに動作はする。
あとはボタン押してる間無重力化。
無重力化中だけ暗くしたら時間止まってる感出るかな。
DMC3のクイックシルバーみたいにしたい。
ボタンを押したときに無重力になるとかいうマニアックなコンポーネントはデフォルトに無いので自らスクリプトを書く。
当然oculus touchのボタン押し下げ時に無重力化してみた -qiitaとかも無いので、基本のスクリプトの書き方、押されたボタンの取得、重力の変更方法を別で調べて組み合わせる。
組み合わせた結果できたスクリプトがこれ。
code:c#
using System.Collections;
using System.Collections.Generic;
using System.Collections.Specialized;
using UnityEngine;
public class ChangeGravity : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
if (OVRInput.GetDown(OVRInput.Button.One)) //aボタンが押されてる間の動作
{
Physics.gravity = new Vector3(0, 0, 0);
}
if (OVRInput.GetUp(OVRInput.Button.One)) //aボタンが離された時の動作
{
Physics.gravity = new Vector3(0, -9.81f, 0);
}
}
}
最初の4行はよく分からんけど新規スクリプトを書くと初めから書いてあるのでそのまま。
下手に消して動作しなくなるのも嫌なのでまじないみたいなものと捉える。
下部も大枠は初めから書かれていた。クラス名とスクリプトの名前が違うと上手くいかないらしく痛い目を見た。
void Start内はゲームの初めのフレームの一個前に動作して void Updateは毎フレーム動作するみたい。
ボタンが押されてるかの判定はこれらから
https://framesynthesis.jp/tech/unity/touch/
https://developer.oculus.com/documentation/unity/unity-ovrinput/?device=QUEST
https://www.jyuko49.com/entry/2019/07/14/155816
3つ目が特に具体的でお世話になりました。
公式のリファレンスって割と上級者むけですよね。
重力の変更はこれを参考にした。
http://ftvoid.com/blog/post/737
想像よりずっと容易だった。実装より検索に時間をかけた気がする。
このスクリプトをOVRPlayerControllerにアタッチしたら想像通りに動作した。良かった...。
あとできれば同時に明るさを変えたかったんだけど全然うまくいかなかった。
置いてあるDirectionalLightのintensityを変えればいいと思うんだけど動作しないどころか、それがあるせいでそもそもビルドできなくなる。
時間もないのでゲームの要素をここまでにして発表の方向性を変えることにした。
居合切り特化のつもりだったけど無重力が意外と楽しいから、居合切りメインの、無重力を楽しむ的な方向にもっていく。
https://scrapbox.io/files/5f7aae6f0db9c9001ec09992.mp4
できた。音声はありません。
unityガチ初心者にしては頑張ったんじゃないでしょうか。