強火で進め

このブログではプログラム関連の記事を中心に書いてます。

【Unity】 Point Effector 2D

動作検証環境

  • Unity 2022.2.0f1

はじめに

Point Effector 2D は引力や反発力を表現をしたい時に使用するコンポーネントです。

docs.unity3d.com

プロパティ

プロパティ名 説明
Use Collider Mask Collider Mask を使いたい時にチェック。
Collider Mask ここでチェックを付けた Layer に対してのみ Point Effector 2D の処理対象となる。
Force Magnitude 力の強さ。正の数の場合には反発の力、負の数の場合には引力となる。
Force Variation ランダムで設定される力の強さ。「Force Magnitude+0~ここで指定した値の範囲のランダム値」が最終的に出力される力の強さになる。
Distance Scale Force Mode の値が Constant 以外の時に発生する距離による効果にスケールをかける。
Drag 移動を抑える力の強さを設定。
Angular Drag 回転(角速度)を抑える力の強さを設定。
Force Source ターゲットのオブジェクトを引き付けたり、反発させたりするポイントを指定。Collider を選択した場合には Collider の位置に、 Rigidbody を選択した場合には重心がそのポイントとなる。
Force Target ターゲットのオブジェクト上の力を与えるポイントを指定。Collider を選択した場合には Collider の位置に、 Rigidbody を選択した場合には重心がそのポイントとなる。
Force Mode Constant 、 Inverse Linear 、 Inverse Squared のいずれかを選択可能。それぞれの効果については後述。

解説

ここでは解説の為に以下の様なプロジェクトを準備しました。

緑色の顔の Point Effector 2D の効果で白い顔が中心に向かってに吸い込まれるというサンプルで解説します。

それぞれの顔の GameObject にはこの様なコンポーネントが付けて有ります。

白色の顔

  • Circle Collider 2D
  • Rigidbody 2D

緑色の顔

  • Circle Collider 2D
  • Rigidbody 2D
  • Point Effector 2D

Point Effector 2D はこの様に設定しています。

Force Magnitude

正の値の場合には反発の力、負の値の場合には引力が発生している事が確認できます。

Force Magnitude = 20

Force Magnitude = -100

Force Mode で設定可能な値について

■ Constant

Target Point からの距離に関わらず常に100%の力で影響を与えます。

■ Inverse Linear

Target Point から離れるほど力は直線的に減衰して行きます。

■ Inverse Squared

Target Point から離れるほど力は2乗で減衰して行きます。

万有引力の法則」など「逆2乗の法則」を持つものを再現したい場合に使用します。

Distance Scale

Distance Scale は距離による影響をスケールします。その為、 Force Mode の値が Constant 以外に設定しないと意味が有りません。

数値を大きく設定するほど影響を与える力が弱くなっている為、中央に集まる速度が遅くなっているのが確認できます。

■ Distance Scale = 1

■ Distance Scale = 10

Drag

数値が大きいほど Target Point を中心に発生している白い顔のバウンドが収まるのが速くなっているのが確認できます。

■ Drag = 1

■ Drag = 10

【Unity】 Buoyancy Effector 2D

動作検証環境

  • Unity 2022.2.0f1

はじめに

Buoyancy Effector 2D は浮力や流れなどの水の表現をしたい時に使用するコンポーネントです。

docs.unity3d.com

プロパティ

プロパティ名 説明
Use Collider Mask Collider Mask を使いたい時にチェック。
Collider Mask ここでチェックを付けた Layer に対してのみ Buoyancy Effector 2D の処理対象となる。
Surface Level 水面の位置を設定。
Density 密度の設定。値が大きいほど浮力が上がります。
Linear Drag 直線的な移動の力を抑える力の強さを設定。
Angular Drag 回転(角速度)を抑える力の強さを設定。
Flow Angle 水の流れる方向を角度で指定。
Flow Magnitude 水の流れる力の強さ。
Flow Variation ランダムで設定される水の流れる力の強さ。「Flow Magnitude+0~ここで指定した値の範囲のランダム値」が最終的に出力される力の強さになる。

解説

Surface Level

Surface Level の現在の位置は Scene ビューでは水色のラインで表示されます。

