カスタムメッシュをインポートして、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を含むパーツにクリーチャーのボーンの位置を通知し、従わせました。
次のLocalScriptをStarterPlayer → StarterPlayerScripts内に配置しました。これは基本的にVFX更新関数を実行します。
Local Script-- このスニペットをPreSimulation接続を行う既存のローカルスクリプトに追加します。local RunService = game:GetService("RunService")local vfx = require(workspace.VfxUpdateModule)RunService.PreSimulation:Connect(vfx.updateVfx)Module Script-- このモジュールは、アニメーションが再生される際にパーツをアニメーションに接続します。これは関節とボーンの現在の制限に対する回避策であり、常に必要なわけではありません。---- 前提条件:-- 含めるには、モデルは「AnimatedVfxModel」タグが必要であり、アニメーションと同期させたいすべてのパーツのフォルダが必要です。各パーツは、接続するボーンの名前を参照する「AttachedBoneName」という属性を持っている必要があります。パーツは、望ましいボーンに対して正しい位置にすでにある必要があります。---- 使用方法:-- LocalScriptがこのモジュールを要求し、次に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)
最終結果
色、光の明るさ、そしてウィンドウの前での強いオーラ効果を与えるためのパーティクル効果などを微調整した後、宇宙ステーションでの最終結果はこちらです!
