Cara mengembangkan platformer lain menggunakan Unity. Tutorial lain, bagian 2

Sebagai kelanjutan dari artikel pertama ( ada di sini ), saya terus mengembangkan platformer berdasarkan artikel "Pola Desain Level untuk Game 2D" .

Setelah rilis artikel pertama, dengan tegas diputuskan bahwa tombol kontrol yang dijelaskan di dalamnya sama sekali tidak nyaman. Oleh karena itu, kontrol dalam permainan diulang pada joystick. Lebih lanjut, sayangnya permainan tidak lulus moderasi di playmarket. Jumat lalu saya menerima pemberitahuan bahwa proyek ditolak karena pengumpulan metadata. By the way, platformer pertama saya "Knight Kadavar" juga ditolak untuk pertama kalinya, karena dugaan permintaan izin untuk mengelola panggilan dan melihat SMS (yang merupakan kebodohan pada bagian dari bot mereka. Permainan tidak memerlukan izin apa pun). Google kemudian meminta dari saya pemberitahuan tertulis tentang mengapa saya membutuhkannya. Tapi, itu semua berakhir dengan fakta bahwa saya memperbaiki beberapa kesalahan yang saya perhatikan dan mengirim permainan kembali moderasi. Dia berhasil ditambahkan ke playmarket. Sekarang, saya berencana untuk melakukan hal yang persis sama dengan permainan ini.

Jadi, segera setelah adegan kedua dibuat, polanya secara otomatis ditutup

Adegan


sebuah fragmen level / dunia berdasarkan pada suatu konsep biasanya merupakan suatu kesulitan yang dapat diatasi.

Bonus


barang koleksi yang memiliki efek positif pada pemain

Kami menyadari 2 jenis bonus untuk Lucas:

  • Peralatan P3K yang akan jatuh saat Anda menghancurkan monster
  • Peti dengan pedang yang bisa dilemparkan Lucas ke musuh

Untuk menerapkan bonus dengan kotak P3K, Anda harus memodifikasi Rak itan dengan monster. Lebih khusus lagi, tunjukkan tempat dari mana bonus akan muncul.



Kemudian, ubah skrip Enemy.cs:

Judul spoiler
/* ,        */ [SerializeField] private GameObject bonusPref; //   [SerializeField] private Transform instBonus; //     [SerializeField] private int isBonus; //    ,     /*   */ public void ifDie() { if (Damage(0) <= 0) { isBonus = Random.Range(0,3); if (isBonus == 0) { Instantiate(bonusPref, instBonus.position, instBonus.rotation); } Destroy(this.gameObject); } } 


Kita memanggil fungsi dengan tipe Damage yang dikembalikan (0) dan memeriksa apakah Health 0. kembali.Jika demikian, maka kita memanggil generator nomor acak. Jika generator berhenti dengan memilih angka 0, maka kita melempar pemain bonus dan menghancurkan monster itu.

Selanjutnya, kami jelaskan apa yang dapat Anda lakukan dengan bonus ini. Untuk melakukan ini, buat prefab-nya dengan komponen SpriteRenderer, BoxCollider2D dan Rigidbody2D. Juga, buat skrip yang akan bertanggung jawab atas apa yang perlu dilakukan jika apel bertabrakan dengan pemain:

Judul spoiler
 public void OnTriggerEnter2D(Collider2D collision) { switch (collision.gameObject.tag) { case "Player": { HeroScript.Health = 100; Destroy(this.gameObject); } break; } } 


Lihat video pratinjau .

Selanjutnya, kami menyadari bonus dari hilangnya pedang. Itu dapat diimplementasikan sesuai dengan prinsip yang sama seperti pada bagian pertama, kehilangan log diimplementasikan. Bagian yang menarik adalah bahwa ketika Lucas mengambil pedang, mereka harus dibuang hanya dalam jarak pandang lawan, dan bukan ketika Lucas mengumpulkan log. Memang, dalam bentuk di mana tombol pengumpulan item Attack \ sekarang diterapkan, itu akan melakukan hal itu. Pedang dilempar keluar dalam situasi apa pun. Untuk melakukan ini, kami memodifikasi kode skrip serangan / koleksi:

