Özel kenarları içe aktarıp NPC'lerden bir yelkenlinin animasyonlu kumaşına kadar her şeyi yaratabilirsiniz. Gizemli kara delik yaratıkları ve dost canlısı, farkında olmayan hizmet robotları gibi daha egzotik özel karakterleri getirmek için Importer aracının özel ayarını kullandık.
Aşağıdaki bölümler, "Yaratık" adını verdiğimiz karmaşık karakterlerden birini nasıl oluşturduğumuzu ele alır. Rigging ve Skinning, PBR (yüzey görünümü) ve VFX konusunda kullanılan yöntemleri içerir. Karakterin parlamasını, ışık yaymasını, bazı parçacık dumanı izleri bırakmasını ve tentaklalarının sahte hareketlerini oluşturmak için gerekli olan yeterli eklemleri içeren bir rig’i skinlemek istedik.

Rig
Yaratığı riglerken, karakteri nötr bir pozda modellemek en iyisi olduğunu düşündük, çünkü bu poz birden fazla yönde bükülmeye en uygun olandır. Eğer Yaratığı tentakları kıvrılmış bir halde modelleseydik, tentakları ters yönde bükmeye çalıştığımızda gerilmelere yol açardı. Aşağıdaki ekran görüntüleri Yaratığın doğal durumunu gösteriyor:


Nötr bir pozdan, en çok harekete ihtiyaç duyan alanlara odaklanarak ekonomik bir şekilde eklemler ekledik. Eklem sayısı ne kadar az olursa, onu skinlerken o kadar iyi olur, çünkü skinleme sırasında onları yönetmek zorundasınız ve animasyon yaptığınızda kontrol etmek için daha az şeyiniz olur. Önceki ekran görüntülerinde, Yaratığın merkezinde çok sayıda eklem varmış gibi görünüyor, ancak ana gövdede yalnızca bir eklem var.
Diğer eklemlerin çoğu tentaklar ve çeneler üzerinde. Tentaklar ile çok fazla ikincil hareket, yani katmanlı hareket istedik, bu sayede hepsinin kendi başlarına hareket ediyormuş gibi ikna edici bir etki yaratabiliyoruz. Ancak, tentakların merkez kütlesi o kadar yakın bir aradaydı ki, tümü için eklem yapmanın hem performans hem de animasyon için çaba açısından israfa yol açtığını düşündük. Bunun yerine, merkez kütlesini tek bir büyük tentak olarak ele aldık ve ucu merkez kütlesini bıraktığında daha küçük "kuyruklar" ile tanımladık.

Karakter kenarlarının Studio'ya doğru bir şekilde aktarılması için aşağıdaki kılavuzların faydalı olduğunu düşündük:
- Bireysel eklemler ve kemikler benzersiz isimlere sahip olmalıdır.
- Kenarların kemik ve eklem adları ile aynı olmamalıdır.
- Skinleme/bind işlemi öncesinde kenarların hiç transformasyona sahip olmaması gerekir; diğer bir deyişle, dönüşler 0, ölçekler 1 olmalıdır.
- Kenar yüzey normalleri dışa bakmalıdır (model içe doğru görünmemelidir).
- İskeletler herhangi bir ölçek faktörüne sahip olmamalıdır; tüm eklemler [1, 1, 1] olmalıdır.
Skin
Yaratığın iskeletini tamamladıktan sonra, bir sonraki adım kenarı skinlemekti. Skinleme zor bir görev olabilir; bu yüzden işin kolaylaştırılması adına, DCC uygulamanızın farklı başlangıç skinleme ayarlarını tanımak en iyisidir; sevdiğinizi bulana kadar deneyin. Bu organik bir karakter olduğu için, her eklemin yeterince falloff' ile skinledik ve aralarında örtüşme olmasını sağladık. Bu şekilde, bükülmelerin pürüzsüz ve keskin olmamasını sağlıyoruz. Aşağıdaki ekran görüntüleri sırasıyla kötü skinleme ve pürüzsüz skinlemeyi gösteriyor:


Skinleme için en iyi sonuçları veren kılavuzların şu şekilde olduğunu gördük:
- Skinleme etkileri (yani, modelin bir kısmını hareket ettirdiklerinde etki eder) maksimum 4 etki ile sınırlı olmalıdır.
- Eklemlerin ve kenarların adları benzersiz olmalıdır, her biri arasında ve birbirleriyle.
- Studio'ya aktarmak istediğiniz herhangi bir eklemin modelin skinlemesinde bir etkisi olmalıdır, aksi takdirde motor onu aktaramaz. Mümkün olduğunda modelinizi, orijinal ya da "bind" pozunda skinleyin.
Kenarı Studio’ya Aktarma
Özel karakterlerinizi Studio'ya aktarmak sürecin daha heyecan verici kısımlarından biridir, çünkü inşa ettiğiniz deneyim içinde yarattıklarınızı görebilirsiniz!
Kenarı Studio'ya aktarmak için:
DCC uygulamasından karakteri dışa aktarın ve aşağıdakileri kontrol edin:
- Tüm normaller, ölçekler ve isimler doğru.
- Karakterin tüm eklem ve kemik hiyerarşisi ve tüm kenarları bulunuyor.
- Kenarların her parçası 10,000 üçgeni geçmemelidir.
- Kenarların toplam boyutu herhangi bir eksende 2000 birimi geçmemelidir.
- Model spesifikasyonları için tam listeyi görmek için Mesh Requirements sayfasına bakın.

