2017-09-07 2 views
3

私はユニティと剛体の新人です。私は3Dトロンライトサイクルゲームを作ろうと試みることによって学ぶと思っていました。私は以下の見円柱、球、および矩形の組み合わせを使用して、私のプレーヤーの車を作った:ユニティ - リジッドボディーをオートバイに使用する - どのようにすればいいですか?

enter image description here

私は細長い球に剛体を使用し、次のコードを使用:

public float accel = 1.0f;  
// Use this for initialization 
void Start() { 
    cycleSphere = GetComponent<Rigidbody>(); 
} 

void FixedUpdate() { 
    cycleSphere.velocity = Vector3.forward * accel; 
} 

車両が前方に移動します。私はこれを行うより良い方法があるかどうかはわかりませんが、もしあれば、そう言いなさい。

私は車両にメインカメラを取り付けて、X回転を無効にしてカメラとローリングを防止しました。

ここでは、AとDボタンを押して回転させたいと思います。オリジナルのトロンライトサイクルの90度回転とは異なり、私はそれを通常の車両のように回したかったのです。

だから私はこれを試してみました:

void Update() { 
    if (Input.GetKey (KeyCode.A)) { 
     turning = true; 
     turnAnglePerFixedUpdate -= turnRateAngle; 
    } else if (Input.GetKey (KeyCode.D)) { 
     turning = true; 
     turnAnglePerFixedUpdate += turnRateAngle; 
    } else { 
     turning = false; 
    } 
} 

void FixedUpdate() { 
    float mag = cycleSphere.velocity.magnitude; 
    if (!turning) { 
     Quaternion quat = Quaternion.AngleAxis (turnAnglePerFixedUpdate, transform.up);// * transform.rotation; 
     cycleSphere.MoveRotation (quat); 
    } 
    cycleSphere.velocity = Vector3.forward * accel; 
} 

上記のコードは、車両を回転させていますが、それはまだでそれがあった最後の方向に移動する - それはより多くのタンクタレットのように振る舞います。さらに悪いことに、AまたはDのどちらかを押しすぎると、希望の方向に回転し、しばらくしてからナットを動かすと、カメラはその方向に回転します。

enter image description here

私が間違って何をしましたし、どのように私はそれを修正することができますか?

答えて

3

まず、Input.GetKeyからInput.GetAxisに変更することをお勧めします。これにより、キーを押したときの値が正常に増減します。これにより、あなたの速度として適用される力ベクトルを正規化するオプションが与えられます。そのベクトルに基づいて、 "前輪"が身体の残りの部分を別の方向(左または右)に "ドラッグ"するように力入力を調整する必要があります。これは理想的な「実世界の物理現象」ではない。なぜなら、前向きの力は側(左または右)の力よりわずかに大きいからである。

コード例:

// member fields 
float sideForceMultiplier = 1.0f; 
float frontForceMultiplier = 2.0f; 
Vector3 currentVeloticy = Vector3.zero; 

void Update() 
{ 
    Vector3 sideForce = (sideForceMultiplier * Input.GetAxis("horizontal")) * Vector3.right; 
    Vector3 frontForce = frontForceMultiplier * Vector3.forward; 
    currentVelocity = (sideForce + fronForce).Normalize; 
} 

void FxedUpdate() 
{ 
    cycleSphere.velocity = currentVelocity * accel; 
} 
+0

うーん、興味深いです。私はそれ以来、私のコードにいくつかの変更を加えました、そして私はそれを働かせましたが、私はあなたの助言を取って、入力にgetKeyを置き換えました。このコードはどのようにターンしますか? –

+0

このコードは、 '2 * forwardForce'と組み合わされた' Input.GetAxis( "horizo​​ntal") 'から取り出された値に関係します。それは前進するために残っていることを意味するが、ある程度の水平方向の入力があるときはいつも力を変更する(少し湾曲させる)。 –

関連する問題