デフォルト値の 0 の時には中央に位置するので Scene ビューで確認しながら自分のゲームに合った位置に移動させます。

Linear Drag

値が大きい方がより速く静止します。

Angular Drag

値が大きい方がより速く静止します。

Flow Angle と Flow Magnitude

Flow Angle0Flow Magnitude3 を設定する事で+X方向(右方向)へ水が流れます。

Flow Angle を 90、180、270 に変更した場合には水はこの様な方向へ流れます。

※実際にはオブジェクトには「水の流れ / 浮力 / 重力」が加わる為、完全に水の流れの方へ移動させたい場合には浮力と重力をゼロに設定する必要が有ります。

Flow Variation

Buoyancy Effector 2D にこの様に設定した状態で水の中にオブジェクトをどんどん生成するとオブジェクトの流れる速度がそれぞれ異なる事が確認できます。

【Unity】 Area Effector 2D

動作検証環境

  • Unity 2022.2.0f1

はじめに

Area Effector 2D は Collider で設定した領域と接触した時に様々な力を与えるコンポーネントです。

docs.unity3d.com

プロパティ

プロパティ名 説明
Use Collider Mask Collider Mask を使いたい時にチェック。
Collider Mask ここでチェックを付けた Layer に対してのみ Area Effector 2D の処理対象となる。
Use Global Angle チェックを付けると Force Angle の指定がワールド座標での角度として指定される。
Force Angle 力を加える向き(角度)。
Force Magnitude 力の強さ。
Force Variation ランダムで設定される力の強さ。「Force Magnitude+0~ここで指定した値の範囲のランダム値」が最終的に出力される力の強さになる。
Force Target 力を加える位置を指定。Collider を選択した場合には Collider の位置に、 Rigidbody を選択した場合には重心に力が加えられる。
Drag 移動を抑える力の強さを設定。
Angular Drag 回転(角速度)を抑える力の強さを設定。

解説

Force Magnitude と Force Angle

緑色エリアには Area Effector 2D を設定し、赤い Box に力が加わる環境を準備します。 なお、 Box の Rigidbody 2DGravity Scale0 に設定して重力はかかっていない状態にします。

この状態でこの様に Force Managitude10 を設定すると Box は右へ移動して行きます。 これは Force Angle0 で有ること合わせた効果です。

Force Angle を 90、180、270 に変更した場合には Box はこの様な方向へ移動します。

Force Variation

この2つの緑色エリアにはどちらにも Force MagnitudeForce Variation に同じ値を設定をしています。

「Force Magnitude + Force Variation でのランダム値」の力が加えられるので実行させると2つの Box の移動量に差が発生します。

Drag

Drag の値が大きいほど減速が大きい事が確認できます。

Angular Drag

Angular Drag の値が大きいほど回転の減速が大きい事が確認できます。

【Unity】 Constant Force 2D

動作検証環境

  • Unity 2022.2.0f1

はじめに

Constant Force 2D は Rigidbody 2D に一定の力を加え続けるコンポーネントです。 自動的に移動させたり、回転させたりする事ができます。

docs.unity3d.com

プロパティ

プロパティ名 説明
Force 指定の方向に力を加える(絶対座標)。
Relative Force 指定の方向に力を加える(相対座標)。
Torque 正の数で指定すると反時計回り、負の数で指定すると時計回り方向に力が加えられる。

Force と Relative Force の比較

設定

両方の Box 共通

  • Rigidbody 2D の Gravity Scale は 0

1 の Box

  • Rotation の Z に 45
  • Constant Force 2D の Force の X に 1

2 の Box

  • Rotation の Z に 45
  • Constant Relative Force 2D の Force の X に 1

1の Box は絶対座標でのX方向、2の Box は相対座標でのX方向へ移動している事が確認できます。

Torque の検証

設定

両方の Box 共通

  • Rigidbody 2D の Gravity Scale に 0

1 の Box

  • Constant Force 2D の Torque に 3

2 の Box

  • Constant Force 2D の Torque に -3

1の Box は反時計回り、2の時計回りに回転している事が確認できます。

【Unity】 Composite Collider 2D

動作検証環境

  • Unity 2022.2.0f1

はじめに

