สร้างและเคลื่อนย้ายเอนทิตี
นำสิ่งต่าง ๆ ไปแสดงบนหน้าจอ
สร้างและเคลื่อนย้ายเอนทิตี เป็นบทเรียน Learn Rust Coding ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Learn Rust Coding และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Learn Rust Coding มีบทเรียนทั้งหมด 4 บทเรียน
Commands: การสร้างที่เลื่อนเวลา
คุณไม่สามารถแก้ไข World โดยตรงขณะที่ระบบทำงานแบบขนานได้ แต่ให้เข้าคิวการเปลี่ยนแปลงเชิงโครงสร้างผ่าน Commands แทน
การสร้าง การลบ และการเพิ่มคอมโพเนนต์จะถูกบันทึกไว้ แล้วนำไปใช้เมื่อจบช่วงของกำหนดการ เพื่อให้การเข้าถึงปลอดภัย
fn setup(mut commands: Commands) {
commands.spawn_empty();
}การสร้างด้วย Bundle
Bundle คือกลุ่มคอมโพเนนต์ที่แทรกเข้าด้วยกัน Bundle ที่ง่ายที่สุดคือทูเพิลของคอมโพเนนต์
Bevy จะถือว่าองค์ประกอบแต่ละตัวของทูเพิลเป็นคอมโพเนนต์ที่ต้องแนบ ดังนั้นการเรียกสร้างเพียงครั้งเดียวก็สามารถมอบข้อมูลเริ่มต้นทั้งหมดให้เอนทิตีได้
fn setup(mut commands: Commands) {
commands.spawn((
Position { x: 0.0, y: 0.0 },
Velocity { x: 1.5, y: 0.0 },
Player,
));
}มองเห็นด้วยกล้อง
จะไม่มีอะไรถูกเรนเดอร์หากไม่มีกล้อง สำหรับเกม 2D ให้สร้าง Camera2d ในระบบเริ่มต้น
กล้องเองก็เป็นเอนทิตีที่มีคอมโพเนนต์กล้องเช่นกัน ซึ่งเป็นอีกตัวอย่างหนึ่งของความสม่ำเสมอแบบ ECS ทุกอย่างในฉากคือเอนทิตี
fn setup(mut commands: Commands) {
commands.spawn(Camera2d::default());
}การสร้างสไปรต์
หากต้องการวาดบางสิ่ง ให้เอนทิตีมี Sprite และ Transform โดย Transform จะเก็บตำแหน่ง การหมุน และมาตราส่วนในพื้นที่โลก
สไปรต์สีไม่จำเป็นต้องใช้ทรัพยากรรูปภาพ จึงเหมาะสำหรับสร้างต้นแบบการเคลื่อนที่ก่อนนำเข้าภาพประกอบ
commands.spawn((
Sprite::from_color(Color::srgb(0.2, 0.7, 1.0), Vec2::new(40.0, 40.0)),
Transform::from_xyz(0.0, 0.0, 0.0),
Velocity { x: 80.0, y: 0.0 },
));Transform กับ Position แบบกำหนดเอง
ในเกม Bevy จริง โดยทั่วไปคุณจะย้าย Transform ที่มีมาให้แทน Position แบบกำหนดเอง เพราะการเรนเดอร์อ่าน Transform โดยตรง
ค่าการเลื่อนตำแหน่งคือ Vec3 สำหรับ 2D ให้เปลี่ยนค่า x และ y และเก็บ z ไว้กำหนดลำดับการวาด
#[derive(Component)]
struct Velocity { x: f32, y: f32 }
fn apply_velocity(mut q: Query<(&mut Transform, &Velocity)>) {
for (mut tf, vel) in &mut q {
tf.translation.x += vel.x;
tf.translation.y += vel.y;
}
}การวนซ้ำคิวรีแบบแก้ไขได้
หากต้องการเปลี่ยนข้อมูลคอมโพเนนต์ ให้ขอ &mut T แล้ววนซ้ำผ่าน &mut query แต่ละรายการจะให้การอ้างอิงที่แก้ไขได้
Bevy รับประกันว่าจะไม่มีสองระบบถือการเข้าถึงแบบแก้ไขที่ขัดแย้งกันพร้อมกัน ดังนั้นลูปนี้จึงปลอดภัยแม้ขณะที่ระบบอื่นกำลังทำงาน
fn move_all(mut q: Query<&mut Transform, With<Player>>) {
for mut tf in &mut q {
tf.translation.x += 1.0;
}
}การสร้างเอนทิตีจำนวนมาก
ลูปช่วยให้คุณเติมข้อมูลในด่านได้ เรียก spawn ภายในลูป Rust for เพื่อสร้างตารางสิ่งกีดขวางหรือฝูงศัตรู
การวนซ้ำแต่ละครั้งจะเข้าคิวคำสั่งของตนเอง และคำสั่งทั้งหมดจะถูกนำไปใช้พร้อมกันที่ขอบเขตของช่วง
fn spawn_row(mut commands: Commands) {
for i in 0..5 {
commands.spawn((
Sprite::from_color(Color::WHITE, Vec2::splat(20.0)),
Transform::from_xyz(i as f32 * 30.0, 0.0, 0.0),
));
}
}การลบเอนทิตี
ลบเอนทิตีทั้งหมดด้วย commands.entity(id).despawn() การทำเช่นนี้จะคืนคอมโพเนนต์และนำดัชนีเอนทิตีกลับมาใช้ใหม่
โดยทั่วไปคุณจะลบเอนทิตีจากระบบที่คิวรี ID Entity ของเอนทิตีนั้น เช่น กระสุนที่ออกนอกหน้าจอ
fn cleanup(mut commands: Commands, q: Query<(Entity, &Transform)>) {
for (e, tf) in &q {
if tf.translation.y > 600.0 {
commands.entity(e).despawn();
}
}
}การเพิ่มคอมโพเนนต์ภายหลัง
คุณสามารถแนบคอมโพเนนต์ใหม่ให้เอนทิตีที่มีอยู่ขณะรันไทม์ผ่าน insert วิธีนี้ใช้มอบแท็ก Shield ให้ผู้เล่นที่ได้รับพลังเพิ่ม
การนำออกทำในลักษณะเดียวกันด้วย remove::<T>() ทั้งสองอย่างเป็นการเปลี่ยนแปลงเชิงโครงสร้าง จึงต้องทำผ่าน Commands
commands.entity(player).insert(Shield { hits: 3 });
// later
commands.entity(player).remove::<Shield>();Z สำหรับการจัดเลเยอร์
ใน 2D ค่า z ของการเลื่อนตำแหน่งใน Transform จะกำหนดลำดับการวาด ค่า z ที่สูงกว่าจะถูกเรนเดอร์ทับอยู่ด้านบน
กำหนดค่า z ให้ฉากหลังต่ำ และให้ผู้เล่นสูงกว่า เพื่อไม่ให้สไปรต์หายไปหลังฉาก
// background behind, player in front
commands.spawn((bg_sprite, Transform::from_xyz(0.0, 0.0, 0.0)));
commands.spawn((player_sprite, Transform::from_xyz(0.0, 0.0, 10.0)));การเชื่อมการทำงานเข้าด้วยกัน
สร้างใน Startup และเคลื่อนที่ใน Update ระบบเริ่มต้นจะสร้างกล้องและเอนทิตีเพียงครั้งเดียว ส่วนระบบอัปเดตจะขยับสิ่งเหล่านั้นทุกเฟรม
การแยกเช่นนี้ช่วยให้การเริ่มต้นไม่ปะปนอยู่ในเส้นทางการทำงานหลักของแต่ละเฟรม
App::new()
.add_plugins(DefaultPlugins)
.add_systems(Startup, setup)
.add_systems(Update, apply_velocity)
.run();ตรวจสอบความเข้าใจ
ลองคิดดูว่าการเปลี่ยนแปลงเชิงโครงสร้างถูกนำไปใช้อย่างไร
สรุป: การสร้างและการเคลื่อนที่
คุณสร้างเอนทิตีด้วย Bundle ผ่าน Commands เรนเดอร์ด้วย Sprite และ Transform และทำให้เคลื่อนที่โดยแก้ไข Transform ในระบบ Update
การลบเอนทิตีและการแทรกคอมโพเนนต์ก็เป็นคำสั่งเช่นกัน ต่อไปเราจะทำให้การเคลื่อนที่ตอบสนองต่ออินพุตจากแป้นพิมพ์และเวลาที่ผ่านไปจริง
คำถามที่พบบ่อย
บทเรียน “สร้างและเคลื่อนย้ายเอนทิตี” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “สร้างและเคลื่อนย้ายเอนทิตี” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Learn Rust Coding ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Learn Rust Coding มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “สร้างและเคลื่อนย้ายเอนทิตี”
นำสิ่งต่าง ๆ ไปแสดงบนหน้าจอ คุณปฏิบัติ Learn Rust Coding ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Learn Rust Coding หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Learn Rust Coding บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน
บทเรียน “สร้างและเคลื่อนย้ายเอนทิตี” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Learn Rust Coding นี้ได้ไหม
ได้ บทเรียน Learn Rust Coding ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- แนวคิดแบบ ECS
- สร้างและเคลื่อนย้ายเอนทิตี
- จัดการข้อมูลนำเข้าและเวลา
- การชนและสถานะเกม