ADS

Cara Men Spawn Monster Di Godot

 

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.

gambar0

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 .

gambar1

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.

gambar2

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

gambar3

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

gambar4

Di Inspektur , tetapkan CylinderMesh ke properti Mesh .

gambar5

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

gambar6

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

gambar7

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.

gambar8

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

gambar9

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.

gambar10

Pindahkan ke kanan dengan menyeret sumbu X merah.

gambar11

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.

gambar12

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

gambar13

../../_images/standard_material.webp

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 .

../../_images/albedo_section.webp

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

gambar14

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 .

gambar15

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

gambar16

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.

gambar17

Jalur Anda akan terlihat seperti ini.

gambar18

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.

gambar19

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: PackedScene

using 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 .

gambar20

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

gambar21

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

gambar22

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.

gambar23

Hubungkan ke simpul Utama .

gambar24

Ini akan membawa Anda kembali ke skrip, dengan _on_mob_timer_timeout()fungsi kosong baru.

Mari kita buat kode logika pembentukan massa. Kita akan:

  1. Buatlah contoh adegan massa.

  2. Ambil sampel posisi acak pada jalur spawn.

  3. Dapatkan posisi pemain.

  4. Panggil metode massa initialize(), berikan posisi acak dan posisi pemain.

  5. 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.

gambar25

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


Tidak ada komentar:

Posting Komentar