ゲーム内でシェイプをスナップする


8

プレイヤーがキャンバス上を動き回る可能性がある形を一緒にスナップする方法を考え出そうとしています。

ここに画像の説明を入力してください

正方形が他のオブジェクトに近づくと、その形状を(特定の近接性がある場合)引き込み、そのオブジェクトの端に沿って完全にスナップさせます。

ルール:

  • エッジが互いに平行な場合のみ
  • 子の正方形(ドラッグ中)が親の正方形(接近中)の半分のサイズの場合、親の正方形のエッジの中点で、子が左/右/上/下のどちらにスナップするかを決定できます。

ここに画像の説明を入力してください

誰かがこのようなことをしましたか?私はc#とUnityを使用しています。乾杯。

回答:


7

私はこのようなもののプロトタイプを書きました。次のようなリソースをいくつか作成しました。

ここに画像の説明を入力してください

したがって、基本的に、この「ShipPart」オブジェクトには事前定義されたスナップポイントがあります。これらの4つのコライダーは、オブジェクトを所定の位置にスナップしようとしているのかどうかを判断するのに役立ちます。

次に、次のようなものが含まれるShipPartクラスを作成しました。

//Neighbor information
ShipPart Left, Right, Top, Bottom;

//current rotation
float Rotation;

//The ship core it is attached to
Ship Ship;

//The coordinates in references to the ship core
int X ;
int Y ;

また、ドラッグアンドドロップ、および隣接するShipPartの状態のチェックに役立つ関数とプロパティも含まれています。

重要な関数はAttach()関数で、このShipPartを自分の船に接続します。

public void Attach(Ship ship, int x, int y)
{
    GetComponent<Rigidbody2D> ().isKinematic = true;

    Ship = ship;

    X = x;
    Y = y;

    transform.parent = Ship.transform;
    transform.position = Vector2.zero;
    transform.localPosition = new Vector2(x, -y);
}

そして最後に、Shipクラスは、コアピース、アタッチされたすべてのパーツを追跡し、すべてのShipsデータがここで管理されます。このクラスの船の部品をレイキャストできます。現在ドラッグしているパーツをチェックして、コライダーのいずれかが他のパーツと衝突していないか確認します。

衝突がある場合は、回転が指定したしきい値内にあるかどうかを確認し、所定の位置にスナップします。

これは実際、私が思っていたよりも説明がはるかに複雑です。ご不明な点がありましたらお知らせください。さらにサポートが必要な場合は詳しく説明します。

ここに画像の説明を入力してください


うまく説明された答えをありがとう-私は質問があります:)、事前定義されたスナップポイント、これらのポイントは近接性をチェックしていますか?次に、それらが近くになると、緑色のボックスが表示されます。つまり、今リリースすると、スナップが行われますか?
ドリス

1
ええ、緑色のボックスは、スナップが利用できることと、スナップする場所を示しています。コライダーはこの同じ領域に存在し、スナップできるかどうかを決定するために使用されます。パーツをアクティブに移動しながら4つのスポットをレイキャストして、スナップポイントに重なっているかどうかを確認します。重なっている場合は、そのオブジェクトにどれだけ近いかを確認します。
jgallant

スナップ中に緑色のボックスをどのように表示しますか?githubにすべてのスクリプトがありますか?おかげで、メリッサ
MContributor
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.