ゲームが作れるようになるまでがんばる日記

ゲーム制作のことを中心にゲームに関することを書いています

プロジェクト15

Transform.positionとCollider

Transform.position - Unity スクリプトリファレンス Collider - Unity スクリプトリファレンス スクリプトで生成したキューブの位置を Transform.position で設定しているのだが、なぜか位置が動いてしまう。 調べてみたら、生成したときに自動的に作られる…

スクリプトでプリミティブを作る

デバッグラインはHMDだと使うのが難しそうなので、キューブなどのプリミティブを使ってデバッグ表示をすることにした。 スクリプトからプリミティブを作成するには、GameObject.CreatePrimitive()を使う。 GameObject.CreatePrimitive - Unity スクリプトリ…

OnRenderObject,OnPostRender

OnRenderObject()でGLの描画を行っていたのをOnPostRender()に変更してみた。 しかし、OnPostRender()はCameraがスクリプトにアタッチされているときのみ有効ということで呼び出されなかった。 またOnRenderObject()に戻してみたら、今度はゲームビューに描…

デバッグライン描画

ゲームマネージャーにデバッグラインの描画機能を追加。 UnityのDebug.DrawLine()と同じ形式にしたので、関数名を書き換えるだけで移行できた。 これで上手く行ったと思ったら、シーンビューには描画されているが、ゲームビューには描画されていない。ゲーム…

デバッグ描画機能実装中

ゲームマネージャー的な処理を行うスクリプトにデバッグ描画の機能を追加中。 描画リクエストを受け取って、それをOnRenderObject()のときに描画するように実装中。 やりたいことはわかっているけど、C#ではどう書けば良いのだっけと調べながら書いているの…

標準アセットのスクリプトから自作のクラスを参照する

標準アセットのスクリプトから、自分で作成したクラスが参照できない原因がわかった。 Unityでは特定の名前のフォルダは扱いが特殊となり、コンパイル順が変わってくる。標準アセットのフォルダ名「Standard Assets」に含まれるスクリプトは自分で作成したス…

名前空間

再び、名前空間で悩む。 標準アセットのコードから、自分で作成したオブジェクトのスクリプトのクラスにアクセスしたいのだが、見つからずにエラーになってしまう。 namespaceの設定をしていないから、グローバル名前空間になっていると思うのだけれども。 …

GL描画

GL - Unity スクリプトリファレンス GL描画のサンプルコードを参考にコードを書いてみたが、最初うまくいかなかった。 ドキュメントを読み直してみたら、GL描画はすぐに実行されるので、コードのどこにでも書いていいというわけではなく、カメラの描画のあと…

ショートカットキー

GLでラインを引くコードを書いて実行してみたら、マテリアルを設定してなかったのでエラーになってしまった。エラーになったらUnityのウィンドウ上でマウスカーソルが表示されなくなり、エディタの操作が困難に。 ということで、ショートカットキーを調べて…

GL

GL - Unity スクリプトリファレンス デバッグ描画にはGLを使うことにした。 OpenGLは多少触ったことがあり、それに似た感じで書けそうなので、多分大丈夫だろう。 いずれは便利なライブラリみたいなのを用意したいところだが、まずはラインを引く部分から作…

VRサポートを有効にしているとゲームビューにギズモが描画されない

ゲームビューにデバッグラインやギズモが描画されない原因が分かった。 VRサポートを有効にしてHMDにも出力しているとゲームビューにはギズモ関連が描画されないようだ。 VRサポートを一旦無効にしてみたら、デバッグラインやギズモで書いたスフィアが描画さ…

ギズモ

Gizmos - Unity スクリプトリファレンス CubeやSphereなどデバッグに役立つオブジェクトの描画ができるギズモという仕組みがあった。 いつでも描画できるというわけでなく、スクリプトのOnDrawGizmos()で描画することができる。 たとえば赤いSphereを描くに…

デバッグ描画がゲームビューに出ない

HMDでテストしているとRayの位置がずれているようで期待した動きにならない。そのため、デバッグ描画で確認しようとしたら、デバッグのラインが描画されない。 Debug.DrawLine - Unity スクリプトリファレンス ドキュメントを見るとゲームビューでは通常は描…

SendMessageでエラーを出さない