Composite Collider 2D は複数の Collider 2D を一括で制御する事ができるコンポーネントです。 使用可能な Collider 2D は Box Collider 2DPolygon Collider 2D だけです。

docs.unity3d.com

プロパティ

プロパティ名 説明
Density 密度の設定。 Rigidbody 2D の Use Auto Mass がチェックされている場合にのみ表示される。
Material 物理特性を設定した Physics Material 2D を指定。
Is Trigger チェックされていない時は物理エンジンによる衝突が発生し、衝突時には OnCollisionXXX2D 系のコールバックが発生する。チェックされている時、物理エンジンによる衝突を起こさず、衝突時には OnTriggerXXX2D 系のコールバックを発生させる。
Used by Effector チェックされている場合には Effector を使用する。 Effector 2D 系のコンポーネントを付けておく必要が有る。
Offset 中心位置をずらしたい場合に数値を設定。
Geometry Type Outlines 、Polygons が選択可能。 Outlines を選択した場合には Composite Collider 2D 同士は衝突しませんが Polygons の場合には衝突が発生します。
Generation Type 構成されている Collider に変更された時に新しいジオメトリを作成するタイミングを指定。 Synchronous の場合には即座に行われ、Manual の場合は CompositeCollider2D.GenerateGeometry API を実行したタイミング、または Inspector の Regenerate Collider ボタンを押したタイミングで行われる。
Vertex Distance この数値より近い頂点はすべて削除されます。数値が大きくなるほど見た目に比べて省略された Collider となる。
Offset Distance この距離値内の頂点は結合されます。
Edge Radius Collider のエッジ部分の太さを半径で指定します。Geometry Type で Outlines が選択されている時の表示される。

Layer Overrides の項目についてはこちらの記事を参照。

解説

Vertex Distance

この様なスプライトの場合で検証してみます。

■ Vertex Distance = 0.0005 の時

■ Vertex Distance = 0.26 の時

数字が大きい方が簡略化された Collider になっている事が確認できます。

Offset Distance

■ Offset Distance = 5e-05 の時

■ Offset Distance = 0.3 の時

数字が大きい方が頂点が統合された Collider になっている事が確認できます。

Edge Radius

■ Edge Radius = 0.15 の時

Physics2D.OverlapPoint で判定されるのはこのエッジの部分だけです。内部の座標で Physics2D.OverlapPoint を実行した場合には Collider が返される事は有りません。

使い方

Composite Collider 2D を付けた GameObject の下に使用したい Collider という階層構造にします。

なお、 Composite Collider 2D を付けた GameObject には Rigidbody 2D も付けておく必要が有ります。

Box Collider 2D や Polygon Collider 2D で Used By Composite にチェックを付けると Composite Collider 2D で管理されようになります。

Composite Collider 2D を付けた GameObject を選択すると現在の衝突範囲が視覚化されます。

これを参考にしながら自分のゲームで許容できる正確さと負荷のバランスを取りながら、値の調整を行います。

【Unity】 Collider 2D

動作検証環境

  • Unity 2022.2.0f1

Collider 2D について

Collider 2D は2Dオブジェクトに衝突(当たり)判定を導入したい時に使います。 以下の種類があります。

  • Circle Collider 2D
  • Box Collider 2D
  • Polygon Collider 2D
  • Edge Collider 2D
  • Capsule Collider 2D
  • Composite Collider 2D
  • Tilemap Collider 2D

Circle Collider 2D

docs.unity3d.com

円形の衝突範囲。

プロパティ名 説明
Material 物理特性を設定した Physics Material 2D を指定。
Is Trigger チェックされていない時は物理エンジンによる衝突が発生し、衝突時には OnCollisionXXX2D 系のコールバックが発生する。チェックされている時、物理エンジンによる衝突を起こさず、衝突時には OnTriggerXXX2D 系のコールバックを発生させる。
Used by Effector チェックされている場合には Effector を使用する。 Effector 2D 系のコンポーネントを付けておく必要が有る。
Offset 中心位置をずらしたい場合に数値を設定。
Radius 半径を設定。

Layer Overrides の項目についてはこちらの記事を参照。

■ Physics Material 2D

Box Collider 2D

docs.unity3d.com

