Zbudowanie biblioteki zasobów to proces importowania i konfigurowania zbioru zasobów w centralnej lokalizacji w twojej grze, aby ułatwić dostęp i ponowne wykorzystanie. Proces ten może zaoszczędzić ci znaczną ilość czasu podczas przygotowywania do budowy swojego środowiska, zwłaszcza jeśli skonfigurujesz wartości każdego zasobu, aby poprawić wydajność i zoptymalizować wykorzystanie pamięci na urządzeniach średniej i niskiej klasy.
Korzystając z pliku Environment Art - Zbudowanie .rbxl jako odniesienia, ta sekcja programu nauczania dotyczącego sztuki środowiskowej pokazuje, jak zbudować bibliotekę zasobów z twoich dopracowanych zasobów, w tym instrukcje krok po kroku dotyczące:
- Tworzenia niestandardowych materiałów dla twojego terenu z twoich tekstur kafelkowych.
- Tworzenia obiektów SurfaceAppearance dla twojego arkusza wykończeniowego i stosowania ich do rozłożonych siatek w twojej bibliotece zasobów.
- Ustawiania parametrów renderowania dla twoich zasobów, aby zapewnić optymalną wydajność na wszystkich urządzeniach.
- Konwertowania twoich zasobów na pakiety, aby móc je aktualizować i ponownie wykorzystywać we wszystkich swoich projektach.
Po ukończeniu tej sekcji nauczysz się, jak wykorzystywać swoją bibliotekę zasobów w kreatywny sposób, aby zastąpić lub przekształcić środowisko w szarościach i dodać ostatnie szlify, które poprawią ogólną przestrzeń 3D.

Tworzenie niestandardowych materiałów
Studio reprezentuje niestandardowe materiały jako obiekty MaterialVariant w MaterialService. Te obiekty MaterialVariant mają cztery właściwości, które łączą cztery kafelkowe mapy tekstur, aby stworzyć wysokiej jakości niestandardowy materiał o cechach fizycznych:
- MaterialVariant.ColorMap – Reprezentuje mapę tekstury albedo.
- MaterialVariant.MetalnessMap – Reprezentuje mapę tekstury metaliczności.
- MaterialVariant.NormalMap – Reprezentuje mapę tekstury normalnej.
- MaterialVariant.RoughnessMap – Reprezentuje mapę tekstury chropowatości.
Po dostarczeniu map tekstur do tych właściwości, możesz zastosować swój nowy niestandardowy materiał do części, siatek i terenu. Możesz użyć lub zmodyfikować przykładowe pliki map tekstur .png, aby stworzyć materiały Lumpy Moss, Flowering Lumpy Moss, Lumpy Moss with Stones i Stones w końcowym przykładowym środowisku laser tag, lub możesz użyć własnych, które zaprojektowałeś w poprzedniej sekcji samouczka.
Aby stworzyć obiekty MaterialVariant dla swoich kafelkowych tekstur:
Z menu Okno ⟩ 3D wybierz Materiał, aby otworzyć Menadżera Materiałów.
W liście Materiały wybierz materiał bazowy, który najbardziej odpowiada twojej kafelkowej teksturze. Na przykład, jeśli tworzysz obiekt MaterialVariant dla tekstury Lumpy Moss, wybierz domyślny materiał gruntowy, aby materiał odziedziczył jego właściwości fizyczne.
W górnym pasku narzędzi kliknij ikonę ⊕. Nowy MaterialVariant wyświetli się w palecie z ikoną w prawym dolnym rogu, która wskazuje, że jest to niestandardowy materiał.

W sekcji Inspektor przejdź do sekcji Ogólne, a następnie zmień nazwę materiału, aby odpowiadała nazwie twojej kafelkowej tekstury.

W sekcji Mapy tekstur, po prawej stronie Koloru, kliknij przycisk Importuj. Wyświetli się przeglądarka plików.

W przeglądarce plików wybierz plik mapy tekstury Albedo .png dla odpowiadającej kafelkowej tekstury, a następnie przycisk Otwórz. Przeglądarka plików zamyka się, a nowa mapa kolorów wyświetla się z jej identyfikatorem zasobu.
Powtórz ten proces dla map tekstur Metalness, Normal i Roughness. Niestandardowy materiał aktualizuje się, aby odzwierciedlić mapy tekstur.


