マウスカーソルをくるくると円形にドラッグして、バルブのオブジェクトを回してみます。
まずバルブにコライダーとリジッドボディ、ヒンジジョイントを付けます。リジッドボディのAngular Dragで抵抗を設定します。
ヒンジジョイントのAxisをバルブの円に垂直で外側の向きにしています。バルブを傾けると軸も傾きます。
前の記事の方法で、マウスカーソルを時計回りに動かすとプラス、反時計回りだとマイナスの値を得て、それを使ってバルブに回転を加えます。
// 真ん中が(0,0,0)になるようにマウスの位置を取得
mPos = Input.mousePosition - screenSizeHalf;
float rad = Mathf.Atan2(mPos.x, mPos.y); // 上向きとマウス位置のなす角
float dRad = rad - previousRad; // 前のフレームの角度との差
//tan += Mathf.Tan(dRad);// * mPos.magnitude;
Vector3 t = new Vector3();
t.y = Mathf.Clamp(Mathf.Tan(dRad) / 10f, -0.3f, 0.3f);
itemRb.AddTorque(item.transform.TransformDirection(t), ForceMode.Impulse);
/*
if (mPos.magnitude >= screenSizeHalf.x / 2f)
{
}*/
previousRad = rad; // 今のフレームの角度を保存
するとバルブがヒンジジョイントの軸に沿って回転します。
FPSコントローラーでFPSキャラを動かすときはマウスカーソルが画面中央に固定されているので、バルブを回すときはカーソルのロックを解除しています。また、カーソルの表示と非表示の切り替えも簡単にできます。
Cursor.lockState = CursorLockMode.Locked; // カーソルをロック
Cursor.lockState = CursorLockMode.None; // カーソルのロックを解除
Cursor.visible = true; // カーソルを表示
Cursor.visible = false; // カーソルを非表示
Rigidbodyの回転速度はデフォルトで制限されていますが、無制限にすることもできます。
Rigidbody.maxAngularVelocity = Mathf.Infinity;
カーソルが画面の中央付近にあるときに回転が不安定になることがあるので、中心付近にあるときは回転させないようにすると少し安定します。また、カーソル位置から得られる値の符号などによって一定の速さで回転させるのもいいかもしれません。