Özel ağları içe aktararak NPC'lerden bir yelkenli teknenin animasyonlu kumaşına kadar her şeyi oluşturabilirsiniz. Gizemli kara delik yaratıkları ve dost canlısı, ama farkında olmayan hizmet droidleri gibi daha egzotik özel karakterleri getirmek için İçe Aktarıcı nın özel ayarını kullandık.
Aşağıdaki bölümler, "Yaratık" adını verdiğimiz daha karmaşık karakterlerden birini oluşturmak için rigging ve skinning, PBR (yüzey görünümü) ve VFX'i nasıl kullandığımızı anlatıyor. Onun parlamasını, biraz ışık yaymasını, parçacık dumanı izleri bırakmasını ve tentaklalarının ikna edici dalgalarını oluşturmak için yeterli eklemlere sahip bir rig ile akıcı bir hareket istedik.

Rig
Yaratığı rigging yaparken, karakteri nötr bir pozda modellemenin en iyisi olduğunu bulduk, çünkü bu poz birden fazla yönde bükülmeye en uygun olanıdır. Yaratığı tentakları zaten kıvrılmış bir şekilde modelleseydik, tentakları ters yönde bükmek için animasyon yaptığımızda gerilmeye neden olacaktı. Aşağıdaki ekran görüntüleri, Yaratığı doğal durumunda gösteriyor:


Nötr bir pozdan, en çok hareket etmesi gereken alanlara odaklanarak eklemleri ekonomik bir şekilde ekledik. Daha az eklem, daha iyidir, çünkü karakterinizi skinning yaparken bunları yönetmek zorunda kalacaksınız ve animasyon yaparken kontrol etmeniz gereken daha az şey olacak. Önceki ekran görüntülerinde, Yaratığın merkezinde çok sayıda eklem var gibi görünüyor, ancak ana gövde yalnızca bir ekleme sahip.
Diğer eklemlerin çoğu tentaklar ve çeneler yönündedir. Tentaklarla, hepsinin kendi başına hareket ediyormuş gibi ikna edici bir etki yaratmak için çok fazla ikincil hareket istedik. Ancak, tentakların merkez kütlesi o kadar yakındı ki, hepsi için eklem yapmak israf gibi hissettirdi, hem performans hem de animasyon çabası açısından. Bu nedenle, merkez kütlesini tek bir büyük tentaklaya ve uçları merkez kütlesinden ayrılan daha küçük "kuyruklara" dönüştürdük.

Karakter ağının Studio'ya doğru bir şekilde içe aktarılması için aşağıdaki yönergeleri faydalı bulduk:
- Bireysel eklemler ve kemikler benzersiz isimlere sahip olmalıdır.
- Ağlar, eklemlerin ve kemiklerin adıyla aynı olmamalıdır.
- Ağların skinning/binding öncesinde herhangi bir dönüşümü olmamalıdır; diğer bir deyişle, dönüşümler 0 ve ölçekler 1 olmalıdır.
- Ağ normalleri dışa bakmalıdır (model içe dönük görünmemelidir).
- İskeletlerin herhangi bir ölçek faktörü olmamalıdır; tüm eklemler [1, 1, 1] olmalıdır.
Skin
Yaratığın iskeletini tamamladıktan sonra, bir sonraki adım ağın skinning'ini yapmaktı. Skinning zor bir görev olabilir, bu nedenle işleri kolaylaştırmak için DCC uygulamanızın farklı başlangıç skinning ayarlarıyla tanışmak en iyisidir. Bu organik bir karakter olduğu için, her eklemde bolca düşüş ve aralarında örtüşme ile skinning yaptık. Bu şekilde, bükülme pürüzsüz hissedilir ve keskin olmaz. Aşağıdaki ekran görüntüleri sırasıyla kötü skinning ve pürüzsüz skinning'i gösteriyor:


