Lua Academy · Oppitunti

Komponenttipohjainen skriptaus

Suunnitelkaa pelientiteetit Lua-taulukoina, joiden toiminnallisuus koostuu komponenteista.

Oppitunti 2/413 vaihetta

Komponenttipohjainen skriptaus on ilmainen Lua Academy-oppitunti CoddyKitissä. Tämä on oppitunti 2/4. Voit lukea tästä oppimispolusta kokonaan mitkä tahansa 3 oppituntia ilmaiseksi — sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä käytännön harjoittelun sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Oppitunti kuuluu Lua Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Lua Academy-kurssilla on yhteensä 4 oppituntia.

Mitä komponenttipohjainen suunnittelu on?

Syvien luokkahierarkioiden sijaan entiteetit koostetaan komponenteista — pienistä ja tarkasti rajatuista dataa ja toimintaa sisältävistä taulukoista. Entiteetti on vain komponenttien kokoelma.

Entiteetti taulukkona

Entiteetti on taulukko, jolla on id ja components-alitaulukko. Komponentteja lisätään ja poistetaan ajon aikana.

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

Komponenttien lisääminen

Liitä komponentti määrittämällä nimetty avain komponenttitaulukkoon.

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

Järjestelmät käsittelevät komponentteja

Järjestelmä käsittelee kaikkia entiteettejä, joilla on vaadittu komponenttijoukko. Järjestelmät käyvät entiteetit läpi ja päivittävät komponenttien dataa.

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

Komponenttiskriptit

Liitä Lua-funktioita komponentin toiminnaksi — tämä on yksinkertainen tapa skriptata entiteettikohtaista toimintaa.

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

Komponenttirekisteri

Rekisteri yhdistää komponenttityyppien nimet tehdasfunktioihin, jolloin komponentteja voidaan luoda nimen perusteella, esimerkiksi kenttätiedostosta.

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

Komponenttien poistaminen

Aseta komponentin arvoksi nil poistaaksesi sen. Tämän jälkeen järjestelmät, jotka vaativat kyseisen komponentin, ohittavat entiteetin.

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

World- ja entiteettienhallinta

World-objekti tallentaa kaikki entiteetit ja järjestelmät, käy järjestelmät läpi jokaisella tikillä ja tarjoaa entiteettien kyselyrajapinnat.

Entiteettien kysely komponentin perusteella

Toteuta kyselyfunktio, joka palauttaa kaikki entiteetit, joilla on kaikki määritetyt komponentit.

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

Esimuodostetut objektit

Prefab on komponenttien mallitaulukko. Luo siitä uusia entiteettejä kopioimalla malli syväkopioinnilla.

Periytymisen edut

  • Ei syviä hierarkioita.
  • Toiminta voidaan yhdistää ajon aikana.
  • Ominaisuuksia on helppo lisätä ja poistaa.
  • Toiminta perustuu määritystiedostojen dataan.

Komponenttisuunnittelua koskeva kysymys

Mitä System tekee komponenttipohjaisessa suunnittelussa?

Kertaus: komponenttipohjainen skriptaus

Entiteetit ovat komponenttien taulukoita. Järjestelmät käsittelevät entiteettejä, joilla on vaaditut komponentit. Tämä löyhästi kytketty ja dataohjautuva arkkitehtuuri on joustavampi kuin syvät periytymishierarkiat ja toimii luontevasti Luassa.

Aloita maksutta

Opi Lua tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
40
Oppitunnit
159

Usein kysytyt kysymykset

Onko oppitunti ”Komponenttipohjainen skriptaus” ilmainen?

Kyllä — voit lukea täällä verkossa kokonaan ilmaiseksi mitkä tahansa Lua Academy-oppimispolun 3 oppituntia, myös oppitunnin “Komponenttipohjainen skriptaus”. Sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä interaktiiviset harjoitukset sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Lua Academy-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”Komponenttipohjainen skriptaus”?

Suunnitelkaa pelientiteetit Lua-taulukoina, joiden toiminnallisuus koostuu komponenteista. Harjoittelet Lua Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni Lua Academy-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin Lua Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 2/4.

Kuinka kauan ”Komponenttipohjainen skriptaus”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä Lua Academy-oppitunnilla?

Kyllä. Jokainen Lua Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. Tapahtumajärjestelmät Luassa
  2. Komponenttipohjainen skriptaus
  3. Tekoälyn käyttäytyminen tilakoneilla
  4. Tietopohjainen määritys ja hot reload
← Takaisin: Lua Academy