W sekcji Nadpisania włącz przełącznik Ustaw jako nadpisanie, aby upewnić się, że gdy zastosujesz grunt do swojego terenu, Studio użyje tego niestandardowego materiału.

- OPCJONALNEJeśli tworzysz niestandardowy materiał, który reprezentuje materiał organiczny,
- W sekcji Tiling kliknij rozwijane menu Wzór.
- Wybierz Organiczny, aby zrandomizować wynik i zredukować widoczne kafelkowanie.

Powtórz ten proces dla każdej kafelkowej tekstury, którą chcesz uwzględnić w swojej grze.
Tworzenie pakietów SurfaceAppearance
Studio wykorzystuje arkusze wykończeniowe w obiektach SurfaceAppearance, które możesz przypisać do MeshParts, które zawierają dane UV. Podobnie jak w przypadku niestandardowych materiałów, obiekty SurfaceAppearance mają cztery właściwości, które łączą cztery mapy tekstur arkusza wykończeniowego, aby stworzyć wysokiej jakości 3D wizualne wykończenie powierzchni:
SurfaceAppearance.ColorMap – Reprezentuje mapę tekstury albedo.
SurfaceAppearance.MetalnessMap – Reprezentuje mapę tekstury metaliczności.
SurfaceAppearance.NormalMap – Reprezentuje mapę tekstury normalnej.
SurfaceAppearance.RoughnessMap – Reprezentuje mapę tekstury chropowatości.
Po dostarczeniu map tekstur do tych właściwości, możesz uczynić obiekt SurfaceAppearance dzieckiem MeshPart z danymi UV, które mapują do twojego arkusza wykończeniowego, a dane UV automatycznie stosują się do macierzystej siatki. Z tego powodu przydatne jest uczynienie obiektu SurfaceAppearance pakietem, aby móc ponownie wykorzystywać ten sam obiekt SurfaceAppearance we wszystkich swoich zasobach modułowych i rekwizytach. Na przykład, poniższe siatki mają wszystkie dane UV, które mapują do tego samego układu arkusza wykończeniowego, który jest reprezentowany w ramach jednego pakietu obiektu SurfaceAppearance.

Możesz użyć lub zmodyfikować przykładowe pliki map tekstur .png, aby stworzyć obiekt SurfaceAppearance, który respektuje dane UV dla przykładowych zasobów modułowych i rekwizytów w końcowym przykładowym środowisku laser tag, lub możesz użyć własnych, które zaprojektowałeś w poprzedniej sekcji samouczka, które stosują się do twoich własnych zasobów modułowych i rekwizytów.
Aby stworzyć pakiety SurfaceAppearance, które możesz przypisać do swojego modułowego zestawu i rekwizytów:
Wstaw obiekt SurfaceAppearance do Workspace.
Wybierz obiekt SurfaceAppearance, a następnie w oknie Właściwości wybierz właściwość ColorMap. Wyświetli się okno podręczne.
Kliknij przycisk Dodaj obraz…. Wyświetli się przeglądarka plików.

Wybierz mapę tekstury Albedo dla odpowiadającej kafelkowej tekstury, a następnie przycisk Otwórz. Przeglądarka plików zamyka się, a właściwość ColorMap aktualizuje się z nowym identyfikatorem zasobu.
Powtórz ten proces dla właściwości MetalnessMap, NormalMap i RoughnessMap, wybierając ich odpowiednie mapy tekstur z przeglądarki plików.
W oknie Eksplorator kliknij prawym przyciskiem myszy obiekt SurfaceAppearance, a następnie wybierz Konwertuj na pakiet z menu kontekstowego. Wyświetli się okno dialogowe Konwertuj na pakiet.
Wypełnij pola Tytuł i Opis, ustaw własność na siebie lub grupę, a następnie kliknij przycisk Wyślij. Po zakończeniu nad ikoną obiektu SurfaceAppearance wyświetli się symbol łańcucha, aby zidentyfikować go jako pakiet.

