UnityUnityで物理エンジンを使う際に必要になるRigidbody。Unityを触った人で、このコンポーネントを使ったことが無い人は殆どいないんじゃないかくらいのレベルで大事なコンポーネントです。今回はRigidbodyの各パラメータについての説明と、どんな場面で使えるか、基本の部分をご紹介。基本とはいうものの、スクロールバーを見てもらえば分かる通り、結構がっつり解説してます。SierraUnity2018.1.0f24月末にUnity2018が出てたので早速使ってみました。RigidbodyとはRigidbodyは、Unity世界のオブジェクトにアタッチするコンポーネントで、これによって物理挙動を可能にします。詳細については公式マニュアルを見てもらうといいかな。物理的な運動を制御するだけあって、物体の質量だったり、空気抵抗だったりのパラメータが用意されています。外部から力を加えて運動させるときにこうしたパラメータが使われます。質量を大きくすれば、より大きな力じゃないと動かないようになったり。この辺は高校物理の知識でも直感的に分かるようになっています。やってて良かった高校物理。いう人は、公式とかは覚えなくても『慣性の法則』とか『空気抵抗』といった単語の意味を言葉で拾っておくだけでも、ゲーム作りに活かせます。[Rigidbody]からアタッチすることができます。検索窓で『Rigidbody』と入力してもOK。RigidbodyのアタッチRigidbodyのパラメータについてRigidbodyはなかなかパラメータの多いコンポーネントなので、何を変えられるのかを把握するのは大変かも。Rigidbodyのパラメータ上から順にざっくりと解説します。Mass(質量)物体の質量を設定するのがMassです。Unityのマニュアルによると単位はkg。この値が小さければ、力を与えられたときに加速度が大きくなります。動かしやすい物体ですね。逆に大きくなれば、力を与えられたときの加速度は小さくなります。こっちは逆に動かしにくい物体になります。物理に慣れてる人向けに言えば、ニュートンの運動方程式ma=Fを思い出せばOK。力Fが一定なら、加速度aは質量mに反比例します。物理に慣れてない人向けに言えば、重いものを持ち上げようとしたときのことを思い出してもらえればいいかな。力を入れないと、重い物って持ち上がらないですよね。10-7)で、0にはなりません。負の値になったら反重力物質かな。100万トンまで表現できるんですね。Wikipediaによれば世界一重い船(ノック・ネヴィス)の最大積載量が65万トンらしいので、それよりもう少し重い物までなら設定できます。大きいと、物理演算が不安定になります。書かれているため、あまり質量を大きくせず、他の物体と同じようなオーダーに設定しておくのが望ましいですね。pocket【Unity】RigidbodyのMass(質量)を変えた時の変化についてhttps://ekulabo.com/rigidbody-massUnityのRigidbodyで設定できるMass(質量)について、値を変えると物体の運動がどのように変化するのかを実験しています。衝突時には、Massによって衝突相手に与える影響が計算されるので、物理演算の挙動がおかしくないか確認しておくといいかも。Drag(抵抗)続いては抵抗です。地上で転がる時だったり、落下の時だったり、斜方投射の時だったりと、あらゆる運動に抵抗がかかります。電気的な抵抗とは別ね。最小値は0で、初期値も0になっています。0の場合は抵抗なしで運動します。最大値はInfinityです。無限大だと即停止レベル。いうか生半可な力を加えても動きません。Dragフィールドに[inf]と入れるとInfinityと補完してくれます。水中など、あるエリアに入ったときにこの値を切り替えるといいかも。水中に入ったことはColliderのOnTriggerEnterを使えば検知できるので、そのときにDragの値を大きくすれば、水中での抵抗を受ける表現が可能です。スクリプトリファレンスhttps://docs.unity3d.com/ja/current/ScriptReference/Rigidbody-drag.htmlオブジェクトの抵抗あとは公式のリファレンスにもあるように、パラシュートを開いたらDragの値を大きくするとか。pockets【Unity】RigidbodyのDrag(抵抗)を変えて水中を表現https://ekulabo.com/rigidbody-dragUnityのRigidbodyで設定できるDrag(抵抗)について、値を変えると物体の運動がどのように変化するのかを実験しています。空気抵抗として使うのはもちろんのこと、水中エリアに入ったときにdragの値を大きくして水中らしさを演出するのにも便利です。AngularDrag(回転の抵抗)こちらはオブジェクトの回転にかかる抵抗です。AddForceを使って斜方投射のようにボールを打ち上げた時、最初に空中に飛び出した時にはボールは回転していないので、AngularDragによる回転運動の減衰は行われません。このボールは地面に衝突したときに回転を始めるので、そこから回転運動の減衰が始まり、いずれは停止するようになります。物理特性マテリアルを使うと摩擦力の設定を行うことができますが、ボールのような物体は地面を転がっていても思うように摩擦力が働きません。そんなときにこのAngularDragを大きめに設定しておけば、地面を転がっているときに摩擦力が働いているように表現できます。0の場合は減衰することなく回転し続けます。最大値はInfinityです。無限大でも、上記の斜方投射で接地したときには少し転がります。pocket【Unity】RigidbodyのAngularDrag(回転の抵抗)を変えて実験https://ekulabo.com/rigidbody-angular-dragUnityのRigidbodyで設定できるAngularDrag(回転の抵抗)について、値を変えると物体の運動がどのように変化するのかを実験しています。最初はDrag(抵抗)との違いが分からなくて混乱した記憶があります。『Angular』と付くように、回転に関する抵抗も使えると便利。UseGravity(重力の使用)これは言葉から読み取りやすいパラメータですね。重力の影響を受けるかどうかを決めます。Unity世界では重力が働いており、このパラメータがtrueになっているRigidbodyを持つオブジェクトは重力の影響を受けます。重力の大きさを設定するには、物理演算マネージャーを開きます。[Physics]を選択。PhysicsManagerを開く『Inspector』ウィンドウにはPhysicsManager(物理演算マネージャー)が表示されます。この一番上にある項目が重力を決めるGravityです。デフォルトではYが-9.81になっており、現実の重力加速度と同程度となっています。Gravityがtrueの場合には、そのRigidbodyは重力の影響を受けて落下していきます。逆にfalseの場合は、重力の影響を受けないため、その他の力が加わらない限りは落下しません。無重力空間のオブジェクトを表現するのに便利なので、宇宙空間を漂う岩とかスペースデブリなどを使う場合はチェックを外すのがいいですね。pocket【Unity】RigidbodyのUseGravity(重力の使用)を変えて実験https://ekulabo.com/rigidbody-use-gravityUnityのRigidbodyで設定できるUseGravity(重力の使用)について、値を変えると物体の運動がどのように変化するのかを実験しています。この設定は直感的に分かりやすくていいですね。useGravityをfalseにすれば、Scene内に惑星と、その周りを公転する衛星が作れます。IsKinematic(物理演算の影響を受けるかどうか)IsKinematicがtrueだと物理演算の影響を受けず、falseだと影響を受けます。問題児のIsKinematicさん。Unity初心者が「えっ何これ......怖いから触らんとこ」となる要因の一つです。Kinematic(キネマティック)って言葉がもう馴染みない感じですし。直訳すると『運動学的な』となる形容詞。そもそも『運動学』自体が日本語でもそんなに触れる機会もないような......。運動学とは物理における力学の一分野で、物体の運動に関して力の詳細にまでは触れず、位置の移動やその時間変化など、数学的に記述する分野のこと。ポイントは、力の詳細に触れない点。Unity的に考えると、Rigidbodyに与えられる力(AddForceやGravityなど)の影響を受けないってことなんです。IsKinematicをtrueにした物体は、アニメーションやスクリプトなどからtransformをいじって位置を変えたり、回転させたりして動かす必要があります。IsKinematicがtrueで、スクリプトから位置を動かしている物体であっても、他のRigidbodyに衝突すると相手に影響を及ぼします。3Dモデルを作って、それをアニメーションさせている場合にはIsKinematicをtrueにした方がいいですね。Rigidbodyは付けたまま、IsKinematicで物理演算の影響を外す感じ。pocket【Unity】RigidbodyのIsKinematic(物理演算の影響の有無)を変えて実験https://ekulabo.com/rigidbody-is-kinematicUnityのRigidbodyで設定できるIsKinematic(物理演算の影響の有無)について、値を変えると物体の運動がどのように変化するのかを実験しています。初心者にとって、Rigidbodyの中でもIsKinematicは特に分かりづらい項目なので、解説も行なっています。Interpolate(補間)InterpolateはFixedUpdateによる物理処理を滑らかにするための設定です。Interpolateの日本語訳は「付け加える」とか「差し挟む」といった感じ。Unity2017.4までは、FixedUpdateはデフォルトで1秒間に50回の更新となっています。Unity2018.1からは、デフォルトだとFixedUpdateが1秒間に60回呼ばれるようになりました。Timestepのデフォルト値の変更。FixedUpdateはデフォルトで50FPSというのが染み付いていたので、ちょっと新鮮な気持ちです。時代は60FPSですよ、60FPS!対して、画面の描画に関わるUpdate関数が呼ばれる回数は変動します。デフォルトだとPC向けゲームでは可能な限りFPSが上昇しますし、スマホ向けゲームでは30FPSになっていたりと、FixedUpdateが呼ばれるタイミングと必ずしも一致しないんです。これによって何が起きるのかと言えば、物理演算と描画タイミングが一致しないため、本来いて欲しい位置にオブジェクトが間に合わず、結果としてカクツキとなって現れます。マニュアルでは『痙攣しているような見た目』と表現されていました。これを防いでくれるのがInterpolateです。デフォルトでは『None』となっており、補間が行われない状態です。『Interpolate』を選択すると、補間が行われ、描画がスムーズになります。補間は直前フレームの速度を使って計算します。こちらは過去の実績に基づいて位置を算出する方法ですね。『Extrapolate』を選択した場合も補間が行われますが、こちらは現在の速度から次フレームの位置を予測して補間を行います。『Interpolate』とは逆に未来予測で位置を算出します。customers.マニュアルやUnityフォーラムの上記の記事を参考にすると、『Interpolate』では過去の位置に基づいて描画時の補間を行うので、変な位置になることは少ないようです。計算のコストがあるため、どちらかと言えば重い処理になります。『Extrapolate』では現在の速度を見て予測を行いますが、急激に速度が変化した場合などには、おかしな位置が算出される可能性もあります。処理の重さで言えば『Interpolate』より軽いようです。この設定はプレイヤーオブジェクトなど、カメラで追いかけるメインのオブジェクトに使用するのが望ましいとのこと。エクスプラボ【Unity】RigidbodyのInterpolate(補間)を変えて実験https://ekulabo.com/rigidbody-interpolateUnityのRigidbodyで設定できるInterpolate(補間)について、値を変えると物体の運動がどのように変化するのかを実験しています。Interpolateの設定の意味を解説し、値を変えた時の様子を動画で紹介しています。Detectionは衝突の検知に関する設定です。高速で運動する物体などは、フレーム更新の隙間を縫って壁をすり抜けてしまうことがあるんです。これは、衝突検知のタイミングが離散的であるため。デフォルトでは衝突検知のモードがDiscrete(離散の)になっているので、その間に物体を通り過ぎれば衝突がなかったことに。これが......これがトンネル効果......!!ゲームの世界とはいえ、トンネル効果がぽんぽん発生しても困るので、高速で動く物体でもちゃんと衝突したことを検知するために設定するのがこのフィールド。設定値は『Discrete』、『Continuous』、『ContinuousDynamic』の3つ。『Discrete』は上でも触れましたが、離散的に衝突を検知します。FixedUpdateが呼ばれたタイミングで衝突を確認するため、そのときにColliderが重なっていないのであれば衝突したと見なされません。デフォルトではこれが選択されています。確認の回数は比較的少なく高速なので、パフォーマンスの観点から言えば、なるべくこれを選んでおきたいところです。『Continuous』は、このRigidbodyを持ったオブジェクトの進路上に、Rigidbodyを持っておらず、かつColliderを持つオブジェクトがあれば、FixedUpdateの間であっても連続的に衝突を検知します。Continuousはそのまま「連続的に」といった意味。Rigidbodyを持っていないけど、衝突はしてほしいオブジェクト(例えば壁など)との衝突をちゃんと検知したいときにはこれを選びます。衝突を検知してほしい相手がRigidbodyを持っている場合は、下の『ContinuousDynamic』を使います。Detectionが『Continuous』または『ContinuousDynamic』であれば連続的に衝突を検知してくれます。衝突検知の精度ではこれが一番。パフォーマンス面では3つの中で一番重い処理となります。マニュアルによると、『Continuous』および『ContinuousDynamic』で連続的に衝突を検知できるのは、Sphereコライダー、Capsuleコライダー、Boxコライダーのみだそうです。MeshコライダーやTerrainコライダーなどは対象外っぽい。複雑なメッシュだと流石にPCが悲鳴をあげますもんね。Detection(衝突の検知)について、値を変えると物体の運動がどのように変化するのかを実験しています。Detectionの設定はどうかによって衝突を検知できるかどうかが...Constraints(制限)Constraintsは制限を意味する言葉で、チェックを入れた軸に関する移動や回転を制限できます。X-Y平面だけでゲームを動かしたいときには、Z軸方向に移動させたくない場合があります。PositionのZ軸にチェックを入れれば、Z軸方向に運動しなくなります。衝突で弾かれたときにも有効なので、思わぬ方向に飛んで行かないようにこの設定を入れておくといいかも。Position』は位置の固定です。指定した軸方向の運動を制限することができます。Rotation』は回転の固定です。指定した軸を中心とする回転を制限できます。見た目は3Dのオブジェクトだけど、移動できる方向は2Dのアクションゲームで使えるかな。pocket【Unity】RigidbodyのConstraints(制限)を変えて実験https://ekulabo.com/rigidbody-constraintsUnityのRigidbodyで設定できるConstraints(制限)について、値を変えると物体の運動がどのように変化するのかを実験しています。Positionは使い所も多いので、イメージを掴んでおくと役立ちます。Rotationは2軸縛りで、意図しな...まとめ基本的な話と言いつつ結構がっつりめな解説でした。イメージしやすいパラメータもあれば、なかなかイメージしにくいパラメータもあるので、実際に動かしてみるのが一番かも。この記事でも日本語訳を付け加えてみたりと、なるべくイメージできるようにはしてみました。公式マニュアルを見たり、自分で手を動かしたり、他の人の解説を読んだりとしているうちに動きが掴めてきます。Rigidbody、コワクナイヨ。ゲーム開発の攻略チャートを作りました!「ゲームを作ってみたいけど、何から手を付けていいか分からない!」そんなお悩みをお持ちの方向けに、todoがアプリをリリースした経験を中心に、ゲーム作りの手順や考慮すべき点をまとめたe-bookを作成しました。ゲーム作りはそれ自体がゲームのように楽しいプロセスなので、「攻略チャート」と名付けています。投稿一覧Unityを使ってアプリを作ったり、Assetを作ったりしてる個人開発者。Unity全般ネタとAsset開発の情報を扱っています。Asset開発は日本語の情報が少ないのよね。ことで些細なネタでも情報を蓄積するのが目的です。2018.05.14UnityのRigidbodyで設定できるDrag(抵抗)について、値を変えると物体の運動がどのように変化するのかを実験しています。2018.05.17UnityのRigidbodyで設定できるConstraints(制限)について、値を変えると物体の運動がどのように変化するのかを実験しています。2018.05.12UnityのRigidbodyで設定できるMass(質量)について、値を変えると物体の運動がどのように変化するのかを実験しています。2018.05.31UnityでRigidbodyを扱う際、衝突検知モードを選択することができます。コメントをキャンセルメールアドレスが公開されることはありません。コメントデータの処理方法の詳細はこちらをご覧ください。todoUnityのアセットを作ったり、スマホ向けのアプリを作っています。このブログではUnity初心者に向けたチュートリアルやテクニックを放出しています。詳しいプロフィールはこちら。お仕事の相談や現在提供中のサービスについては、こちらの『サービス内容』のページをご覧ください。Explorers_todoオンライントレーニングのサイトをオープン!エクスプラボを運営しているtodoが、より集中的にゲーム作りについて学べるオンライントレーニングのサイトをオープンしました。エクスプラボのトレーニングルーム』です。勉強したことの進捗も表示できるようになっているので、どれだけ頑張ったのかが分かるようになっています。ゲーム開発の攻略チャート』というe-bookをプレゼントしています。メルマガではゲーム開発のテクニックを中心に役立つ情報をお届けします。詳しくはこちら!お仕事の依頼はこちら!ゲーム開発のサポートも可能!エクスプラボではゲーム開発のサポートのサービスも行なっています。いう場合にオススメのプランです。詳細はこちら!もちろん、普通に開発依頼をいただいてもお手伝いします。その場合はお問い合わせへ。【Unity】ポストプロセシングを使って簡単にプロっぽいゲーム画面を作るゲームの作り方を学べるオンライン講座のサイトをオープンしました!RANKING【Unity】Mathfの切り上げ、切り捨て、偶数丸め。使い分けが大事よねMathf【Unity】ゲームといえばランダム要素。(12)作ったアプリ空とにゃんこと風船と癒し系縦スクロール避けゲーの『空とにゃんこと風船と』(TODOWORKS名義でリリース)気軽に遊べるスマートフォン向けアプリです。ボクセルアートで彩られるどこかレトロ、でも新しい世界で癒されてみませんか?ぼく、猫ですって!タップ系RPG『ぼく、猫ですって!』(TODOWORKS名義でリリース)気軽に遊べるスマホRPG。