Importer aracında .fbx veya .obj dosyasını içe aktarın.

Yaratığı Parlak Yap
Yaratık modelinin stabil hale gelmesi ve Studio'ya daha fazla acil aktarım gerektirmemesiyle, YüzeyGörünüm nesnelerini, ışıkları ve görsel efektleri bir araya toplamaya başladık. Bunu yapma amacımız, modelin kalitesinin yeterince iyi olduğundan emin olmaktı, ardından onun herhangi bir birimini yerleştirip üzerinde düzenlemeler yapmaya geçebilirdik.

Yaratığın karanlık olmasını ve odak noktalarının gözleri ve "kapıcı" tentakları olması gerektiğini biliyorduk. Yüksek kontrast noktaları genellikle dikkat çeker, bu yüzden birkaç güçlü noktaya sahip olmak, izleyicinin neye odaklanması gerektiğini bilmesini sağlar. Studio, kendi kendine aydınlanan neon malzemeleri destekliyor, bu yüzden erken dönemde gözleri ayırdık, böylece karakterin geri kalanından kendi malzemeleri olabiliyordu. Tentaklar için de benzer bir işlem yaptık, böylece yalnızca uçlarından parlayabiliyorlardı.

Neon malzemeler gerçek ışık yaymaz, bu yüzden bazı testler sonrasında ışık emisyonunun yerleşimini ve yönünü kontrol etmek için ayrı parçalar ekledik. Bu, gözlerin parlamasını artıran ve kendi ışık kaynağını da yaymalarını sağladı.

SpotLights 'ların Yaratığı diğer yüzeylere veya bir oyuncuya yakın yerlerde görsel bir göz kamaştırma eklediğine dikkat edin.

Ayrıca, Yaratığın tentaklarından bazı parçacıklar yaymasını istediğimiz için hareket ettiğinde arkasında bir duman izi bırakmalıydı. Tentaklar çok uzun olduğu için, tüm tentak üzerine ParticleEmitter eklemek, partiküllerin tüm tentaklardan değil, sadece ucundan yayılmasına neden olacaktı. Bununla başa çıkmak için, tentakların sonunda konumlandırılmış küçük bir parçayı kullandık, böylece fire emisyonunun boyutunu, yerleşimini ve yönünü kontrol edebildik.

VFX’in Karakteri Takip Etmesini Sağla
Skinlenmiş karakterin mesh pozisyonları Yaratık animasyon yaptığında güncellenmez, bu yüzden VFX, SFX ve ışıkların Yaratığı düzgün bir şekilde takip etmesini sağlamak için bir yöntem oluşturmak zorunda kaldık. Bunu başarmak için bir VFX denetleyici betiği oluşturduk ve CollectionService’i kullanarak VFX içeren parçaların nerede olduğunu ve Yaratığın kemiklerinin nerede olduğunu belirtmek için bu parçaların takip edilmesini sağladık.
Aşağıdaki LocalScript dosyasını StarterPlayer → StarterPlayerScripts içine yerleştirdik. Bu, temelde VFX güncelleme işlevini çalıştırır.
Local Script-- Bu parçayı mevcut bir yerel betiğe ekleyin, PreSimulation-- bağlantılarını oluşturur.local RunService = game:GetService("RunService")local vfx = require(workspace.VfxUpdateModule)RunService.PreSimulation:Connect(vfx.updateVfx)Module Script-- Bu modül parçaları animasyonlara bağlayarak animasyon oynarken güncellenmelerini sağlar.-- Joints ve Bones ile mevcut sınırlamalar için bir geçiştir-- ve her zaman gerekli olmayacaktır.---- Ön koşullar:-- Dahil edilmek için, modellere "AnimatedVfxModel" etiketi eklenmeli ve-- animasyonla senkronize etmek istediğiniz tüm parçaların olduğu bir klasör-- olmalıdır. Her bir parçanın, bağlanması gereken kemik adını-- belirten "AttachedBoneName" adlı bir niteliği olmalıdır.-- Parçalar, istenen kemiğe göre doğru pozisyonlarda olmalıdır.---- Kullanımı:-- Bir LocalScript bu modülü gerektirmelidir, ardından-- VfxUpdateModule.updateVfx'i RunService.PreSimulation etkinliğine bağlayınız.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 depolayacağımız yer-- Her model için vfx parçaları ve offsetleri 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 offset'i 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 kemiğe atıfta bulunuyor.")endendendprint(vfxTable)-- GÜNCELLEME - Her istemcinin RunService.PreSimulation'ına bağlanmalıdır.-- Tüm modelleri gezerek, modeldeki tüm parçaları kemik çerçevesine-- eşleyecek şekilde güncelleyiniz.function VfxUpdateModule.updateVfx()for model, vfxParts in vfxTable dofor part, bone in vfxParts dopart.CFrame = bone[1].TransformedWorldCFrame * bone[2]endendendreturn VfxUpdateModuleOynatma olayında uygun şekilde etiketlenmiş nesnelerin güncellenmesini sağlamak için VFXUpdateModule adında bir ModuleScript oluşturduk.
Gerekli model gruplarını AnimatedVfxModel ile etiketledik ve bunun için Tags bölümünü kullandık. Etiketler, VFXUpdateModule'un, hangi nesnenin ilk VFX çocuğu olarak aranacağını bilmesini ve güncellemeyi uygulamasını sağlar.