- OPCJONALNEWybierz obiekt dziecka PackageLink obiektu SurfaceAppearance, a następnie w oknie Właściwości włącz AutoUpdate, aby automatycznie aktualizować pakiet, jeśli wprowadzisz jakiekolwiek zmiany w obiekcie SurfaceAppearance.
Importowanie zasobów modułowych i rekwizytów
Studio reprezentuje zasoby modułowe i rekwizyty, które importujesz jako obiekty Model z dziećmi MeshParts dla każdego komponentu zasobu. Na przykład, jeśli importujesz sekcję ściany z górnym wykończeniem, dolnym wykończeniem i komponentem ściany, Studio reprezentuje plik .fbx lub .obj jako Wall_Section Model z oddzielnymi dziećmi Top_Trim, Bottom_Trim i Wall MeshParts.

Korzystając z Importera, możesz importować przykładowy modułowy zestaw i rekwizyty do Studio do wykorzystania w swojej bibliotece zasobów lub możesz importować dowolne zasoby, które zaprojektowałeś w poprzedniej sekcji samouczka. Aby uzyskać więcej informacji na temat funkcjonalności tego narzędzia, zobacz Importer.
Aby zaimportować swoje zasoby modułowe i rekwizyty do gry:
Z menu Plik wybierz Importuj. Wyświetli się przeglądarka plików.
Wybierz plik .fbx dla zasobu modułowego lub rekwizytu.
Zweryfikuj podgląd obiektu i sprawdź, czy ustawienia importu są poprawne dla twojego obiektu.

Zweryfikuj wszelkie ostrzeżenia lub komunikaty o błędach.
Kliknij Importuj. Zasób wyświetli się w oknie Eksplorator i w widoku.
Powtórz ten proces dla każdego zasobu modułowego i rekwizytu.
Przenieś wszystkie swoje zasoby do jednego obszaru w swojej grze w pobliżu geometrii w szarościach. Ten obszar to twoja biblioteka zasobów.
Zastosowanie danych SurfaceAppearance
Gdy przechodzisz przez proces rozkładania UV siatki w oprogramowaniu do modelowania zewnętrznego, oprogramowanie przechowuje dane UV w pliku .fbx lub .obj siatki. Gdy importujesz tę siatkę do Studio, wynikowy obiekt MeshPart zachowuje te dane, ale nadal musisz zastosować obiekt SurfaceAppearance z właściwościami map tekstur z twojego arkusza wykończeniowego, aby wyświetlić tekstury wykończenia na zasobie.
Aby zastosować dane map tekstur SurfaceAppearance do rozłożonych siatek w twojej bibliotece zasobów:
- W oknie Eksplorator kliknij swój pakiet SurfaceAppearance, a następnie naciśnij CtrlD (⌘D), aby go zduplikować.
- Uczyń zduplikowany pakiet SurfaceAppearance dzieckiem zasobu modułowego lub rekwizytu. Zasób stosuje swoje dane UV do map tekstur i wyświetla swoje wizualne wykończenie.
- Powtórz ten proces dla każdego zasobu modułowego i rekwizytu.
Ustawianie parametrów fizyki i renderowania
Teraz, gdy masz swoje zasoby w Studio, ważne jest, aby ustawić parametry fizyki i renderowania, które pozwalają zasobom zachować jak najwyższą jakość wizualną na urządzeniach z ograniczeniami pamięci i GPU. Ogólnie rzecz biorąc, im ściślej przestrzegasz wskazówek w tej sekcji, tym bardziej wydajna będzie twoja gra. Jednak ważne jest, aby starannie rozważyć kontekst, w którym planujesz umieścić każdy zasób w całym środowisku, aby upewnić się, że zachowasz swoje cele estetyczne i wymagania dotyczące rozgrywki.
Zakotwiczony
Właściwość BasePart.Anchored określa, czy system fizyki silnika Roblox wpływa na pozycję obiektu. Gdy włączysz tę właściwość dla Part lub MeshPart, usuwa to obiekt z obliczeń fizycznych dynamicznej symulacji, która zawsze działa w grze, co oznacza, że obiekt nigdy nie zmieni pozycji z powodu grawitacji lub kolizji z innymi obiektami.
Obiekty, które nie symulują reakcji fizycznej, są tańsze w renderowaniu, ponieważ nie zajmują GPU, który jest niezbędny do tych obliczeń fizycznych. Gdy zwolnisz GPU, poprawisz wydajność swojej gry, szczególnie na urządzeniach niskiej klasy, które muszą oszczędzać GPU na szybką rozgrywkę. Z tego powodu każdy zasób poza drzwiami w końcowym przykładowym środowisku laser tag jest zakotwiczony.
CanCollide
Właściwość BasePart.CanCollide określa, czy obiekt może fizycznie wchodzić w interakcje z innymi obiektami. Gdy włączysz tę właściwość dla Part lub MeshPart, obiekt jest nieprzenikniony, a silnik Roblox uwzględnia go w obliczeniach fizycznych. Te obliczenia mogą wpływać na wydajność twojej gry, gdy jest wiele obiektów, które silnik musi uwzględnić w swoich obliczeniach fizycznych.
Aby złagodzić część tego wpływu na wydajność, wyłącz tę właściwość dla obiektów, z którymi użytkownik nigdy nie będzie wchodził w interakcje. Na przykład, w końcowym przykładowym środowisku laser tag wyłączono tę właściwość dla wszystkich roślinności.