Aşağıdaki yönergelerin skinning için en iyi sonuçları verdiğini bulduk:
- Skinning etkileri (yani, hareket ettiğinde modelin bir kısmını etkileyenler) her bir vertex için maksimum 4 etki olmalıdır.
- Eklemlerin ve ağların isimleri benzersiz olmalıdır, hem birbirleri içinde hem de birbirleri arasında.
- Studio'ya içe aktarmak istediğiniz herhangi bir eklemin modelin skinning'inde bir etkisi olmalıdır, aksi takdirde motor onu içe aktaramaz. Mümkün olduğunda, modelinizi orijinal veya "bağlama" pozunda skinning yapın.
Ağı Studio'ya İçe Aktarın
Özel karakterlerinizi Studio'ya içe aktarmak, sürecin en heyecan verici kısımlarından biridir, çünkü oluşturduğunuz şeyleri inşa ettiğiniz oyunda görebilirsiniz!
Ağı Studio'ya içe aktarmak için:
DCC uygulamasından karakteri dışa aktarın ve aşağıdakilerin doğru olduğundan emin olun:
- Tüm normaller, ölçekler ve isimler doğrudur.
- Karakterin tüm eklem ve kemik hiyerarşisi ve tüm ağları vardır.
- Ağlar, ağın her parçası için 10,000 üçgenden daha az olmalıdır.
- Ağın toplam boyutu herhangi bir eksende 2000 birimden fazla olmamalıdır.
- Model spesifikasyonlarının tam listesi için Ağ Gereksinimleri sayfasına bakın.

İçe Aktarıcı içinde özel .fbx veya .obj dosyasını içe aktarın.

Yaratığı Parlat
Yaratığın modeli stabil hale geldikten ve Studio'ya daha fazla acil içe aktarma gerektirmediğinden, Yüzey Görünümü nesnelerini, ışıkları ve görsel efektleri bir araya getirmeye başladık. Bunu, modelin kalitesinin yeterince iyi olduğundan emin olmak için yaptık ve ardından herhangi bir yönünü yerleştirip düzenlemeye geçtik.

Yaratığın karanlık olmasını ve odak noktalarının gözleri ve "kapma" tentakları olmasını istedik. Yüksek kontrast noktaları dikkat çeker, bu nedenle birkaç güçlü noktanın olması, izleyicinin neye odaklanması gerektiğini bilmesini sağlar. Studio, kendiliğinden aydınlanan neon malzemeleri destekler, bu nedenle erken aşamalarda gözleri diğer karakter parçalarından ayrı bir malzeme olarak ayırdık. Tentaklar için de benzer bir şey yaptık, böylece yalnızca uçlarında parlayacaklardı.

Neon malzeme gerçek ışık yaymaz, bu nedenle bazı testlerden sonra ışık yayılımının yerleşimini ve yönünü kontrol etmek için ayrı parçalar ekledik. Bu, ışığın gözlerin parlamasını artıracak şekilde yönlendirilmesini ve kendi ışık kaynağını projekte etmesini sağladı.

SpotLights'ın Yaratığa diğer yüzeylere veya bir oyuncuya yakın görsel bir parıltı eklediğini unutmayın.

Ayrıca, Yaratığın tentaklarının bazı parçacıklar yaymasını istedik, böylece hareket ettiğinde arkasında bir duman izi bırakacaktı. Tentaklar çok uzun olduğundan, ParticleEmitter'ı tüm tentaklara eklemek, parçacıkların tüm tentaklardan değil, yalnızca uçtan yayılmasına neden olacaktı. Bunu aşmak için, tentakların ucuna yakın bir yere konumlandırılmış küçük bir parça kullandık, böylece parçacıkların yayılma boyutunu, yerleşimini ve yönünü kontrol edebildik.

