Generowanie modeli

*Ta zawartość została przetłumaczona przy użyciu narzędzi AI (w wersji beta) i może zawierać błędy. Aby wyświetlić tę stronę w języku angielskim, kliknij tutaj.

Dzięki promptom tekstowym i wstępnie zdefiniowanym schematom możesz (a także gracze w doświadczeniu) generować zarówno statyczne zasoby 3D, jak i w pełni funkcjonalne modele, takie jak pojazdy, które jeżdżą, samoloty, które latają, i broń, która strzela. Ten przewodnik pokazuje, jak korzystać z GenerateModelAsync() jako części dynamicznego, opartego na graczach doświadczenia twórczego.

Przegląd

GenerateModelAsync() umożliwia generowanie geometrii wielomeshowej z następującymi zaletami:

  • Zapewniony schemat określa, jak wygenerowana geometria będzie podzielona na części.
  • Każdy obiekt wygenerowany w doświadczeniu zostanie zreplikowany i będzie widoczny dla wszystkich graczy, pozwalając im budować razem w czasie rzeczywistym.
  • Wygenerowane siatki mają wyższa jakość wizualną z lepszymi ogólnymi kształtami, sylwetkami, większą ilością detali i mniejszą ilością artefaktów. Wygenerowane tekstury są bardziej spójne i szczegółowe, z mniejszą ziarnistością i mniej wyraźnym podświetleniem.
  • Czas generacji ma mniejsze opóźnienia, co umożliwia szybsze i bardziej responsywne tworzenie w doświadczeniach.
  • Ty oraz gracze w trakcie gry możecie określać pudełka ograniczające, aby zasugerować rozmiar i proporcje wygenerowanego modelu.
  • Opcjonalny maksymalny liczba trójkątów utrzymuje wydajność generowanych obiektów w twoim doświadczeniu.

Generowanie oparte na schemacie

Aby stworzyć artykułowane, funkcjonalne obiekty, wygenerowana geometria musi być oddzielona na wiele MeshParts. Na przykład, aby stworzyć samochód, którym można jeździć, z kołami, które się kręcą i skręcają, potrzebne są przynajmniej pięć MeshParts: jeden dla nadwozia samochodu i cztery dla każdego koła samochodu. GenerateModelAsync() osiąga to dzięki schematowi, który wypisuje części do wygenerowania, co pokazuje poniższy fragment kodu:

Skrypt w ServerScriptService

local GenerationService = game:GetService("GenerationService")
local Workspace = game:GetService("Workspace")
-- Ustal dane wejściowe dla wygenerowanej geometrii
local inputs = {
TextPrompt = "zielony samochód smoczy z 4 kołami"
}
-- Ustal schemat na wstępnie zdefiniowane nadwozie samochodu
local schema = {
PredefinedSchema = "Car5"
}
-- Wykonaj wywołanie generowania modelu
local success, result, metadata = pcall(function()
return GenerationService:GenerateModelAsync(inputs, schema)
end)
if success then
-- Dopasuj model do docelowego rozmiaru i umieść go w pobliżu środka świata
local targetSize = 16
local modelSize = result:GetExtentsSize()
local scaleFactor = targetSize / math.max(modelSize.X, modelSize.Y, modelSize.Z)
result:ScaleTo(scaleFactor)
result:PivotTo(CFrame.new(0, result:GetExtentsSize().Y / 2, -40))
-- Zakotwicz wszystkie części, aby siatki się nie rozwaliły
for _, descendant in result:GetDescendants() do
if descendant:IsA("BasePart") then
descendant.Anchored = true
end
end
-- Nazwij model i przypisz go do przestrzeni roboczej
result.Name = "PodstawowaGeneracjaSmoczegoSamochodu"
result.Parent = Workspace
else
warn(result)
end

Poniższy obrazek przedstawia oczekiwany wynik oraz jego budowę, tak jak pojawia się w hierarchii Explorer:

Skrypty do ponownego użycia