CanTouch
Właściwość BasePart.CanTouch określa, czy zdarzenia Touched i TouchEnded są wyzwalane na obiekcie. Gdy włączysz tę właściwość dla Part lub MeshPart, silnik Roblox sprawdza stan zdarzenia dotyku obiektu, aby zobaczyć, czy musi wyzwolić lub zatrzymać zdarzenie.
Ten proces zachodzi w każdej klatce, co może zajmować znaczną ilość pamięci, jeśli silnik musi sprawdzić stan zdarzenia dotyku dla wielu obiektów jednocześnie. Aby złagodzić część tego wpływu na pamięć, włączaj tę właściwość tylko dla obiektów, które muszą wyzwalać zdarzenie.
CanQuery
Właściwość BasePart.CanQuery określa, czy silnik Roblox uwzględnia obiekt podczas operacji zapytań przestrzennych, takich jak raycasting. Studio domyślnie włącza tę właściwość dla każdego Part lub MeshPart, co oznacza, że silnik sprawdza, czy każdy obiekt musi wywołać operację zapytania przestrzennego. Proces ten zachodzi w każdej klatce, co może zajmować znaczną ilość pamięci, gdy silnik musi dokonywać tych sprawdzeń dla wielu obiektów jednocześnie.
Z tego powodu zaleca się wyłączenie tej właściwości dla obiektów, które silnik Roblox nie musi uwzględniać w operacjach zapytań przestrzennych. Podejmując decyzje o tym, gdzie wyłączyć tę właściwość, rozważ, jak każdy zasób wpływa na rozgrywkę. Na przykład, w końcowym przykładowym środowisku laser tag ta właściwość jest włączona dla każdej ściany w budynku, ponieważ silnik musi uwzględnić te powierzchnie, gdy użytkownicy strzelają laserami z ich pistoletów laserowych. Jeśli silnik nie uwzględni tych zasobów, laser przeleci przez budynek, jakby go tam wcale nie było.
CastShadow
Właściwość BasePart.CastShadow określa, czy obiekt rzuca cień. Gdy włączysz tę właściwość dla Part lub MeshPart, silnik Roblox oblicza każdą lokalizację wierzchołka obiektu w czasie rzeczywistym, a następnie rysuje raycast od słońca do dowolnych sąsiednich obiektów, aż zderzy się z innym obiektem, aby stworzyć cień.
Te obliczenia mogą wiązać się z kosztami wydajności, szczególnie gdy masz wiele obiektów o złożoności geometrycznej. Dzieje się tak, ponieważ obiekty o złożoności geometrycznej mają więcej wielokątów niż obiekty, które są geometrycznie proste, co oznacza, że mają więcej wierzchołków, które silnik musi obliczyć dla cienia obiektu. Im mniej wielokątów w obiekcie, tym szybsza operacja i tańszy cień.