VFX'in karakteri takip etmesini sağla
Skinning yapılmış karakterin ağ pozisyonları, Yaratık animasyon yaparken güncellenmez, bu nedenle VFX, SFX ve ışıkların Yaratığı doğru bir şekilde takip etmesini sağlamak için bir yöntem geliştirmemiz gerekiyordu. Bunu başarmak için bir VFX kontrol scripti oluşturduk ve CollectionService'i kullanarak VFX içeren parçaların Yaratığın kemiklerinin nerede olduğunu bilmesini sağladık ve onları takip etmesini sağladık.
Aşağıdaki LocalScript'i StarterPlayer → StarterPlayerScripts içine yerleştirdik. Bu, esasen VFX güncelleme fonksiyonunu çalıştırır.
Local Script-- Bu kod parçasını PreSimulation bağlantıları yapan mevcut bir yerel script'e ekleyinlocal RunService = game:GetService("RunService")local vfx = require(workspace.VfxUpdateModule)RunService.PreSimulation:Connect(vfx.updateVfx)Module Script-- Bu modül, parçaları animasyonlarla ilişkilendirerek animasyon oynatıldıkça güncellenmelerini sağlar. Bu, Eklemler ve Kemikler ile ilgili mevcut sınırlamaların bir çözümüdür ve her zaman gerekli olmayacaktır.---- Ön koşullar:-- Dahil edilmek için, modellerin "AnimatedVfxModel" etiketi ve animasyonla senkronize etmek istediğiniz tüm parçaların bir klasörü olmalıdır. Her parçanın, bağlanmak istediğiniz kemiğin adını belirten "AttachedBoneName" adlı bir niteliği olmalıdır. Parçalar, istenen kemiğe göre doğru konumda olmalıdır.---- Kullanım:-- Bir LocalScript bu modülü gerektirmeli, ardından VfxUpdateModule.updateVfx'i RunService.PreSimulation olayına bağlamalıdır.local VfxUpdateModule = {}local CollectionService = game:GetService("CollectionService")-- KURULUM - bu her istemcide bir kez çalışmalıdır.-- Etiketli tüm modelleri toplayınlocal vfxModels = CollectionService:GetTagged("AnimatedVfxModel")local vfxTable = {} -- tüm parçaları ve offsetleri saklayacağımız yer-- Her model için tüm vfx parçalarını ve offseti tutacak bir tablo atayınfor _, model in vfxModels dovfxTable[model] = {}local vfxParts = model:FindFirstChild("VFX"):GetChildren() -- VFX klasörünü bul-- Niteliğe göre kemiği bulun ve her parça için offseti hesaplayın.for _,part in vfxParts dolocal name = part:GetAttribute("AttachedBoneName")local bone = model:FindFirstChild(name, true)if bone thenlocal offset = (bone.TransformedWorldCFrame:inverse() * part.CFrame)vfxTable[model][part] = {bone, offset}elsewarn("Vfx parçası bulunamayan bir kemiğe atıfta bulunuyor.")endendendprint(vfxTable)-- GÜNCELLEME - Bu her istemcinin RunService.PreSimulation'ına bağlanmalıdır-- Tüm modelleri geçin, ardından modeldeki tüm parçaları kemiğin çerçevesine göre güncelleyin.function VfxUpdateModule.updateVfx()for model, vfxParts in vfxTable dofor part, bone in vfxParts dopart.CFrame = bone[1].TransformedWorldCFrame * bone[2]endendendreturn VfxUpdateModuleHerhangi bir nesneyi AnimatedVfxModel etiketiyle uygun şekilde güncellemek için bir VFXUpdateModule ModuleScript oluşturduk.
Gerekli model gruplarını AnimatedVfxModel ile etiketledik ve Etiketler bölümünü kullanarak özelliklerinin altında etiketledik. Etiketler, VFXUpdateModule'un ilk VFX çocuğunu aramasını ve güncellemeyi uygulamasını sağlar.

Son olarak, animasyon yapmak istediğimiz parçaya bir AttachedBoneName özel niteliği ekledik ve takip etmesini istediğimiz eklemin tam adını ekledik.
Yaratığı Doku
Sonraki adım, PBR (Fiziksel Olarak Tabanlı Render) doku haritalarını ayarlamaktı. Bu güçlü bitmap'ler, yaratığa çok sayıda küçük tümsek ve kusur varmış gibi görünmesi için çeşitli parlaklık ve yüzey varyasyonları verir. Bu görsel efekt, Yaratığın oyuncuya daha yakınken görünümünü satmaya yardımcı olur.