四角形の衝突範囲。

プロパティ名 説明
Material 物理特性を設定した Physics Material 2D を指定。
Is Trigger チェックされていない時は物理エンジンによる衝突が行われ、衝突時には OnCollisionXXX2D 系のコールバックが発生する。チェックされている時、物理エンジンによる衝突を起こさず、衝突時には OnTriggerXXX2D 系のコールバックを発生させる。
Used by Effector チェックされている時、 Effector を使用する。 Game Object には Effector 2D 系のコンポーネントを付けておく必要が有る。
Used by Composite チェックされている時、 Composite Collider 2D での設定を適用。
Auto Tiling チェックされている時、 Sprite で 9-slicing の設定が行われていると Sprite のサイズ変更に衝突範囲が追随します。
Offset 中心位置をずらしたい場合に数値を設定。
Size サイズを指定。
Edge Radius 衝突範囲のエッジ部分に円状の範囲を追加する。

Layer Overrides の項目についてはこちらの記事を参照。

■ Used by Composite がチェックされている時

■ Used by Composite がチェックされていない時

■ Auto Tiling が無効の時は衝突範囲がリサイズに追随しない

※ Sprite のサイズを変更しても衝突範囲は常に同じサイズのままになっている事が確認できます。

■ Auto Tiling が有効の時は衝突範囲がリサイズに追随する

■ Edge Radius

Polygon Collider 2D

docs.unity3d.com

ポリゴン(ラインで囲まれた領域)の衝突範囲。

プロパティ名 説明
Edit Collider ボタンを押すと頂点編集モードに移行します。
Material 物理特性を設定した Physics Material 2D を指定。
Is Trigger チェックされていない時は物理エンジンによる衝突が行われ、衝突時には OnCollisionXXX2D 系のコールバックが発生する。チェックされている時、物理エンジンによる衝突を起こさず、衝突時には OnTriggerXXX2D 系のコールバックを発生させる。
Used by Effector チェックされている時、 Effector を使用する。 Game Object には Effector 2D 系のコンポーネントを付けておく必要が有る。
Used by Composite チェックされている時、 Composite Collider 2D での設定を適用。
Auto Tiling チェックされている時、 Sprite で 9-slicing の設定が行われていると Sprite のサイズ変更に衝突範囲が追随します。
Offset 中心位置をずらしたい場合に数値を設定。
Points ポリゴンの頂点情報

Layer Overrides の項目についてはこちらの記事を参照。

■ Edit Collider(頂点の編集)

ライン上でマウスカーソルを移動すると四角が表示されます。クリックすると四角の位置に頂点が追加されます。 Ctrl( Macの場合は Command )キーを押した状態でライン上にマウスカーソルを移動させると2つのラインが赤く表示されます。その状態でクリックすると中央の頂点が削除されます。

■ Points の例

Edge Collider 2D

docs.unity3d.com

1つラインや複数のラインによる衝突範囲。ポリゴンと異なり面積を持っていない。

プロパティ名 説明
Edit Collider ボタンを押すと頂点編集モードに移行します。
Material 物理特性を設定した Physics Material 2D を指定。
Is Trigger チェックされていない時は物理エンジンによる衝突が行われ、衝突時には OnCollisionXXX2D 系のコールバックが発生する。チェックされている時、物理エンジンによる衝突を起こさず、衝突時には OnTriggerXXX2D 系のコールバックを発生させる。
Used by Effector チェックされている時、 Effector を使用する。 Game Object には Effector 2D 系のコンポーネントを付けておく必要が有る。
Offset 中心位置をずらしたい場合に数値を設定。
Points ポリゴンの頂点情報
Edge Radius 衝突範囲のエッジ部分に円状の範囲を追加する。
Used by Composite チェックされている時、 Composite Collider 2D での設定を適用。
Auto Tiling チェックされている時、 Sprite で 9-slicing の設定が行われていると Sprite のサイズ変更に衝突範囲が追随します。
Offset 中心位置をずらしたい場合に数値を設定。
Points ポリゴンの頂点情報
Use Adjacent Start Point エッジの開始点での Adjacent を有効にする。
Adjacent Start Point エッジの開始点での Adjacent を設定。
Use Adjacent End Point エッジの終点での Adjacent を有効にする。
Adjacent End Point エッジの終点での Adjacent を設定。

