カスタムメッシュをインポートして、NPCからアニメーション付きの帆船の布まで、さまざまなものを作成できます。私たちは、インポーターのカスタム設定を使用して、神秘的なブラックホールの生物や、無自覚なサービスドロイドのような、よりエキゾチックなカスタムキャラクターを取り入れました。
以下のセクションでは、私たちがどのようにしてリギングとスキニング、PBR(表面外観)、およびVFXを使用して、「クリーチャー」と名付けたより複雑なキャラクターを構築したかを説明します。私たちはそれを光らせ、光を放ち、粒子の煙の軌跡を持ち、触手の波を作り出すのに十分な関節を持つリグをスキニングする流動的な動きを持たせたかったのです。

リグ
クリーチャーのリギングを行う際、キャラクターを中立的なポーズでモデル化するのが最適であることがわかりました。このポーズは、複数の方向に曲げるのに最も適しています。もしクリーチャーを触手がすでに巻かれた状態でモデル化していたら、触手を反対方向に曲げるアニメーションを付けるときに伸びてしまうことになったでしょう。以下のスクリーンショットは、クリーチャーの自然な状態を示しています:


中立的なポーズから、私たちは経済的に関節を追加し、最も動きが必要な部分に焦点を当てました。関節は少ない方が良いです。なぜなら、キャラクターをスキニングする際に管理しなければならず、アニメーションを付ける際に制御するものが少なくなるからです。前のスクリーンショットでは、クリーチャーの中心に多くの関節があるように見えますが、主な体には1つの関節しかありません。
他のほとんどの関節は触手や顎に向かっています。触手には多くの二次的な動き、つまり層状の動きを持たせたかったので、すべてが自分自身で動いているように見える説得力のある効果を生み出しました。しかし、触手の中心部分は非常に近接していたため、すべての触手に関節を作るのは無駄だと感じました。パフォーマンスとアニメーションの手間の両方においてです。そこで、中心部分を1つの大きな触手として扱い、先端が中心部分を離れる小さな「尾」を持たせました。

キャラクターメッシュがスタジオに正しくインポートされるために、以下のガイドラインが役立ちました:
- 個々の関節とボーンはユニークな名前を持たなければなりません。
- メッシュは関節やボーンと同じ名前を持ってはいけません。
- メッシュはスキニング/バインディングの前に変形を持ってはいけません。言い換えれば、変形は0で、スケールは1であるべきです。
- メッシュの法線は外向きに向けるべきです(モデルが内側を向いてはいけません)。
- 骨格にはスケールファクターを持たせてはいけません。すべての関節は[1, 1, 1]であるべきです。
スキン
クリーチャーの骨格が完成したら、次のステップはメッシュをスキニングすることでした。スキニングは骨の作業であるため、作業を簡単にするために、DCCアプリケーションのさまざまな初期スキニング設定に慣れておくのが最善です。このキャラクターは有機的なものであるため、各関節に十分なフォールオフと重なりを持たせてスキニングしました。これにより、曲がりが滑らかで鋭くない感じになります。以下のスクリーンショットは、それぞれ悪いスキニングと滑らかなスキニングを示しています:


以下のガイドラインがスキニングの最良の結果を生み出しました:
- スキニングの影響(つまり、移動時にモデルの一部に影響を与えるもの)は、頂点ごとに最大4つの影響であるべきです。
- 関節とメッシュの名前は、互いにおよび互いの間でユニークである必要があります。
- スタジオにインポートしたい関節は、モデルのスキニングに何らかの影響を持っている必要があります。そうでないと、エンジンはそれをインポートしません。 可能な限り、モデルを元の「バインド」ポーズでスキニングしてください。
メッシュをスタジオにインポートする
カスタムキャラクターをスタジオにインポートすることは、プロセスの中で最もエキサイティングな部分の1つです。なぜなら、あなたが作成したものを構築しているゲームの中で見ることができるからです!
メッシュをスタジオにインポートするには:
DCCアプリケーションからキャラクターをエクスポートし、以下を確認します:
- すべての法線、スケール、名前が正しいこと。
- キャラクターにはすべての関節とボーンの階層およびすべてのメッシュが含まれていること。
- メッシュは各部分で10,000三角形未満であること。
- メッシュの合計サイズが任意の軸で2000ユニットを超えないこと。
- モデル仕様の完全なリストについては、メッシュ要件を参照してください。

