Roblox では、アニメーションは、それらのアニメーションを所有するユーザーが所有する経験にロックされます。エクスペリエンスをグループに移行するときにアニメーションが壊れないようにするには、アニメーションアセットを新しいエクスペリエンスグループ所有者に公開する必要があります。
アップロードするアニメーションの数が多い場合は、コミュニティによってサポートされるツール Roblox アニメーション転送 を使用して、アニメーションを再アップロードし、古い AnimationIds を新しい対応の AnimationIds にマップできます。
必要条件
アニメーションを移行する前に、npx をインストールする必要があります。npx パッケージをシステムにインストールする必要なく、パッケージからコマンドを実行できます。npx をチェックするには、node.js をインストールしてターミナルウィンドウで npx –version を実行します。
必要条件に関する詳細は、Roblox Animation Transfer README を参照してください。
マップアニメーションIDを名前にマッピング
エクスペリエンス内のプレパレーション済みキャラクタモデルの下でアニメーションがアニメーションインスタンスとして保存されている場合、AnimationIds をそれぞれの名前にマップするテキストファイルを生成できます。
Roblox Studio では、次のスクリプトを実行します。Studio は結果を単一の長い文字列として出力します。
local Workspace = game:GetService("Workspace")local ANIMSTRING = ""for _, character in Workspace:GetChildren() doif not character:IsA("Model") thencontinueendlocal animations = character:FindFirstChild("Animations")if not animations thencontinueendfor _, animation in animations:GetChildren() dolocal animationId = string.match(animation.AnimationId, "%d+")if animationId thenANIMSTRING ..= (animationId .. " " .. character.Name .. "_" .. string.gsub(animation.Name, " ", "_") .. "\n")endendendprint(ANIMSTRING)コンピュータ上に新しいテキストファイルを作成します。
Studio で生成した文字列をテキストファイルに貼り付けます。
ファイルコンテンツに自動的に追加された追加の -Edit および -Studio 文字列など、不一致をクリーンアップします。
すべてのスペースをアンダースコアで置換して、全体のモデレートされた名前の数を制限します。
(オプション) テキストファイルを準備する
Roblox にはアニメーションのアップロードに対する内部レート制限があります。Roblox アニメーション転送ツールは、このレート制限を守らないため、転送プロセス中に問題が発生し、最終テキストファイルが壊れる可能性があります。たとえば、1200 のアニメーションを転送するかもしれませんが、転送できなかったものを決定する方法はありませんし、900 のアニメーションしか転送できません。
最終ファイルが破損しないようにするには、次のことができます:
- テキストファイルを最大 200 個のアニメーションを含む複数のファイルに分割します。
- 各個のファイルで Roblox アニメーション転送ツールを使用します。主なレート制限問題を防ぐために、各バッチの間に数分待機します。
アニメーションを移行する
テキストファイルが準備できたら、移行プロセスを開始します:
- 終端ウィンドウを開きます。
- npx roblox-animation-transfer --inFile animations.txt --group YOUR_GROUP_ID --outFile newAnimations.txt。
- --inFile は、アップロードしたいアニメーションのあるファイルを指している必要があります。このファイルは、最初に作成した大きなテキストファイルか、より小さな複数のファイルの 1つかもしれません。大きなファイルを分割することを選択した場合。
- --group は、アニメーション転送を受信するグループの GroupId にポイントする必要があります。Roblox ウェブサイトのグループの URL でグループの ID を見つけることができます。
- --outFile は、新しいアニメーションを配置したいファイルを指している必要があります。
移行プロセスが成功すると、outFile で提供されたアニメーションは、inFile で提供された順序と同じ順序でリストされます。複数のアニメーションが移行できない場合、ツールは再試行してそれらのアニメーションを移行します;この2回目の試行が成功すると、これらのアニメーションは outFile の列の最後に付加されます。
実行時にアニメーションをロードする
アニメーションを新しいグループ所有者に移行した後、古いアニメーションを新しいアニメーションに交換する必要があります。
スタジオで、Animations モジュールを作成します。
ユーザーまたはオリジナルの所有者に対応する 2つの子モジュールを作成し、グループまたは新しい所有者に対応するもう一つを作成します。
別の場所に公開することを選択した場合、エクスペリエンスが壊れないようにするには、次のスクリプトを実行します。デフォルトでは、スクリプトはユーザーのアニメーションを返します。
local module = {}local GROUP_ID = 12345678local gameContext = {["User"] = require(script:WaitForChild("Animations_User")),["Group"] = require(script:WaitForChild("Animations_Group"))}local function getAnimationMapForGameContext()if game.CreatorType == Enum.CreatorType.Group and game.CreatorId == GROUP_ID thenreturn gameContext.Groupendreturn gameContext.Userendlocal animationMap = getAnimationMapForGameContext()function module.getAnimation(animName: string)return animationMap[animName]endreturn module生成されたテキストファイルをスタジオでアニメーションマップに変換します。
- animFileText 変数内のアニメーションリストを、変更したいテキストファイルのコンテンツで置き換えます。
- 次のスクリプトを実行して、文字列を返す:
local animFileText = [[4215167 Animation_Name_16171235 Animation_Name_21251267 Animation_Name_3]]local function convertFileToAnimationMap(animFileText: string)local NEW_ANIMATION_MAP = ""local lines = string.split(animFileText, "\n")for _, line in lines dolocal components = string.split(line, " ")if #components ~= 2 thencontinueendlocal animationId = components[1]local animationName = components[2]NEW_ANIMATION_MAP = string.format("%s\t[\"%s\"] = \"rbxassetid://%s\",\n", NEW_ANIMATION_MAP, animationName, animationId)endreturn string.format("return {\n%s}", NEW_ANIMATION_MAP)endprint(convertFileToAnimationMap(animFileText))新しい ModuleScript 親モジュールを作成し、Animations モジュールに親を付けます。
返された animFileText 文字列を ModuleScript 内に配置します。
次のスクリプトを実行して、Animations モジュールを介してすべてのアニメーションをソースに更新します:
local Animations = require(PATH.TO.ANIMATIONS)local warriorWalk = Instance.new("Animation")warriorWalk.AnimationId = Animations.getAnimation("Warrior_Walk")