[Unity] Cubeを転がすスクリプト

Colorful Diceを作った時の話ですが、思ったようにCubeを転がすのって意外と難しいですね。

物理エンジンに任せればなんとかなると思って始めましたが、そんなに簡単じゃなかったというお話。

 

20160426_001

上記のように適当にPlaneとCubeを配置して、CubeにRigidbodyと下記のスクリプトをCube付与します。

これだけで、下記のようにヌルっとCubeが横に回転して移動してくれます。

 

ただ、移動した後の座標がちょっとキリのいい値からずれます。

20160426_002

今回だと、

Position: (0, 0.5, 1)

Rotation: (90, 0, 0)

となって欲しかったわけです。これは、回転時の床との摩擦だったり、回転が終わるときにはねたりする挙動が影響してるんだと思います。さらにスクリプトリファレンスによるとそもそもangularVelocityを直接セットするのは良くないみたいですね。非現実的な挙動につながるから。たしかに、止まってる車が次の瞬間に時速100kmになってるなんてこと現実にはないですからね。addTorqueという関数もあるようですが、多分結果は同じでしょう。わずかなズレですが、何度も移動しているとこれが馬鹿にならなくなってきます。さらに回転速度を早くすると更にズレが大きくなりますし、早過ぎると飛び上がります(これはこれで結構面白い: 下記動画)。

 

というわけで、結局物理エンジン任せじゃなくて、Script書いてpositionとrotationを制御することにしました。位置と回転は簡単な数学ですね。

20160426_005

上図を元にしたスクリプト例が下記。

CubeのBoxColliderのIsTriggerにチェックを入れて、RigidbodyのUseGravityのチェックを外しておきます。これで下記のようにコロコロと転がります。

 

思うようにcubeを転がすのも案外むずかしいものですね。

 

(2016.9.13追記)

立方体だけじゃなく直方体でも転がるようにして欲しいというご要望があったので、改良してみました。改良したスクリプトは以下の記事に掲載しています。

[Unity] 直方体を転がすスクリプト

 

 

サイコロを転がすパズルゲームColorful Diceを下記からダウンロード

【Android】Colorful Dice -カラフルでポップなサイコロパズル-

「[Unity] Cubeを転がすスクリプト」への7件のフィードバック

  1. ブログ記事ありがとうございます!
    非常に参考になるスクリプトの掲載ありがとうございました。

    現在、Unity5.3.2で箱状のオブジェクトを、キーボード操作で転がすスクリプトを書いております。
    こちら立方体ですと問題ないのですが、直方体ですと計算式を理解できていないため修正できません。

    こちら1:1:2(高さ)のような直方体の場合、どうすればよいかアドバイスをいただけないでしょうか。
    よろしければで構いませんので、ご確認頂けますと助かります。

    お忙しい中、ご連絡してしまい申し訳ございません。

    1. 素人のスクリプトですが、参考にしていただいているということでありがとうございます。

      とりあえず直方体対応のスクリプトを
      http://piromayo.xyz/2016/09/13/unity-%E7%9B%B4%E6%96%B9%E4%BD%93%E3%82%92%E8%BB%A2%E3%81%8C%E3%81%99%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88/
      に公開しました。
      あまり深く考えずにパッと書いただけなので、他によい方法があるかとおもいます。

      計算式としては、上の四角が転がる図で回転半径とスタートする角度を直方体に対して計算して求めるという事になります。新しいスクリプトではキー入力されるごとに直方体の各辺の長さと転がる向きの位置関係を求めています。

      参考にしてみてください。

  2. ご連絡が大変遅くなってしまい申し訳ございません。
    参考になるものまで助かりました!こういったものを作れるのがすごいですね。
    こちら本当にありがとうございます。ご確認させてくださいませ。

  3. とても参考になりました!ありがとうございます!
    質問なのですが、こちらのスクリプトを付与したcubeをプレイヤーとしたとき壁とのあたり判定がうまくいきません。
    どうすればよいかアドバイスをいただけないでしょうか。
    お暇な時で構いませんので確認していただけると助かります。

  4. うーん。このスクリプト使って私もゲーム作ってますが、普通にあたり判定ができています。
    ちょっとバニラさんの状況がわからないのでなんとも言えませんが、ぱっと思いつくものとしては、
    当たり判定部分(Collider)の大きさをCubeよりもちょっとだけ大きくしてみるとか、Layer Collision Matrixを確認してみるとかですかねぇ。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です