Son olarak, animasyon eklemek istediğimiz parçaya AttachedBoneName özel niteliği ekledik ve onun takip etmesini istediğimiz eklemin tam ismini ekledik.
Yaratığı Kaplama
Sonraki adım PBR (Fiziksel Temelli Görüntüleme) doku haritalarını ayarlamaktı. Bu güçlü bitmap'ler, yaratığın farklı parıltılar ve yüzey varyasyonlarıyla görünmesini sağlar, bu da onun birçok küçük yumru ve kusurun varmış gibi görünmesini sağlar. Bu gelişmiş görsel efekt, Yaratık, oyuncuya daha yakın olduğunda görsel olarak etkileyici olmasını sağlar.

Yüzey görünümü doku haritalarını şu şekilde oluşturduk:
Bu karakter için doku haritalarının her biri bir doku "sayfasında" yer alıyordu. Bu, yaratığı daha verimli hale getirdi ve daha az doku haritası veya SurfaceAppearance nesnesi ile başa çıkmamız gerekti.




"Kapıcı tentaklar" gibi parlayan veya kendinden ışık saçan alanlar için, SurfaceAppearance üzerinde bu parçaları buluşturacak şekilde şeffaflık kullandık.

Yüzey görünümü doku haritalarını oluştururken bu kılavuzları takip etmek çok faydalı oldu:
- Haritalarınızın boyutunun 1024×1024'ten büyük olmadığından emin olun.
- Çalıştığınız uygulamaya bağlı olarak yeşil kanalın ters çevrilmesi gerekebilir.
Yaratığı Animasyonla
Animasyon oldukça öznel bir deneyimdir ve kişisel bir stildir. Seçenekler arasında hareket yakalama, DCC uygulamanızda elle "anahtar çerçeve" animasyonu veya Studio’nun güçlü Animasyon Editörü bulunur.
Daha önce bahsettiğimiz gibi, karakterin doğal ve "katmanlı" hat oluşturması için yeterince ekleme sahip olmak istedik. Katmanlama, aynı zamanda ikincil hareketler olarak adlandırılır; günlük hayatta görünür — kollarını savurduğunuzda, her eklem üst kolunuzdan alınan ilk uyarana tepki verir ve vücudunuzdaki her eklem aynı anda hareket etmez ya da dinlenmez.
Bu tekniği Yaratığı animasyon diğeriyle birlikte hareket ediyormuş gibi hissettirmek için kullandık:

Dış bir DCC uygulaması ile animasyon yapıyorsanız, aşağıdaki kılavuzların en iyi çalıştığını gördük:
- Kare hızlarını en az 30 FPS olarak ayarlayın.
- Animasyonları uyguladığınız karakterle aynı karakterde oluşturun.
- Animasyon veri dosyanızı ayrı bir .fbx dosyası olarak dışa aktarın.
Karakteri Studio dışında animasyonladığımız için, animasyon .fbx dosyasını içe aktarmak için Animasyon Editörü'nü kullanmamız gerekti. Editör, eklemlere veya motorlara sahip herhangi bir avatarı seçmenizi ve zaman çizelgesindeki noktalara göre hareket ettirmenizi sağlar.
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ış DCC uygulamanızda rigleme yaptığınız ile aynı olmalıdır.
Editör pencerenizin sol üst kısmındaki ⋯ butonuna tıklayın, FBX Animasyonundan İçe Aktar seçeneğini seçin ve dışa aktarılan .fbx animasyon dosyanızı bulun.

Animasyondan memnun kaldığınızda, onu dışa aktarabilir ve ardından animasyon kimliğini bulabilirsiniz. Bu kimlik, Roblox skriplerinde animasyonu çalıştırmak için kullanılabilir. Örneğin, dışa 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)
Nihai sonuçlar
Renkler, ışık parlaklıkları ve ön pencerelerde daha güçlü bir halo etkisi yaratmak için bazı parçacık efektleri için birkaç son rötuş yaptıktan sonra, işte uzay istasyonundaki nihai sonuç!
