2017-09-22 23 views
0

私は、シリンダーまたはカプセルの中の重力に苦しんでいます。基本的に私は球状重力と同じコードをとることができると思っていましたが、これはうまくいきません。だから私は良い結果を得るためにいくつかの行を変更しました。ユニティ:Faux Gravity - 内側のカプセル/シリンダー

[SerializeField] float gravity = 10; 

public void Attract (Transform target) 
{ 
    Vector3 gravityUp = (target.position - new Vector3(transform.position.x, transform.position.y,target.position.z)).normalized; 
    Vector3 bodyDown = -target.up; 

    Rigidbody rb = target.GetComponent<Rigidbody>(); 
    rb.AddForce(gravityUp * gravity); 

    Quaternion targetRotation = Quaternion.FromToRotation(bodyDown, gravityUp) * target.rotation; 
    targetRotation.x = 0; 

    target.rotation = Quaternion.Slerp(target.rotation, targetRotation, 30.0f * Time.deltaTime); 

} 

これは最初の試行で問題なく動作しました。しかし、プレイヤー(ターゲット)はY軸を回転させることはできません。誰にもアイデアはありますか?

答えて

0

OK、次のように試しました。

Quaternion targetRotation = Quaternion.FromToRotation(bodyDown, gravityUp) * target.rotation; 
targetRotation.x = 0; 

target.rotation = Quaternion.Slerp(target.rotation, targetRotation, 30.0f * Time.deltaTime); 

これでプレーヤを回転させるためにサーフェス法線を使用しました。

if (Physics.Raycast(attractedBody.transform.position + attractedBody.transform.forward, -attractedBody.transform.up, out hit, distance)) 
    { 
     surfaceNorm = hit.normal; 
    } 

リジッドボディコントラストがない場合、プレーヤーは入力なしで回転を開始します。だから私は使用する必要があります:

rb.constraints = RigidbodyConstraints.FreezeRotation; 

これは動作します。