インポーターでカスタムの.fbxまたは.objファイルをインポートします。

クリーチャーを光らせる
クリーチャーのモデルが安定し、スタジオへの即時インポートが不要になったら、SurfaceAppearanceオブジェクト、ライト、視覚効果を組み合わせ始めました。これは、モデルの品質が十分であることを確認するために行いました。

私たちはクリーチャーを暗くし、焦点を目と「つかむ」触手に置きたいと考えていました。高いコントラストのポイントは注意を引く傾向があるため、いくつかの強いポイントを持つことで、視聴者が何に焦点を合わせるべきかを知ることができます。スタジオは自己発光するネオン素材をサポートしているため、早い段階で目を他のキャラクターの部分から独立した素材として分けました。触手についても同様のことを行い、先端だけが光るようにしました。

ネオン素材は実際の光を放出しないため、いくつかのテストの後、光の放出の配置と方向を制御するために別の部分を追加しました。これにより、目の光を強調し、独自の光源を投影するように照明を指向させることができました。

SpotLightsが他の表面やプレイヤーの近くでクリーチャーに視覚的なフレアを追加することに注意してください。

さらに、クリーチャーの触手からいくつかの粒子を放出させたいと考えたため、動くときに煙の軌跡を残すことができました。触手が非常に長いため、ParticleEmitterを触手全体に追加すると、粒子が触手全体から放出されてしまいます。これに対抗するために、触手の先端付近に小さな部分を配置し、粒子の放出サイズ、配置、方向を制御できるようにしました。

VFXをキャラクターに追従させる
スキニングされたキャラクターのメッシュ位置は、クリーチャーがアニメーションする際に更新されないため、VFX、SFX、およびライトがすべてクリーチャーに適切に追従する方法を考える必要がありました。これを達成するために、VFXコントローラスクリプトを作成し、CollectionServiceを使用してVFXを含む部分にクリーチャーの骨の位置を通知し、それに従わせました。
StarterPlayer → StarterPlayerScriptsに以下のLocalScriptを配置しました。これは基本的にVFX更新関数を実行します。
ローカルスクリプト-- 既存のローカルスクリプトにこのスニペットを追加してPreSimulation-- 接続を作成しますlocal RunService = game:GetService("RunService")local vfx = require(workspace.VfxUpdateModule)RunService.PreSimulation:Connect(vfx.updateVfx)モジュールスクリプト-- このモジュールはアニメーションが再生されるときにパーツをアニメーションに-- 付けるためのものです。これは関節とボーンの現在の制限に対する-- 回避策であり、常に必要ではありません。---- 前提条件:-- モデルには「AnimatedVfxModel」タグが必要で、アニメーションと同期させたい-- すべてのパーツのフォルダが必要です。各パーツには「AttachedBoneName」-- という属性が必要で、接続したいボーンの名前を参照します。パーツは-- 望ましいボーンに対して正しい位置にある必要があります。---- 使用方法:-- ローカルスクリプトはこのモジュールを要求し、次に-- VfxUpdateModule.updateVfxをRunService.PreSimulationイベントに接続する必要があります。local VfxUpdateModule = {}local CollectionService = game:GetService("CollectionService")-- セットアップ - これは各クライアントで一度実行されるべきです。-- タグの付いたすべてのモデルを収集しますlocal vfxModels = CollectionService:GetTagged("AnimatedVfxModel")local vfxTable = {} -- ここにすべてのパーツとオフセットを保存します-- 各モデルに、すべてのvfxパーツとオフセットを保持するテーブルを割り当てますfor _, model in vfxModels dovfxTable[model] = {}local vfxParts = model:FindFirstChild("VFX"):GetChildren() -- VFXフォルダを見つけます-- 属性を介してボーンを見つけ、各パーツのオフセットを計算します。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パーツが見つからないボーンを参照しています。")endendendprint(vfxTable)-- 更新 - これは各クライアントのRunService.PreSimulationにリンクされるべきです。-- すべてのモデルを通過し、モデル上のすべてのパーツをボーンのCFrameに合わせて更新します。function VfxUpdateModule.updateVfx()for model, vfxParts in vfxTable dofor part, bone in vfxParts dopart.CFrame = bone[1].TransformedWorldCFrame * bone[2]endendendreturn VfxUpdateModuleVFXUpdateModule ModuleScriptを作成し、AnimatedVfxModelで適切にタグ付けされたオブジェクトがプレイイベントで更新されるようにしました。
必要なモデルグループにAnimatedVfxModelタグを付け、タグセクションのプロパティを使用しました。タグを使用することで、VFXUpdateModuleが最初のVFX子を探し、更新を適用するオブジェクトを知ることができます。