W Robloxie zachowania zazwyczaj obejmują skrypty, załączniki, ograniczenia oraz inne typy instancji dołączone do statycznych geometrii teksturowanych, aby uczynić je funkcyjnymi. Ponieważ GenerateModelAsync() generuje szeroki wachlarz geometrii na bieżąco, skrypty do ponownego użycia muszą być dołączone, aby automatycznie dostosować zachowania do oczekiwanej funkcjonalności.

Na przykład, rozważ doświadczenie, w którym gracze mogą stworzyć własne pojazdy. GenerateModelAsync() przyjmuje prompt gracza i generuje pięć oddzielnych siatek (nadwozie i cztery koła) za pomocą schematu Car5 schema. Następnie wstępnie zdefiniowany skrypt do ponownego użycia dostosowuje jego zachowanie jazdy do rozmiaru i kształtu modelu, aby upewnić się, że samochód jest zdatny do jazdy, a jego koła kręcą się w realistyczny sposób.

Aby przetestować skrypty do ponownego użycia:

  1. Pobierz plik Behaviors.rbxm.

  2. W hierarchii Explorer w Studio kliknij prawym przyciskiem myszy ReplicatedStorage, wybierz Wstaw ⟩ Importuj model RBX, a następnie wybierz pobrany plik. Model zostanie rozpakowany do kilku folderów.

  3. Skopiuj i wklej jeden z poniższych fragmentów kodu do serwera Script w ServerScriptService, w zależności od typu obiektu, który chcesz wygenerować.

    Ten przykład generuje funkcjonalny samochód z hamulcem, wspomaganiem nitro, efektami dźwiękowymi i wizualnymi oraz prędkościomierzem na ekranie.

    Skrypt w ServerScriptService

    local GenerationService = game:GetService("GenerationService")
    local ReplicatedStorage = game:GetService("ReplicatedStorage")
    local Workspace = game:GetService("Workspace")
    -- Ustal dane wejściowe dla wygenerowanej geometrii
    local inputs = {
    TextPrompt = "zielony samochód smoczy z 4 kołami"
    }
    -- Ustal schemat na wstępnie zdefiniowane nadwozie samochodu
    local schema = {
    PredefinedSchema = "Car5"
    }
    -- Wykonaj wywołanie generowania modelu
    local success, result, metadata = pcall(function()
    return GenerationService:GenerateModelAsync(inputs, schema)
    end)
    if success then
    -- Dopasuj model do docelowego rozmiaru
    local targetSize = 16
    local modelSize = result:GetExtentsSize()
    local scaleFactor = targetSize / math.max(modelSize.X, modelSize.Y, modelSize.Z)
    result:ScaleTo(scaleFactor)
    -- Załaduj moduł "makeFunctional" dla "CarBehavior"
    local makeFunctional = require(ReplicatedStorage.Behaviors.CarBehavior.makeFunctional)
    -- Odwołaj się do części samochodu po nazwach gwarantowanych przez schemat "Car5"
    local body = result:FindFirstChild("body")
    local frontLeftWheel = result:FindFirstChild("front left wheel")
    local frontRightWheel = result:FindFirstChild("front right wheel")
    local rearLeftWheel = result:FindFirstChild("rear left wheel")
    local rearRightWheel = result:FindFirstChild("rear right wheel")
    -- Ustaw parametry konfiguracyjne zachowania
    local config = {
    seatPosition = "inside",
    invisibleWhenSeated = false
    }
    -- Dołącz zachowanie przez skrypt "makeFunctional"
    local functionalModel = makeFunctional(result, frontLeftWheel, frontRightWheel, rearLeftWheel, rearRightWheel, body, config)
    -- Umieść model w pobliżu środka świata
    functionalModel:PivotTo(CFrame.new(0, functionalModel:GetExtentsSize().Y / 2, -40))
    functionalModel.Name = "PodstawowaGeneracjaSmoczegoSamochodu"
    functionalModel.Parent = Workspace
    else
    warn(result)
    end
©2026 Roblox Corporation. Nazwa Roblox, logo Roblox oraz hasło „Powering Imagination” należą do naszych zarejestrowanych i niezarejestrowanych znaków towarowych na terenie Stanów Zjednoczonych oraz w innych krajach.