Cara Men Spawn Monster di Godot
Pada bagian ini, kita akan memunculkan monster secara acak di sepanjang jalan. Pada akhirnya, monster akan berkeliaran di papan permainan.

Klik dua kali main.tscnpada dok FileSystem untuk membuka Mainpemandangan.
Sebelum menggambar jalur, kita akan mengubah resolusi permainan. Permainan kita memiliki ukuran jendela default 1152x648. Kita akan mengaturnya ke 720x540, kotak kecil yang bagus.
Buka Proyek -> Pengaturan Proyek .

Jika Anda masih membuka Peta Input , alihkan ke tab Umum .
Di menu sebelah kiri, navigasikan ke Display -> Window . Di sebelah kanan, atur Width ke 720dan Height ke 540.

Membuat jalur spawn
Seperti yang Anda lakukan dalam tutorial permainan 2D, Anda akan mendesain jalur dan menggunakan simpul PathFollow3D untuk mengambil sampel lokasi acak di sepanjang jalur tersebut.
Namun, dalam 3D, menggambar jalur agak lebih rumit. Kami ingin jalur tersebut berada di sekitar tampilan permainan sehingga monster muncul tepat di luar layar. Namun, jika kami menggambar jalur, kami tidak akan melihatnya dari pratinjau kamera.
Untuk menemukan batas tampilan, kita dapat menggunakan beberapa placeholder mesh. Viewport Anda harus tetap dibagi menjadi dua bagian, dengan pratinjau kamera di bagian bawah. Jika tidak demikian, tekan ( pada macOS) untuk membagi tampilan menjadi dua. Pilih node Camera3D dan klik kotak centang Pratinjau di viewport bagian bawah.Ctrl + 2Cmd + 2

Menambahkan silinder placeholder
Mari tambahkan mesh placeholder. Tambahkan Node3D baru sebagai anak dari Mainnode tersebut dan beri nama Cylinders. Kita akan menggunakannya untuk mengelompokkan silinder. Pilih Cylindersdan tambahkan node anak MeshInstance3D

Di Inspektur , tetapkan CylinderMesh ke properti Mesh .

Atur viewport atas ke tampilan ortogonal atas menggunakan menu di sudut kiri atas viewport. Atau, Anda dapat menekan tombol 7 pada keypad.

Kisi-kisi mungkin mengganggu. Anda dapat mengaktifkannya dengan membuka menu View di bilah alat dan mengeklik View Grid .

Sekarang Anda ingin menggerakkan silinder di sepanjang bidang tanah, sambil melihat pratinjau kamera di viewport bawah. Saya sarankan menggunakan grid snap untuk melakukannya. Anda dapat mengaktifkannya dengan mengeklik ikon magnet di bilah alat atau menekan Y.

Pindahkan silinder sehingga berada tepat di luar pandangan kamera di sudut kiri atas.

Kita akan membuat salinan jaring dan menempatkannya di sekitar area permainan. Tekan ( pada macOS) untuk menduplikasi simpul. Anda juga dapat mengklik kanan simpul di dock Scene dan memilih Duplicate . Pindahkan salinan ke bawah sepanjang sumbu Z biru hingga berada tepat di luar pratinjau kamera.Ctrl + DCmd + D
Pilih kedua silinder dengan menekan Shifttombol dan mengklik yang tidak dipilih lalu duplikatnya.

Pindahkan ke kanan dengan menyeret sumbu X merah.

Agak sulit untuk melihatnya dalam warna putih, bukan? Mari kita buat mereka menonjol dengan memberi mereka material baru.
Dalam 3D, material menentukan sifat visual suatu permukaan seperti warnanya, bagaimana permukaan tersebut memantulkan cahaya, dan banyak lagi. Kita dapat menggunakannya untuk mengubah warna jaring.
Kita dapat memperbarui keempat silinder sekaligus. Pilih semua contoh mesh di dock Scene . Untuk melakukannya, Anda dapat mengklik yang pertama dan Shift klik yang terakhir.

Di Inspektur , perluas bagian Material dan tetapkan StandardMaterial3D ke slot 0 .


Klik ikon bola untuk membuka sumber daya material. Anda akan mendapatkan pratinjau material dan daftar panjang bagian yang berisi properti. Anda dapat menggunakannya untuk membuat semua jenis permukaan, dari logam hingga batu atau air.
Luaskan bagian Albedo .

Atur warna menjadi sesuatu yang kontras dengan latar belakang, seperti jingga cerah.

Sekarang kita dapat menggunakan silinder sebagai panduan. Lipat silinder tersebut di dock Scene dengan mengeklik panah abu-abu di sebelahnya. Ke depannya, Anda juga dapat mengubah visibilitasnya dengan mengeklik ikon mata di sebelah Cylinders .

Tambahkan simpul anak Path3D ke Mainsimpul. Di bilah alat, empat ikon muncul. Klik alat Tambah Titik , ikon dengan tanda "+" berwarna hijau.

Catatan
Anda dapat mengarahkan kursor pada ikon mana saja untuk melihat keterangan alat yang menjelaskan alat tersebut.
Klik di bagian tengah setiap silinder untuk membuat titik. Kemudian, klik ikon Tutup Kurva di bilah alat untuk menutup jalur. Jika ada titik yang sedikit menyimpang, Anda dapat mengeklik dan menyeretnya untuk mengubah posisinya.

Jalur Anda akan terlihat seperti ini.

Untuk mengambil sampel posisi acak di atasnya, kita memerlukan simpul PathFollow3D . Tambahkan PathFollow3D sebagai anak dari Path3D. Ubah nama kedua simpul menjadi SpawnLocationdan SpawnPath, masing-masing. Ini lebih menggambarkan kegunaannya.

