カスタムメッシュをインポートして、NPC から航海ボートのアニメーションクロースに作成するなど、すべてを作成できます。 アバターインポーター (今は 3Dインポーター) のカスタム設定を使用して、謎のブラックホールのクリーチャーやフレンドリーで, 気づかない場合のサービスドロイドなどのよりエキ�
次のセクションでは、リグとスキン、PBR (表面の見た外見)、および VFX を使用して、名前を「クリーチャー」と付けた我々のより複雑なキャラクターの 1 つを構築するために、リグを作成、2>表面の見た目2>、および VFX を
リグ
クリーチャーをリグしているときに、私たちはそのキャラクターを中立的なポーズでモデル化することを最善としました、因為そのポーズは、多くの方向に曲げるのに最適です。 クリーチャーをテントクルでカールさせた状態でモデル化すると、ストレッチングが動くときに頸部を伸ばす可能性があります。次
中立ポーズから、私たちはジョイントをエコノミーに追加し、最も移動が必要なエリアに焦点を当てました。少なくともジョイントが多くあるほど、より良いです。 キャラクターのスキンを管理する必要があるため、スキンをコピーするときにジョイントを管理する必要があります。以前のスクリーンショットで
ほとんどの他の関節は、テントルやマンディブルの方向に向いています。テントルとマンディブルの間には、多くのセカンダリモーション、またはマンディブルの層を作成するために、多くのセカンダリモーションがありました。ただし、テントルの中央
次のガイドラインが役立ったので、キャラクターメッシュがスタジオに正しくインポートされます:
- 個々の関節と骨はユニークな名前を持つ必要があります。
- メッシュは、関節や骨と同じ名前を持つ必要はありません。
- メッシュにはスキン/バインド前に変換がありません;つまり、変換は 0 であり、スケールは 1 です。
- メッシュノーマルは外に向く (モデルは内側を見るべきではありません)。
- スケルトンにはスケールファクターがあるべきではありません;すべての関節は [1, 1, 1] でなければなりません。
スキンニング
クリーチャーのスケルトンが完了したら、次のステップはメッシュをスキンにすることでした。スキンには多くの作業が必要なので、事前に DCC アプリの異なるスキン設定を認識しておくことが重要です。これはオーガニックキャラクターなので、
以下のガイドラインが、スキンニングの最高の結果を生成することを発見しました:
- スキン影響 (モデルの移動時に影響を与える部分) は、1つのベクストにつき最大 4 個の影響を持つ必要があります。
- ジョイントとメッシュ名は、互いに内臓であり、また互いに外臓である必要があります。
- Studio にインポートしたいジョイントは、モデルのスキンに影響を与える必要があります。そうでないと、エンジンはそれをインポートしません。できるだけ、モデルをオリジナルまたは "バインド" ポーズでスキンします。
メッシュをスタジオにインポート中
Studio にあなたのカスタムキャラクターをインポートすることは、プロセスの面白い部分の 1 つです、なぜなら、あなたの作品を建築成中のエクスペリエンスで見ることができるからです!
メッシュをStudio:
DCC アプリケーションからキャラクターをエクスポートし、フォロー中のことを確認してください:
- すべてのノーマル、スケール、および名前は正確です。
- キャラクターには、すべての関節と骨の階層とすべてのメッシュがあります。
- メッシュの各部分のメッシュは、すべて 10,000 個の三角形以下です。
- メッシュの合計サイズは、任意の軸で 2000 を超えません。
- モデルの仕様の完全なリストについては、メッシュ要件 を参照してください。
In the 3D Importer , import the custom .fbx または .obj ファイル。
クリーチャーを光らせる
クリーチャーのモデルが安定し、Studio による追加のインポートが必要なくなったので、サーフェスの形状オブジェクト、照明、およびビジュアルエフェクトを組み合わせていきました。これを行ったのは、モデルの品質が十分であることを確認するためです。
私たちは、クリーチャーが暗いことを知っていました、そして、焦点の目はその眼とその「つかみ」のテントルであることを知りたかった。高いコントラストは注目を引きやすいので、いくつか強いものを持つことで、視聴者が視点を合わせることができます。Studio は、
ネオン素材は実際の光を放出しないので、いくつかのテスト後、私たちは光の放出方法と方向を制御するために別のパーツを追加しました。これにより、照明が目を輝かせる方法を向上させ、また自分の光のソースをプロジェクトすることができました。
SpotLights は、他の表面またはプレイヤーの近くにあるクリーチャーに視覚的なフレアを追加することに注意してください。
さらに、クリーチャーのテンテークルがパーティクルを放出するため、それらは移動すると煙のトレイルを残します。テンテークルが非常に長いため、テンテークル全体に ParticleEmitter を追加すると、パーティクルがテンテークルの先ではなく、全体
VFX をキャラクターに追跡させる
スキンチャーのメッシュポジションは、クリーチャーアニメーションが更新されるときには更新されませんので、VFX、SFX、ライトがクリーチャーを適切に追跡するようにする方法が必要でした。これを実現するために、VFX コントローラースクリプトを作成し、CollectionService を使用して、クリーチャーの骨が含まれている部分を
We placed the following LocalScript in StarterPlayer → StarterPlayerScripts 。これは、基本的に 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")-- セットアップ - これはすべてのクライアントで 1 回実行する必要があります。-- タグですべてのモデルを集めるlocal vfxModels = CollectionService:GetTagged("AnimatedVfxModel")local vfxTable = {} -- ここに私たちはすべてのパーツとオフセットを保存します-- すべての VFX パーツとオフセットを持つモデルにテーブルを割り当てるfor _, model in vfxModels dovfxTable[model] = {}local vfxParts = model:FindFirstChild("VFX"):GetChildren() -- Find theVFX フォルダ-- アトリビュートを通じて骨を見つけ、各パーツのオフセットを計算します。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 part refers to bone that could not be found.")endendendprint(vfxTable)-- 更新 - これは、すべてのクライアントの RunService.PreSimulation にリンクされる必要があります。-- すべてのモデルをスキャンし、モデル内のすべてのパーツを更新して、ボーネックフレームに一致させます。function VfxUpdateModule.updateVfx()for model, vfxParts in vfxTable dofor part, bone in vfxParts dopart.CFrame = bone[1].TransformedWorldCFrame * bone[2]endendendreturn VfxUpdateModuleWe created a VFXUpdateModule ModuleScript to tell any objects tagged appropriately with AnimatedVfxModel to update on a play event.
タグエディタ を使用して、AnimatedVFXModel に必要なモデルグループに必要なタグを付けました。ビュー タブからアクセス可能な タグエディタ を使用すると、2>VFXUpdateModule2> が最初の VFX 子として検索するオブジェクトを知り、更アップデートを適用できます。
最後に、 骨の名前 を追加したパーツにアニメーションを追加し、共同の名前を追加しました。
クリーチャーをテクスチャ
次に、PBR (Physically Base Rendered) テクスチャマップを設定します。これらの強力なビットマップは、クリーチャーにさまざまなシェンジャーと表面のバリエーションを与え、小さなバンプや欠陥のように見えるようにします。このビジュアルエフェクトは、クリーチャーがプレイヤーに近づいたときに見た目を販売するのに役立
ここに、表面のテクスチャマップを作成する方法を説明しています:
このキャラクターのテクスチャマップは、すべて1つの「紙」です。これにより、クリーチャーがより効率的になり、テクスチャマップを少なく扱わなければならなかったり、 SurfaceAppearance オブジェクトを扱わなければならなかったりしました。
「grabby tentacles」など、輝かなければ自分自身を光らせる必要があるエリアには、SurfaceAppearance に透明効果を使用して、それらのパーツと混合しました。
サーフェスアイテムのテクスチャマップを作成するときに、これらのガイドラインに従うことが有用であることがわかりました:
- マップが 1024×1024 より大きい場合は、
- あなたの緑のチャンネルは、あなたが作業しているアプリケーションによって反転する必要があります。
クリーチャーのアニメーション
アニメーションは非常に主観的であり、個人スタイルを持つ。オプションには、モーションキャプチャ、手の "キーフレーム" アニメーションを DCC アプリケーションで、または Studio の強力なアニメーションエディタを使用することがあります。
以前に述べたように、我々は液体の動きに対して十分な共同があり、また、十分な数のリムがあることを確認したいと思いました。そのため、クリーチャーアニメーションが自然で「レイヤード」感じるように、レイヤーを作成することにしました。レイヤーは、上腕の腕を投げると、すべ
このテクニックを使用して、クリーチャーが体の動きに反応するように感じるために、このショート動画に示すように、ボディの動きに反応しているようにアニメートしました:
外部のDCC アプリケーションをアニメーションに使用する場合、次のガイドラインが最も効果的であることがわかりました:
- フレームレートを最低 30 FPS に設定します。
- 適用するキャラクターと同じアニメーションを作成します。
- アニメーションデータを別の .fbx ファイルとしてエクスポートします。
Studio の外でキャラクターをアニメーション化するために、アニメーションエディタを使用する必要がありました。エディタでは、ジョイントまたはモーターを持つアバターを選択し、スタイルシーンのポイントでドライブすることができます。
アニメーションをインポートするには:
[プラグイン] タブでアニメーションエディタを選択します。
Roblox でアニメーションするリグされたキャラクターを選択します。キャラクターは、外部の DCC アプリケーションでリグしているキャラクターと同じでなければなりません。
編集ウィンドウの左上領域のボタンをクリックし、.fbx を選択し、エクスポートした .fbx アニメーションファイルをロケートします。
アニメーションに満足したら、Script をエクスポートして、Roblox スクリプトで実行するためのアニメーション ID を発見できます。たとえば、インポートされたキャラクターのモデルグループに Class.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)
最終結果
色、明るさ、さらにパーティクルエフェクトをいくつか追加して、窓の前で強い光のオーラを与えるために、ここは宇宙ステーションの最終結果です!