0Pricing
Lua Academy · บทเรียน

การเขียนสคริปต์แบบใช้คอมโพเนนต์

ออกแบบเอนทิตีเกมเป็นตารางที่มีคอมโพเนนต์พฤติกรรมใน Lua

การเขียนสคริปต์แบบใช้คอมโพเนนต์ เป็นบทเรียน Lua Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Lua Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Lua Academy มีบทเรียนทั้งหมด 4 บทเรียน

การออกแบบโดยใช้คอมโพเนนต์คืออะไร

แทนที่จะใช้ลำดับชั้นคลาสที่ซับซ้อน เอนทิตีจะประกอบขึ้นจากคอมโพเนนต์ ซึ่งเป็นตารางข้อมูลและพฤติกรรมขนาดเล็กที่มุ่งเน้นหน้าที่เฉพาะ เอนทิตีจึงเป็นเพียงชุดรวมของคอมโพเนนต์

เอนทิตีในรูปแบบตาราง

เอนทิตีคือตารางที่มี id และตารางย่อย components โดยสามารถเพิ่มและนำคอมโพเนนต์ออกได้ขณะโปรแกรมทำงาน

local function newEntity(id)
  return {id = id, components = {}}
end
local player = newEntity(1)

การเพิ่มคอมโพเนนต์

แนบคอมโพเนนต์โดยกำหนดคีย์ที่มีชื่อไว้ในตารางคอมโพเนนต์

player.components.position = {x=0, y=0}
player.components.health   = {hp=100, max=100}
player.components.sprite   = {image="player.png", scale=1}

ระบบประมวลผลคอมโพเนนต์

ระบบจะประมวลผลเอนทิตีทั้งหมดที่มีชุดคอมโพเนนต์ตามที่กำหนด ระบบจะวนดูเอนทิตีและอัปเดตข้อมูลของคอมโพเนนต์

local function moveSystem(entities, dt)
  for _, e in ipairs(entities) do
    local pos = e.components.position
    local vel = e.components.velocity
    if pos and vel then
      pos.x = pos.x + vel.dx * dt
      pos.y = pos.y + vel.dy * dt
    end
  end
end

สคริปต์คอมโพเนนต์

แนบฟังก์ชัน Lua เป็นพฤติกรรมของคอมโพเนนต์ ซึ่งเป็นรูปแบบง่าย ๆ ของการเขียนสคริปต์แยกตามเอนทิตี

player.components.ai = {
  update = function(self, entity, dt)
    -- move towards target
  end
}

รีจิสทรีคอมโพเนนต์

รีจิสทรีจะจับคู่ชื่อชนิดคอมโพเนนต์กับฟังก์ชันสร้าง ทำให้สามารถสร้างคอมโพเนนต์ด้วยชื่อได้ เช่น สร้างจากไฟล์ด่าน

local registry = {}
function registry.register(name, factory)
  registry[name] = factory
end
function registry.create(name, ...)
  return registry[name](...)
end

การนำคอมโพเนนต์ออก

กำหนดค่าให้คอมโพเนนต์เป็น nil เพื่อนำออก จากนั้นระบบจะไม่สนใจเอนทิตีนั้นเมื่อระบบต้องใช้คอมโพเนนต์ดังกล่าว

player.components.health = nil  -- entity is "dead"

ตัวจัดการโลกและเอนทิตี

ออบเจกต์ World จัดเก็บเอนทิตีและระบบทั้งหมด วนประมวลผลระบบในแต่ละจังหวะ และจัดเตรียม API สำหรับค้นหาเอนทิตี

การค้นหาเอนทิตีตามคอมโพเนนต์

จัดเตรียมฟังก์ชันค้นหาที่ส่งคืนเอนทิตีทั้งหมดซึ่งมีคอมโพเนนต์ที่ระบุครบทุกตัว

local function query(world, ...)
  local required = {...}
  local result = {}
  for _, e in ipairs(world.entities) do
    local ok = true
    for _, comp in ipairs(required) do
      if not e.components[comp] then ok = false; break end
    end
    if ok then result[#result+1] = e end
  end
  return result
end

พรีแฟบ

พรีแฟบคือตารางต้นแบบของคอมโพเนนต์ ให้สร้างเอนทิตีใหม่จากพรีแฟบด้วยการคัดลอกต้นแบบแบบลึก

ข้อดีเมื่อเทียบกับการสืบทอด

  • ไม่มีลำดับชั้นที่ซับซ้อน
  • ผสมพฤติกรรมได้ขณะโปรแกรมทำงาน
  • เพิ่มหรือนำความสามารถออกได้ง่าย
  • ขับเคลื่อนด้วยข้อมูลจากไฟล์การตั้งค่า

คำถามเกี่ยวกับการออกแบบคอมโพเนนต์

ในการออกแบบโดยใช้คอมโพเนนต์ ระบบทำหน้าที่อะไร

ทบทวน: การเขียนสคริปต์โดยใช้คอมโพเนนต์

เอนทิตีคือตารางของคอมโพเนนต์ ระบบจะประมวลผลเอนทิตีที่มีคอมโพเนนต์ตามที่กำหนด สถาปัตยกรรมที่แยกส่วนและขับเคลื่อนด้วยข้อมูลนี้ยืดหยุ่นกว่าลำดับชั้นการสืบทอดที่ซับซ้อน และทำงานร่วมกับ Lua ได้อย่างเป็นธรรมชาติ

คำถามที่พบบ่อย

บทเรียน “การเขียนสคริปต์แบบใช้คอมโพเนนต์” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “การเขียนสคริปต์แบบใช้คอมโพเนนต์” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Lua Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Lua Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “การเขียนสคริปต์แบบใช้คอมโพเนนต์”

ออกแบบเอนทิตีเกมเป็นตารางที่มีคอมโพเนนต์พฤติกรรมใน Lua คุณปฏิบัติ Lua Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Lua Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Lua Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน

บทเรียน “การเขียนสคริปต์แบบใช้คอมโพเนนต์” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Lua Academy นี้ได้ไหม

ได้ บทเรียน Lua Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. ระบบเหตุการณ์ใน Lua
  2. การเขียนสคริปต์แบบใช้คอมโพเนนต์
  3. พฤติกรรมของปัญญาประดิษฐ์ด้วยเครื่องจักรสถานะ
  4. การกำหนดค่าและโหลดใหม่แบบขับเคลื่อนด้วยข้อมูล
← กลับไปที่ Lua Academy