Memotret bentuk bersama dalam game

8

Saya mencoba mencari cara untuk menjentikkan bentuk bersama-sama pemain dapat bergerak di atas kanvas.

masukkan deskripsi gambar di sini

Saat bujur sangkar mendekati objek lain, saya ingin menarik bentuk itu ke dalam (diberi kedekatan tertentu) dan memasangnya dengan sempurna di sepanjang tepi objek itu.

Aturan:

  • Hanya jika tepinya sejajar satu sama lain
  • Jika kotak anak (diseret) adalah setengah dari ukuran kotak induk (sedang didekati), maka titik tengah dari tepi kotak induk dapat menentukan apakah anak terkunci baik ke kiri / kanan / atas / bawah

masukkan deskripsi gambar di sini

Adakah yang melakukan hal seperti ini? Saya menggunakan c # dan unity. Bersulang.

dolyth
sumber

Jawaban:

7

Saya sudah menulis prototipe dari sesuatu seperti ini. Saya membuat beberapa sumber yang terlihat seperti ini:

masukkan deskripsi gambar di sini

Jadi pada dasarnya objek "ShipPart" ini memiliki titik jepretan yang telah ditentukan sebelumnya. Keempat collider ini akan membantu menentukan apakah Anda mencoba untuk mengunci suatu objek atau tidak.

Selanjutnya saya membuat kelas ShipPart, yang berisi beberapa hal seperti:

//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 ;

Ini juga berisi fungsi dan properti untuk membantu dengan drag and drop, dan memeriksa keadaan ShipParts yang berdekatan.

Fungsi penting adalah fungsi Lampirkan (), yang akan menghubungkan ShipPart ini ke Kapal Anda.

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);
}

Kemudian akhirnya, kelas Kapal, melacak bagian Inti Anda, semua bagian yang terlampir, semua data kapal dikelola di sini. Anda dapat raycast untuk bagian-bagian kapal di kelas ini. Periksa bagian yang sedang Anda seret untuk melihat apakah ada collider yang bertabrakan dengan bagian lain.

Jika ada tabrakan, periksa apakah rotasi berada dalam ambang yang Anda tentukan dan pasang ke tempatnya.

Ini sebenarnya jauh lebih rumit untuk dijelaskan daripada yang saya kira. Beri tahu saya jika Anda memiliki pertanyaan dan saya akan menguraikan apa pun yang Anda perlu bantuan lebih lanjut.

masukkan deskripsi gambar di sini

jallan
sumber
Terima kasih atas jawaban yang diilustrasikan dengan baik - Saya punya pertanyaan :), poin jepret yang ditentukan sebelumnya, apakah titik-titik ini yang Anda periksa kedekatannya? Kemudian ketika mereka sudah dekat, kotak hijau muncul .. artinya jika Anda melepaskan sekarang, gertakan itu kemudian dilakukan?
dolyth
1
Ya, kotak hijau menunjukkan bahwa ada snap, dan di mana snap. Collider ada di area yang sama ini, dan inilah yang digunakan untuk menentukan apakah Anda dapat membentak atau tidak. Saya raycast empat titik sambil secara aktif menggerakkan bagian untuk menentukan apakah kita tumpang tindih titik jepret atau tidak - dan jika ya, seberapa dekat kita dengan objek itu.
jgallant
bagaimana Anda membuat kotak hijau muncul ketika Anda memotret? Apakah Anda memiliki semua skrip di github di suatu tempat? Terima kasih, Melissa
MC kontributor