2017-06-05 59 views
0

私は横向きのユニティゲームを持っています。私はカメラを左右に回転させたいと思っています。さらに、y軸のジャイロの傾きと、右または左に回転するベクトルの合計に応じて、カメラを前後に動かしたいと思います。つまり、部屋を歩いている人のようにカメラを動かしたいと思っています。カメラは私のゲームの主役です。ユニティでジャイロを使用してカメラを移動する方法

これは私がしようとしたものです:

GameObject CamParent; 
Rigidbody RB; 

void Start() 
{ 

    CamParent = new GameObject("CamParent"); 
    CamParent.transform.position = this.transform.position; 
    this.transform.parent = CamParent.transform; 
    Input.gyro.enabled = true; 
    RB = this.GetComponent<Rigidbody>(); 
} 

void Update() 
{ 
    CamParent.transform.Rotate(0, -Input.gyro.rotationRateUnbiased.y, 0); 
    this.transform.Rotate(-Input.gyro.rotationRateUnbiased.x, 0,0); 
    float Z = -Input.gyro.userAcceleration.z; 
    RB.AddForce(new Vector3(0,0,Z)*10); 
} 
+1

私はあなたが何をしようとしているのか分かりませんが、カメラの親に剛体を追加して、力をカメラに直接加えるのではなく、 ?さもなければ、カメラが元の位置から動くと、カメラ親を回転させる効果が変化する。 – lockstock

答えて

0

私はあなたの質問は、私には少し不明であったように、私ができる最善のようにあなたの質問に答えることを試みてきました。

まず、力と物理を使用しているので、void Update()ではなくvoid FixedUpdate()関数を使用する必要があります。これにより、コードが均一な間隔で実行されるようになります。これは、物理を扱う際に非常に重要です。

なぜ新しいゲームオブジェクトをインスタンス化したのかもわかりません。このスクリプトをUnityのCamera GameObjectに追加してから、Rigidbodyコンポーネントをカメラに追加するだけです。これは、この2行だけ含まれている必要がありますあなたのStart()機能、簡素化されます:

Input.gyro.enabled = true; 
RB = gameObject.GetComponent<Rigidbody>(); 

次に、クォータニオンは左利きた座標を、Unityは右利きの座標を持っているのに対し、Input.gyro.attideから返されることに注意することが重要です。

Quaternion GyroToUnity(Quaternion quat) 
{ 
    return new Quaternion(quat.x, quat.z, quat.y, -quat.w); 
} 

私は、この変換を達成するために他の方法があると確信しているが、この方法は、私の作品:Unityへのジャイロスコープからこの変換は、以下の機能を実現することができます。

ここでは、カメラの回転について説明します。まず、カメラの回転を、カメラのtransform.rotationをジャイロスコープから変換したQuaternionと同じに設定して設定します。しかし、ジャイロスコープのz軸がUnityのy軸と同じ方向を指しているので、もう一つの問題があります。これは単にtransform.Rotate(90,0,0);を実行することで修正できます。最後に、次のコード行を使用したカメラの回転を設定します。

transform.rotation = Quaternion.Euler(new Vector3(0f, transform.rotation.eulerAngles.y, 0f)); 

最終私たちはカメラに力を加える処理する必要があります。どのように動きを処理するかを正確にはわかりませんが、カメラの回転に関してz軸を中心にして動きたいと思っていました。これを行うには、カメラのRigidbodyコンポーネントのAddRelativeForce(Vector3 relativeForce)を使用する必要があります。

しかし、力の方向を決めるには、以前にUnityに変換したQuaternionからx軸回りの回転の度合いにアクセスする必要があります。 yourQuat.eulerAngles.xとなり、0 < = x <となるようにfloatが返されます。私たちがカメラの座標系の方向を向いている場合、iOSデバイスを正面に向けると約0.0の値が返されます。

Vector3 relativeForce; 
if (yourQuat.eulerAngles.x > 315 || yourQuat.eulerAngles.x < 90) 
    relativeForce = Vector3.forward; 
else if (yourQuat.eulerAngles.x < 315) 
    relativeForce = Vector3.back; 
else 
    relativeForce = Vector3.zero; 

最後に、後続のVector3値を取ると、役立ちますので、

RB.AddRelativeForce(relativeForce);

希望のように使用します。私はこの質問をいじったが、私はこのコードが適切にカメラを向けることがわかりました。これがあなたが探していた機能と正確でない場合は、プログラムを微調整して必要なものを正確に実行できるようになるはずです。

関連する問題