Cienie mogą zapewnić doskonałe poczucie realizmu obiektom z 3D geometryczną głębokością, więc gdy decydujesz, gdzie wyłączyć tę właściwość, rozważ, gdzie obiekty zapewniają znaczną poprawę wizualną dla środowiska i gdzie użytkownicy zauważą brak cieni. Na przykład, złożone cienie roślinności mogą zapewnić doskonałe poczucie zanurzenia w przestrzeni na zewnątrz, gdzie użytkownicy prawdopodobnie je zobaczą, ale to samo zanurzenie nie jest konieczne dla roślinności, która wystaje przez sufit, z którą użytkownicy nigdy nie będą wchodzić w interakcje.


DoubleSided
Właściwość MeshPart.DoubleSided określa, czy renderować obie strony lub wielokąty w siatce. Gdy włączysz tę właściwość dla płaskiego MeshPart, takiego jak liście, włosy lub karty materiałowe, silnik Roblox renderuje obie strony lub wielokąty w siatce, aby użytkownicy mogli zobaczyć pełnię obiektu, niezależnie od kąta, pod jakim patrzą na obiekt. Na przykład, poniższe liście drzewa są jednoskalowymi płaskimi siatkami, a gdy włączysz tę właściwość, wszystkie liście, które są zwrócone w stronę kamery, stają się widoczne dla użytkownika.


Ta właściwość jest przydatna do dodawania realizmu do twojego środowiska, ale wiąże się z kosztami wydajności, ponieważ silnik musi renderować wielokąty obiektu dwukrotnie: raz w kierunku, który zwraca się do kamery użytkownika, a drugi raz dla wszelkich siatek, które są zwrócone w stronę przeciwną do kamery użytkownika. Aby złagodzić część tego wpływu na wydajność, w końcowym przykładowym środowisku laser tag ta właściwość jest włączona tylko dla roślinności, ponieważ ma silny wpływ wizualny na realizm w przestrzeni 3D.
CollisionFidelity
Właściwość MeshPart.CollisionFidelity określa, jak ściśle hitbox fizyczny siatki lub unii odpowiada jej wizualnej reprezentacji. Domyślnie to ustawienie renderuje hitbox, który jest w przybliżeniu taki sam jak kształt wielokątny siatki, co oznacza, że miejsce, w którym użytkownicy kolidują z obiektem, jest podobne do rzeczywistej geometrii siatki. Na przykład, siatka zamku na poniższych obrazach ma domyślny hitbox, który prawie odpowiada kształtowi jej geometrii.


Możesz ustawić tę właściwość na inną wartość, aby zmniejszyć precyzję hitboxu siatki. Na przykład, gdy ustawisz tę właściwość na Hull, silnik Roblox znacznie redukuje wierzchołki hitboxu siatki, a gdy ustawisz tę właściwość na Box, silnik redukuje hitbox siatki do sześcianu, który otacza siatkę. Dodatkowo, jeśli chcesz zwiększyć precyzję hitboxu siatki, możesz ustawić tę właściwość na PreciseConvexDecomposition, aby zwiększyć liczbę wierzchołków w hitboxie.



Podobnie jak w przypadku BasePart.CastShadow, im więcej wierzchołków silnik Roblox musi renderować, tym wyższy koszt wydajności. Z tego powodu ważne jest, aby rozważyć, jak chcesz, aby użytkownicy wchodzili w interakcje z każdą siatką, aby zobaczyć, czy możesz zmniejszyć liczbę wierzchołków, które silnik musi renderować dla hitboxu siatki. W przypadkach, gdy nie jest konieczne, aby hitbox był precyzyjny, ustaw tę właściwość na Box lub Hull.
Aby zilustrować ten koncept, odwołaj się do poniższych obrazów, które pokazują hitbox każdej siatki modelu ściany, który zapewnia wzrost wysokości między pierwszym a drugim piętrem końcowego przykładowego środowiska laser tag. Domyślny hitbox głównej ściany ma wiele zbędnej geometrii, gdy tylko musi zapewnić powierzchnię, aby zapobiec ruchowi użytkownika w tym kierunku. Jeśli ustawisz właściwość na Box dla tej siatki, możesz usunąć tę zbędną geometrię, zachowując jednocześnie cel hitboxu.