Dengan itu, kita siap untuk membuat kode mekanisme spawn.
Memunculkan monster secara acak
Klik kanan pada Mainnode tersebut dan lampirkan skrip baru ke dalamnya.
Pertama-tama kita mengekspor suatu variabel ke Inspektur sehingga kita dapat menetapkan mob.tscn monster lain ke dalamnya.
extends Node
@export var mob_scene: PackedSceneusing Godot;
public partial class Main : Node
{
// Don't forget to rebuild the project so the editor knows about the new export variable.
[Export]
public PackedScene MobScene { get; set; }
}Kita ingin memunculkan monster secara berkala. Untuk melakukannya, kita perlu kembali ke adegan dan menambahkan pengatur waktu. Namun, sebelum itu, kita perlu menetapkan file mob.tscnke mob_sceneproperti di atas (jika tidak, nilainya akan null!)
Kembali ke layar 3D dan pilih Mainnode. Seret mob.tscndari dok FileSystem ke slot Mob Scene di Inspector .

Tambahkan simpul Timer baru sebagai anak dari Main. Beri nama MobTimer.

Pada Inspector , atur Wait Time ke 0.5detik dan aktifkan Autostart agar otomatis berjalan saat game dijalankan.

Timer memancarkan timeoutsinyal setiap kali mencapai akhir Waktu Tunggu . Secara default, timer akan memulai ulang secara otomatis, memancarkan sinyal dalam satu siklus. Kita dapat terhubung ke sinyal ini dari node Utama untuk memunculkan monster setiap 0.5detik.
Dengan MobTimer masih dipilih, arahkan ke dok Node di sebelah kanan, dan klik dua kali timeoutsinyal tersebut.

Hubungkan ke simpul Utama .

Ini akan membawa Anda kembali ke skrip, dengan _on_mob_timer_timeout()fungsi kosong baru.
Mari kita buat kode logika pembentukan massa. Kita akan:
Buatlah contoh adegan massa.
Ambil sampel posisi acak pada jalur spawn.
Dapatkan posisi pemain.
Panggil metode massa
initialize(), berikan posisi acak dan posisi pemain.Tambahkan massa sebagai anak dari simpul Utama .
func _on_mob_timer_timeout(): # Create a new instance of the Mob scene. var mob = mob_scene.instantiate()
# Choose a random location on the SpawnPath. # We store the reference to the SpawnLocation node. var mob_spawn_location = get_node("SpawnPath/SpawnLocation") # And give it a random offset. mob_spawn_location.progress_ratio = randf()
var player_position = $Player.position mob.initialize(mob_spawn_location.position, player_position)
# Spawn the mob by adding it to the Main scene. add_child(mob)// We also specified this function name in PascalCase in the editor's connection window.private void OnMobTimerTimeout(){ // Create a new instance of the Mob scene. Mob mob = MobScene.Instantiate<Mob>();
// Choose a random location on the SpawnPath. // We store the reference to the SpawnLocation node. var mobSpawnLocation = GetNode<PathFollow3D>("SpawnPath/SpawnLocation"); // And give it a random offset. mobSpawnLocation.ProgressRatio = GD.Randf();
Vector3 playerPosition = GetNode<Player>("Player").Position; mob.Initialize(mobSpawnLocation.Position, playerPosition);
// Spawn the mob by adding it to the Main scene. AddChild(mob);}Di atas, randf()menghasilkan nilai acak antara 0dan 1, yang merupakan nilai yang diharapkan oleh simpul PathFollowprogress_ratio : 0 adalah awal jalur, 1 adalah akhir jalur. Jalur yang telah kita tetapkan berada di sekitar area pandang kamera, jadi nilai acak apa pun antara 0 dan 1 adalah posisi acak di sepanjang tepi area pandang!
Perhatikan bahwa jika Anda menghapus Playerdari adegan utama, baris berikut
var player_position = $Player.position
Vector3 playerPosition = GetNode<Player>("Player").Position;memberikan kesalahan karena tidak ada $Player!
Berikut main.gdnaskah lengkap sejauh ini, sebagai referensi.
extends Node
@export var mob_scene: PackedScene
func _on_mob_timer_timeout(): # Create a new instance of the Mob scene. var mob = mob_scene.instantiate()
# Choose a random location on the SpawnPath. # We store the reference to the SpawnLocation node. var mob_spawn_location = get_node("SpawnPath/SpawnLocation") # And give it a random offset. mob_spawn_location.progress_ratio = randf()
var player_position = $Player.position mob.initialize(mob_spawn_location.position, player_position)
# Spawn the mob by adding it to the Main scene. add_child(mob)using Godot;
public partial class Main : Node{ [Export] public PackedScene MobScene { get; set; }
private void OnMobTimerTimeout() { // Create a new instance of the Mob scene. Mob mob = MobScene.Instantiate<Mob>();
// Choose a random location on the SpawnPath. // We store the reference to the SpawnLocation node. var mobSpawnLocation = GetNode<PathFollow3D>("SpawnPath/SpawnLocation"); // And give it a random offset. mobSpawnLocation.ProgressRatio = GD.Randf();
Vector3 playerPosition = GetNode<Player>("Player").Position; mob.Initialize(mobSpawnLocation.Position, playerPosition);
// Spawn the mob by adding it to the Main scene. AddChild(mob); }}Anda dapat menguji adegan tersebut dengan menekan F6. Anda akan melihat monster muncul dan bergerak dalam garis lurus.

Untuk saat ini, mereka saling bertabrakan dan bergeser saat jalan mereka bersilangan. Kita akan membahasnya di bagian selanjutnya.


Tidak ada komentar:
Posting Komentar