SendMessageで指定した関数がそのオブジェクトに無かった場合、デフォルトではエラーが出て止まってしまう。 エラーを出さないようにするためには、第3引数に SendMessageOptions.DontRequireReceiver を指定すれば良い。 if (Physics.Raycast(pos, dir, out…

オブジェクトの色を変える

オブジェクトの色を変化させるには、RendererのMaterialのColorを変えればよい。 Renderer rend = GetComponent<Renderer>(); rend.material.color = Color.red;</renderer>

SendMessage

自分のスクリプトを取得しなくても、GameObjectのまま、SendMessageでメソッドを呼び出せば良いことに気がついた。 GameObject.SendMessage - Unity スクリプトリファレンス if (Physics.Raycast(pos, dir, out hit)) { GameObject obj = hit.collider.gameO…

Raycastで衝突したオブジェクトを得る

Raycastで衝突したオブジェクトはRaycastHitのcolliderからGameObjectを取得できる。 またはRaycastHitのtransformからも取得できる。 if (Physics.Raycast(pos, dir, out hit)) { GameObject obj = hit.collider.gameObject; } で、ここから自分が作ってい…

RaycastHit

RaycastHit - Unity スクリプトリファレンス Rayを飛ばして衝突したときに、衝突したオブジェクトの情報を得るにはRaycastHitを用いる。 衝突した位置はRaycastHitのメンバpointで取得できる。Rayの開始点から衝突した点までラインを描画するコードは次の通…

FPSControllerでHMDを使ったときの視線方向を取得

FPSControllerでHMDを使って見たときの視線方向を取得するには、HMDの位置と回転をFirstPersonCharacterのカメラと合わせれば良い。 Rayが何かにヒットしたときに赤色で、そうでないときは青色でデバッグ描画したコードは次の通り。 using UnityEngine.VR; /…

HMDの位置と角度を取得

https://docs.unity3d.com/ja/current/ScriptReference/VR.InputTracking.html UnityでHMDの位置と角度を取得するには、VR.InputTrackingを使う。位置はGetLocalPosition()で、角度はGetLocalRotation()で取得できる。 引数にはVRノードを渡す。VRノードはVR…

ヘッドトラッキングによるオーバーライド

VR 概要 - Unity マニュアル UnityのVR概要のドキュメントにCameraのTransformはヘッドトラッキングによってオーバーライドされるとあった。 Cameraの値を取得するタイミングがオーバーライドされる前だったのかもしれない。 トラッキングした値でオーバーラ…

マウス操作とヘッドセット操作

カメラの座標と方向を取得してRayを飛ばすように実装。 Rayをデバッグ描画して、何かにヒットしたら赤色、そうでなかったら青色となるようにしてチェック。マウスで向きを変えたらうまくっているようなので、今度はヘッドセットの方を動かしてみた。ところが…

標準アセット

今見ている方向にあるオブジェクトを取得するために、標準アセットのFPSControllerのスクリプトであるFirst Person Controllerを変更。 最初、標準アセットのコードを変更しても良いものかと考えたが、そもそもプロジェクトにインポートしているので、大本が…

Rayのデバッグ表示

Debug.DrawRay - Unity スクリプトリファレンス Raycastのコードを書いていて正しくRayが設定できているか確認する方法無いかなと探したら、Rayをデバッグ表示する機能があった。 Vector3 origin; // 開始地点 Vector3 direction; // 方向と長さ Debug.DrawR…

Raycast

ちょっと期間が開いてしまったが、また再開。 視線方向のオブジェクトを選択する部分の実装開始。 カメラからの Ray - Unity マニュアル 視線方向にRayを飛ばしてオブジェクトとのコリジョンを取ればできそう。

Audio Listener

プロジェクトを実行するとコンソールに次のようなログが出力されていた。 There are 2 audio listeners in the scene. Please ensure there is always exactly one audio listener in the scene. Audio Listenerが2つシーンに存在しているから、1つにしろと…

VR対応

VR 概要 - Unity マニュアル プレイヤーを設定したので、次はVR対応をしてみた。 ドキュメント通りにメニューのEditからProject Settingsを選択。OtherSettingsにあるVirtual Reality Supportedのボックスをチェックするだけ。 これだけでHMDに映像が出たし…

FPSControllerで落下させない

FPSControllerのGravity Multiplierの値を0にする FPSControllerでRigidbodyのUse Gravityのチェックを外しても落下してしまうのだが、落下させない方法がわかった。 FPSControllerのスクリプトを見ていたら、地面に接地していないときに重力方向への移動を…

FPSController

固定カメラではなく、自分視点のカメラで、自由に移動したり見回したりできるようにするために、最初から用意されている標準アセットのFPSControllerを利用することにした。 まずはアセットをプロジェクトにインポート。メニューのAssetsを選び、Impoert Pac…

見栄え

見栄えがするようにマップの広さを100倍、オブジェクトの個数を1000倍としてみた。 たしかに見栄えがするようになったが、その分1ターンの処理が重くなって、2,3秒かかるようになってしまった。これではちょっと時間がかかりすぎ。 広さや個数の増加はもう少…