Unity研究所<Unityによるゲーム開発、映像開発>

Unity初心者おやじが綴るゲームで小遣い稼ぎできるようになるまでのブログ

Unity 小ネタ Hinge Joint による玉戻りの防止

一般的には極めて需要はないと思うので、自分用の覚書として残しておく

 

例によって、パチンコアプリの制作中

パチンコ自体知らないとまったく意味不明だろうが・・・

いや、ピンボールゲームを作る際の、玉を発射した後に発射通路に玉が戻ってこないようにするようにはしたいのではないだろうか・・

おそらく応用は聞くのではと・・

 

ということで、完成品イメージ

完成イメージ

画質の関係で分かりづらいが、発射した玉は、戻り防止弁により、発射後は発射通路に戻ることはない(たぶん)

 

ということで、実装方法を書き残しておく

 

○用意するもの

 Unityの3Dオブジェクト

  1. Cube        玉を跳ね返すシャッター部分
  2. Cylinder シャッターの軸部分 

   その他は割愛

 

○Untiy Editor上での設定

まずはCubeのサイズを調整して板状に

Cylinderもサイズ調整して、CubeはCylinerの子オブジェクトにして、Cylinderを軸にシャッターが回転するようにする

 

次に親オブジェクトのCylinderに、RigidBodyとHinge Jointを追加

 

◆設定のポイント 

●RigidBody

・Mass、Drag、AnglarDrag

 大き目の設定にしているが、正直正解はわからない

 一つだけ言えるのは、Massを小さくすると、シャッター(Cube)に玉に接触した場合の

玉からの力の影響が大きく、軸を関係なく押されて回転ではなく、位置ごとずれるようになる

 Use Gravityのチェックをオフにしているのに、影響あるのか疑問はわくが、おそらくMassが大きければ元の場にとどまる力が強くなるのだと思われる

 

・Constraints

 Freeze Position、Freeze Rotationともにチェックを入れている

 動いてほしくないからなのだが・・・

 納得いかないのは、シャッター(Cube)に玉が当たると位置がずれてしまうんだよ、これが( 一一)

 これはここ数か月いろいろ設定を試したが、何かに接触しなくても位置がずれていってしまうようなこともあり、Editor上の設定での解決方法はわからづじまい 

 

●Hinge Joint

・ConnectedBody

   シャッター(Cube)を設定

・Axis

   Y軸中心に回転させたいので、Yのみに1を設定

・Spring

   玉が当たった後に自動で元の角度に戻るようにバネを設定

・Limits

   回転角度の制限を設定

 

Cubeの方には、Box ColliderとRigidBodyを追加

〇設定のポイント

 とくにはない

 軸はCylinderのHingeJointに連結しているためか、Constraintsをすべてフリーにしていても、Cylinderの軸を中止に回転だけするようなかたちとなる

  

 修正忘れ

  Massは0.005にしないと、玉の力の影響が強めに出て見た目が悪い

 

◎問題点

 下記を見てほしい

位置がずれていく

 画質が悪くわかりづらいが、玉が当たっているうちに軸の位置がズレてしまっている

 ConstraintsでFreeze Positionにチェックを入れているにもかかわらず・・

 

 う~ん

 謎仕様

 力がかかった時の影響は別扱いなのだろうか??

 

 悩んだ挙句の末

 

 スクリプトで対応

 最初の位置を記憶しておき、玉が発射されるたびにズレをもとの位置に戻すようにした

 最初はUpdate()で毎フレーム修正にしてみて、これが見た目ずれがないように見えるが、毎フレームというのが精神衛生的によくないので(負荷がとられる気がする)このようにしてみた

 

以上、今日はここまで