【Unity, Teddy, 3Dモデリング】カメラを移動したときのオブジェクト生成位置のずれを解消

Unity

はじめに

この記事は前回の記事の続きです。カメラを移動させたときに、手書きの円とオブジェクトの生成位置がずれる問題に取り組みます。

前回の記事

【Unity, Teddy】カメラを回転したときのオブジェクト生成位置のずれを解消

 

z軸方向のオブジェクト生成位置の補正

TeddyのDemoシーンでは、カメラを移動させるとオブジェクトの生成位置がずれるという問題がありました。

これを解消していきます。

 

TeddyRuntimeDemo.cs

グローバル変数にVector3 initialCameraPosition; を追加して下さい。これはシーン開始時のカメラの位置ベクトルです。

次に、void Create() メソッド内に var offsetPos = camera.transform.position – initialCameraPosition; を追加し、ゲーム実行中にカメラが移動した分のベクトルを取得。

最後に、生成した go オブジェクトにoffsetPos を代入しています。

これにより、手書きの円とオブジェクトの生成位置のずれを解消できます。

 

これでz軸方向の補正はできました。

しかし、横方向へ移動させると上手くいきません。

 

x軸方向のオブジェクト生成位置の補正

カメラを横に移動すると、オブジェクトの生成位置が円からずれてしまいました。どうやら、go (Puppet)のx 座標を0にすれば、下の動画のように手書きの円の位置に来そうです。

 

では、先ほど追加した、「//カメラ移動した分のベクトルを取得」以下2行を削除し、以下のコードに変えてください。

これを追加すると、以下のように横方向のズレにも対応できます。


上記のコードは、goPosでgoの位置ベクトルを取得し、x座標を0、y座標はそのまま、z座標はカメラが移動したオフセットを代入しています。

ちなみに、直接 go.transform.position.x = 0f ; のように数値を代入しても、Unityの仕様上オブジェクトの位置は変化しないので、一旦 goPos というベクトルを生成し、goへVectorとして代入する必要があります。

詳しくはこちらの外部URLを参照してください。

【Unity】C#でtransform.positionの値を変更する

 

これで上下左右方向の補正はできました。

しかし、カメラを180°回転させたときにも補正が必要です。

前回、カメラを180°回転させても手書きの円内でオブジェクトが発生しましたが、今度はoffsetPos のz成分だけPuppet がずれてしまうのでこれを補正してあげる必要があります。

 

カメラが180°回転したときの補正

Create()内の「//カメラが移動した分のベクトルを取得」より下のコードを以下のコードに置き換えて下さい。

 

これでカメラのy軸のRotateが180°のときにPuppetが以下のように移動します。

実際に動いている映像はこちらです。

 

今回いろいろ書きましたが、TeddyRuntimeDemo.csの内容を全て削除し、以下をコピペすればオッケーです。

TeddyRuntimeDemo.cs

 

まとめ

カメラを移動させたとき、オブジェクトの発生場所がずれる問題を解決した

ただし、カメラを90°回転させたときにオブジェクトが生成されない問題があります。

これは次回解決します。

 

忙しい人のためのUnity入門講座へ

タイトルとURLをコピーしました