Podejmując te decyzje, ważne jest, aby rozważyć, jak zmiana domyślnej wartości może negatywnie wpłynąć na użytkowników podczas nawigacji w twoim środowisku. Na przykład, jeśli ustawisz właściwość na Box dla siatek wykończenia modelu ściany, użytkownicy będą kolidować z hitboxem, jeśli spróbują skoczyć w pobliżu ściany. Zamiast tego ustaw te siatki na Hull, aby zmniejszyć liczbę wierzchołków, zachowując jednocześnie hitbox bliżej kształtu geometrii siatki.


Zauważ, że ważne może być posiadanie hitboxu, który dokładnie przylega do kształtu twojej siatki, szczególnie gdy musisz kontrolować dokładnie, jak użytkownicy kolidują z jej kształtem. Na przykład, w końcowym przykładowym środowisku laser tag ważne jest, aby użytkownicy kolidowali tylko z krawędziami drzwi, a nie z samymi drzwiami, w przeciwnym razie nigdy nie mogliby wejść ani wyjść z kieszeni walki.

RenderFidelity
Właściwość MeshPart.RenderFidelity określa poziom szczegółowości siatki, który wyświetla się użytkownikowi. Gdy ustawisz tę właściwość na Enum.RenderFidelity.Automatic, silnik Roblox zmniejsza szczegółowość siatki im dalej użytkownik jest od siatki, a gdy ustawisz tę właściwość na Enum.RenderFidelity.Precise, każdy wierzchołek twojej siatki renderuje się dokładnie tak, jak zamierzasz, niezależnie od odległości między nimi.
Im więcej obiektów silnik musi renderować precyzyjnie dla użytkownika z dowolnej odległości, szczególnie jeśli mają dużą liczbę wierzchołków, tym wyższy koszt wydajności. Aby złagodzić część tego wpływu na wydajność, ustaw tę właściwość na Enum.RenderFidelity.Performance dla obiektów o złożoności geometrycznej, takich jak roślinność w przykładowej bibliotece zasobów, ponieważ nie muszą być wyświetlane w całości z daleka dla żadnego wymogu rozgrywki. To zmniejsza liczbę wielokątów w twojej grze bez utraty ogólnej jakości wizualnej.
Konwertowanie zasobów na pakiety
Teraz, gdy wszystkie twoje zasoby modułowe są w Studio z ustawionymi parametrami renderowania, które mają zachować ich wysoką jakość wizualną dla wszystkich użytkowników, czas na konwersję ich na pakiety. Ważne jest, aby konwertować swoje zasoby na pakiety, ponieważ pozwala to na wielokrotne ich wykorzystywanie w całej twojej obecnej grze i innych projektach. Dodatkowo, możesz łatwo wprowadzać edycje do pakietu, które natychmiast pojawią się we wszystkich jego instancjach, co zaoszczędzi ci dużo czasu w procesie iteracji.
Ponieważ twoje obiekty SurfaceAppearance są już pakietami, gdy konwertujesz swoje obiekty Model na pakiety, stają się one pakietami zagnieżdżonymi. Pakiety zagnieżdżone pozwalają na utrzymanie złożonych hierarchii obiektów podrzędnych, które możesz modyfikować niezależnie od pakietu obiektu Model. To daje ci większą kontrolę nad poszczególnymi komponentami twoich zasobów.

Aby skonwertować swoje zasoby modułowe i rekwizyty na pakiety:
W oknie Eksplorator kliknij prawym przyciskiem myszy zasób modułowy lub rekwizyt, a następnie wybierz Konwertuj na pakiet z menu kontekstowego. Wyświetli się okno dialogowe Konwertuj na pakiet.
Wypełnij pola Tytuł i Opis, ustaw własność na siebie lub grupę, a następnie kliknij przycisk Wyślij. Po zakończeniu nad ikoną modelu wyświetli się symbol łańcucha, aby zidentyfikować go jako pakiet.

Powtórz ten proces dla każdego zasobu modułowego i rekwizytu.
Gdy będziesz zadowolony z ogólnego układu swojej biblioteki zasobów, możesz przejść do dekorowania środowiska swoimi nowo dopracowanymi zasobami i konfigurowania dodatkowych elementów przestrzeni 3D, aby ożywić swój świat.