Layer Overrides の項目についてはこちらの記事を参照。

■ Edit Collider(頂点の編集)

Ctrl( Macの場合は Command )キーを押した状態でライン上にマウスカーソルを移動させると1つライン、または2つのラインが赤く表示されます。1つのライン時にクリックするとそのラインが削除される形に頂点が削除されます。2つのラインの時にクリックすると中央の頂点が削除されます。

■ Adjacent

Use Adjacent Start Point にチェックを付け、 Adjacent Start Point を設定するとこの様に段差が有る時に乗り越える事が出来る地面を作れる様です。 ※公式の PhysicsExamples2D サンプルの EdgeCollider2D_AdjacentPoints のシーンより。

同じ条件で Use Adjacent Start Point のチェックを外した場合にはこの様になりました。

こちらの公式動画の3:30辺りから Adjacent についての解説が有ります(英語)。

www.youtube.com

Capsule Collider 2D

docs.unity3d.com

カプセル型の衝突範囲。

プロパティ名 説明
Edit Collider ボタンを押すと頂点編集モードに移行します。
Material 物理特性を設定した Physics Material 2D を指定。
Is Trigger チェックされていない時は物理エンジンによる衝突が行われ、衝突時には OnCollisionXXX2D 系のコールバックが発生する。チェックされている時、物理エンジンによる衝突を起こさず、衝突時には OnTriggerXXX2D 系のコールバックを発生させる。
Used by Effector チェックされている時、 Effector を使用する。 Game Object には Effector 2D 系のコンポーネントを付けておく必要が有る。
Offset 中心位置をずらしたい場合に数値を設定。
Size サイズを指定。
Direction カプセルの半円部分を垂直に付ける( Vertical )か水平に付ける( Horizontal )かを指定。

Layer Overrides の項目についてはこちらの記事を参照。

■ Direction を Vertical 、 Size を X=0.5, Y=1.0 に指定

■ Direction を Horizontal 、Size を X=1.0, Y=0.5 に指定

Composite Collider 2D

docs.unity3d.com

複数の Collider をまとめて制御。詳しくはこちらを参照。

Custom Collider 2D

docs.unity3d.com

自前で凝った形状を使いたい時に使用。 PhysicsShapeGroup2D で形状を作成し、設定する。

【Unity】 Sprite の 9-slicing

動作検証環境

  • Unity 2022.2.0f1

はじめに

9-slicing は 9-patch とも呼ばれる事もある、画像の歪みを防ぎながら画像を拡大や縮小する手法の事です。

準備する画像

Sprite に使用する画像(テクスチャ)は 9-slicing に対応したものを準備する必要が有ります。

9-slicing 画像は9のブロックに分かれ、それぞれのブロックで以下の様なスケーリングが行われます。その為、このルールに合わせた画像を準備する必要が有ります。

  • 四隅(A/C/G/I)サイズ変更は行われない。
  • B/H 水平に拡縮されるか並べて表示。
  • D/F 垂直に拡縮されるか並べて表示。
  • E 水平と垂直方向に拡縮されるか並べて表示。

画像の設定

9-slicing に対応した画像を準備し、 画像の Inspector で Mesh TypeFull Rect に変更後、 Sprite Editor ボタンを押します。

緑色のラインが9のブロックの境界を表しているので以下の様に設定し、 Apply を押します。

Sprite の設定

9-slicing の設定を行った画像をシーンに追加し、 Inspector で Sprite Renderer の Draw ModeSliced に設定します。 これで全ての設定が完了です。拡縮した時に以下の様な描画がされる様になります。

なお、 Draw ModeTiled に設定した場合にはこの様な描画となります。

注意点

9-slicing が適用されるのは Sprite の「サイズの変更」を行った時です。「スケールの変更」を行った時には適用されないので注意して下さい。

矢印位置のアイコンが選択され、四隅に青の丸が出ている時は「サイズの変更」です。

先端が四角になっている線が出ている時は「スケールの変更」が行われます。

関連サイト

公式の 9-slicing についてのドキュメント。

docs.unity3d.com