最後に、アニメーションさせたいパーツにAttachedBoneNameカスタム属性を追加し、従わせたい関節の正確な名前を追加しました。
クリーチャーにテクスチャを適用する
次に、PBR(物理ベースレンダリング)テクスチャマップを設定しました。これらの強力なビットマップは、クリーチャーにさまざまな光沢と表面の変化を与え、小さな凹凸や欠陥があるように見せます。この視覚効果は、クリーチャーがプレイヤーに近づいたときの外観を売り込むのに役立ちます。

以下は、表面外観テクスチャマップを作成する方法です:
このキャラクターのテクスチャマップは、マップごとに1つの「シート」にすべて配置されていました。これにより、クリーチャーがより効率的になり、扱うテクスチャマップやSurfaceAppearanceオブジェクトが少なくて済みました。




「つかむ触手」のように光る必要がある部分や自己発光する部分には、SurfaceAppearanceの透明度を使用してそれらの部分とブレンドしました。

表面外観テクスチャマップを作成する際に、以下のガイドラインに従うと役立ちました:
- マップのサイズは1024×1024を超えないようにしてください。
- 使用したアプリケーションによっては、緑のチャンネルを反転させる必要があるかもしれません。
クリーチャーをアニメーションさせる
アニメーションは非常に主観的であり、個人のスタイルがあります。オプションには、モーションキャプチャ、DCCアプリケーションでの手動「キーフレーム」アニメーション、またはスタジオの強力なアニメーションエディタを使用することが含まれます。
前述のように、流動的な動きのために十分な関節と四肢を持たせ、クリーチャーのアニメーションが自然で「層状」に感じられるようにしたいと考えていました。レイヤリング、または二次的な動きは、日常生活で見ることができるものです。腕を投げ出すと、すべての関節が上腕からの初期の衝動に反応し、体のすべての関節が同時に動いたり休んだりすることはありません。
この技術を使用して、クリーチャーの四肢が体の動きに反応しているように感じるようにアニメーションを付けました。

外部DCCアプリケーションを使用してアニメーションを作成する場合、以下のガイドラインが最適です:
- フレームレートを少なくとも30 FPSに設定します。
- アニメーションを適用するキャラクターと同じキャラクターでアニメーションを作成します。
- アニメーションデータを別の.fbxファイルとしてエクスポートします。
私たちはスタジオの外でキャラクターをアニメーションさせたため、アニメーション.fbxファイルをインポートするためにアニメーションエディタを使用する必要がありました。エディタを使用すると、関節やモーターを持つ任意のアバターを選択し、タイムラインのポイントを介してそれらを駆動できます。
アニメーションをインポートするには:
ツールバーのアバタータブで、クリップエディタをクリックします。
Robloxでアニメーションさせたいリグ付きキャラクターを選択します。キャラクターは、外部DCCアプリケーションでリギングしているものと同じである必要があります。
エディタウィンドウの左上にある**⋯**ボタンをクリックし、FBXアニメーションからインポートを選択し、エクスポートした.fbxアニメーションファイルを見つけます。

アニメーションに満足したら、エクスポートしてアニメーションIDを取得できます。これを使用してRobloxスクリプトでアニメーションを実行できます。たとえば、インポートされたキャラクターのモデルグループにScriptを追加し、以下のコードを使用してアニメーションを実行します:
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)
最終結果
色、光の明るさ、ウィンドウの前で強いハロー効果を与えるためのいくつかの粒子効果に微調整を加えた後、宇宙ステーションでの最終結果は以下の通りです!