Judul spoiler
  /*      */ [SerializeField] private GameObject swordPref; //    [SerializeField] private Transform instSword; //     [SerializeField] private float swordSpeed; //    private float attackInBoxX, attackInBoxY; //    /*       */ // ED  EnemyDamage Collider2D[] ED = Physics2D.OverlapBoxAll(Hero.position, new Vector2(attackInBoxX, attackInBoxY), 12, lEnemy); { if (ED.Length > 0) { if (InventoryOnHero.swordCount == 0) { Debug.Log(" "); } if (InventoryOnHero.swordCount > 0) { instantiateSword(); InventoryOnHero.swordCount = InventoryOnHero.swordCount - 1; } else { for (int i = 0; i < ED.Length; i++) { ED[i].GetComponent<Enemy>().Damage(1); } } } } 


Apa arti dari baris kode ini? Pertama, kami mendefinisikan array collider dan memeriksa semua yang masuk ke dalam kubus kami:

 Collider2D[] ED = Physics2D.OverlapBoxAll(Hero.position, new Vector2(attackInBoxX, attackInBoxY), lEnemy); 

Perhatikan parameter yang diteruskan, mereka sangat berbeda dari yang digunakan untuk OvelapCircleAll. Parameter kunci -

 Vector2(attackInBoxX, attackInBoxY) 

Kemudian syarat terpenuhi, jika array collider lebih besar dari 0, maka kami memeriksa persediaan untuk pedang. Jika jumlah pedang adalah 0, maka kita tidak melakukan apa-apa dan menjalankan metode
 ED[i].GetComponent<Enemy>().Damage(1); 
seolah-olah itu adalah hit biasa. Jika lebih besar dari 0, lepaskan pedang dan kurangi jumlah pedang sebanyak 1.

Selanjutnya, implementasi metode instantiateSword ();

Judul spoiler
  private void instantiateSword() { GameObject newArrow = Instantiate(swordPref) as GameObject; newArrow.transform.position = instSword.transform.position; Rigidbody2D rb = newArrow.GetComponent<Rigidbody2D>(); if (GameObject.Find("Hero").GetComponent<HeroScript>().localScale.x > 0) { rb.velocity = new Vector3(swordSpeed, 0, 0); } else { rb.velocity = new Vector3(-swordSpeed, 0, 0); newArrow.transform.Rotate(0,0,-180); } } 


Jika Anda membaca artikel sebelumnya dengan baik, Anda mungkin telah memperhatikan bahwa kode ini menyerupai bagian dari kode yang bertanggung jawab untuk memotret bunga matahari. Menambahkan baris ke bagian kode ini yang bertanggung jawab untuk menentukan skala Lucas. Artinya, dia terlihat ke kiri atau kanan:

 (GameObject.Find("Hero").GetComponent<HeroScript>().localScale.x > 0) 

Jika Lucas melihat ke kiri, maka

 rb.velocity = new Vector3(-swordSpeed, 0, 0); newArrow.transform.Rotate(0,0,-180); 

pedang itu terbang ke kiri dan juga memutarnya 180 derajat.

Lihat video pratinjau .

Melakukan tindakan ini, kami secara otomatis menutup 1 pola lain:

Obyek


entitas apa pun yang muncul di kancah permainan dan dapat mengubah statusnya. Objek termasuk bahaya, musuh, bonus, dll.

Meskipun, kemungkinan besar, pola ini diterapkan sebelumnya ketika monster pertama diprogram.

Akibatnya, saat ini 3 pola tidak diterapkan:

  • Area yang tidak terjangkau
  • Mekaniknya
  • Bos

Mekanika saat ini sangat menarik bagi saya. Karena saya tidak bisa mengatakan pada diri sendiri bahwa saya mengerti persis apa yang orang lain masukkan ke dalam definisi ini.

Selanjutnya, area yang tidak terjangkau . Dalam masalah ini, saya akan untuk beberapa waktu menangani masalah desain level. Pertama, karena saya ingin membuat tingkat ketiga menjadi gelap. Kemungkinan besar sebuah gua atau ruang bawah tanah. Dengan kemampuan mewujudkan efek pencahayaan.

Bos ! Ini juga akan tetap menjadi ceri pada kue. Saya ingin membuatnya sebebas mungkin dan dengan kemampuan untuk mengubah penampilan saya.

Bagian pertama artikel
Semua objek game diambil dari https://opengameart.org/ , yaitu:



Merasa bebas dan menulis komentar tentang Habré atau kepada saya di worldofonehero@gmail.com.

Terima kasih sudah membaca, semoga sukses.

Source: https://habr.com/ru/post/id460561/


All Articles