Yüzey görünümü doku haritalarını nasıl oluşturduğumuz şöyle:
Bu karakter için doku haritaları her harita için bir "sayfa" üzerinde toplandı. Bu, yaratığı daha verimli hale getirdi ve daha az doku haritası veya SurfaceAppearance nesnesi ile başa çıkmamız gerektiği anlamına geldi.




Parlayacak veya kendiliğinden aydınlatılacak alanlar için, "kapma tentakları" gibi, bu parçalara karışmak için SurfaceAppearance üzerinde şeffaflık kullandık.

Yüzey görünümü doku haritalarını oluştururken bu yönergeleri takip etmenin faydalı olduğunu bulduk:
- Haritalarınızın 1024×1024'ten büyük olmamasına dikkat edin.
- Çalıştığınız uygulamaya bağlı olarak yeşil kanalın ters çevrilmesi gerekebilir.
Yaratığı Animasyon
Animasyon çok öznel bir konudur ve kişisel bir tarzı vardır. Seçenekler arasında hareket yakalama, DCC uygulamanızda elle "anahtar çerçeve" animasyonu veya Studio'nun güçlü Animasyon Editörü'nü kullanmak bulunmaktadır.
Daha önce belirttiğimiz gibi, akıcı hareket için yeterli eklem ve uzuv olduğundan emin olmak istedik, böylece yaratık animasyonu doğal ve "katmanlı" hissediyordu. Katmanlama, ikincil hareket olarak da bilinir, günlük hayatta gördüğünüz bir şeydir — kolunuzu fırlattığınızda, her eklem üst kolunuzdan gelen ilk itkiye tepki verir ve vücudunuzdaki her eklem aynı anda hareket etmez veya dinlenmez.
Bu tekniği, Yaratığın uzuvlarının vücudunun hareketine tepki veriyormuş gibi hissettirmek için kullandık, burada gösterildiği gibi:

Dışarıda bir DCC uygulaması kullanıyorsanız, aşağıdaki yönergelerin en iyi şekilde çalıştığını bulduk:
- Kare hızlarını en az 30 FPS olarak ayarlayın.
- Animasyonlarınızı uyguladığınız karakterle aynı karakterle oluşturun.
- Animasyon verilerinizi ayrı bir .fbx dosyası olarak dışa aktarın.
Karakteri Studio dışında animasyon yaptığımız için, animasyon .fbx dosyasını içe aktarmak için Animasyon Editörü'nü kullanmamız gerekiyordu. Editör, herhangi bir eklem veya motoru olan avatarı seçmenizi ve zaman çizelgesindeki noktalar aracılığıyla sürüklemenizi sağlar.
Bir animasyonu içe aktarmak için:
Araç çubuğundaki Avatar sekmesinde Clip Editor'a tıklayın.
Roblox'ta animasyon yapmak istediğiniz riglenmiş karakteri seçin. Karakter, dışarıda riglediğinizle aynı olmalıdır.
Editör penceresinin sol üst kısmındaki ⋯ butonuna tıklayın, FBX Animasyonundan İçe Aktar'ı seçin ve dışa aktardığınız .fbx animasyon dosyanızı bulun.

Animasyonunuzdan memnun kaldığınızda, animasyon ID'sini keşfetmek için dışa aktarabilirsiniz, bu ID'yi daha sonra Roblox scriptlerinde çalıştırmak için kullanabilirsiniz. Örneğin, içe aktarılan karakterin model grubuna bir Script ekleyebilir ve animasyonu çalıştırmak için aşağıdaki kodu kullanabilirsiniz:
local animationId = "YOUR_ANIMATION_ID"local char = script.Parentlocal animController = char:FindFirstChildWhichIsA("Humanoid") or char:FindFirstChildOfClass("AnimationController")local animation = Instance.new("Animation")animation.AnimationId = "rbxassetid://" .. tostring(animationId)local animTrack = animController:LoadAnimation(animation)animTrack:Play(0, 1, 1)
Sonuçlar
Renkler, ışık parlaklıkları ve pencerelerin önünde daha güçlü bir halo etkisi vermek için bazı parçacık efektleri üzerinde birkaç son dokunuş yaptıktan sonra, işte uzay istasyonundaki nihai sonuç!
