Skip to content

Commit b4e58a2

Browse files
committed
simplify animation export workflows
1 parent c215fab commit b4e58a2

File tree

2 files changed

+32
-53
lines changed

2 files changed

+32
-53
lines changed

com.unity.formats.fbx/Editor/FbxExporter.cs

Lines changed: 25 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -2323,7 +2323,7 @@ private void TransferMotion(Transform source, Transform dest, float sampleRate,
23232323

23242324
for (int k = 0; k < 3; k++) {
23252325
posKeyFrames [k][keyIndex] = new Keyframe(currSampleTime, (float)translation [k]);
2326-
rotKeyFrames [k][keyIndex] = new Keyframe(currSampleTime, (float)rot [k]);
2326+
rotKeyFrames [k][keyIndex] = new Keyframe(currSampleTime, rot [k]);
23272327
scaleKeyFrames [k][keyIndex] = new Keyframe(currSampleTime, (float)scale [k]);
23282328
}
23292329
keyIndex++;
@@ -2734,18 +2734,6 @@ internal int ExportAnimationOnly(
27342734
}
27352735
}
27362736

2737-
// export animation
2738-
// export default clip first
2739-
if (exportData.defaultClip != null) {
2740-
var defaultClip = exportData.defaultClip;
2741-
ExportAnimationClip (defaultClip, exportData.animationClips[defaultClip], fbxScene);
2742-
exportData.animationClips.Remove (defaultClip);
2743-
}
2744-
2745-
foreach (var animClip in exportData.animationClips) {
2746-
ExportAnimationClip (animClip.Key, animClip.Value, fbxScene);
2747-
}
2748-
27492737
return numObjectsExported;
27502738
}
27512739

@@ -3012,7 +3000,7 @@ internal static Dictionary<GameObject, IExportData> GetExportData(Object[] objec
30123000

30133001
Dictionary<GameObject, IExportData> exportData = new Dictionary<GameObject, IExportData>();
30143002

3015-
if (exportOptions.ModelAnimIncludeOption != ExportSettings.Include.Anim)
3003+
if (exportOptions.ModelAnimIncludeOption == ExportSettings.Include.Model)
30163004
{
30173005
return null;
30183006
}
@@ -3174,21 +3162,7 @@ private bool ExportComponents(FbxScene fbxScene, bool exportAnim = true)
31743162
}
31753163

31763164
ExportConstraints(unityGo, fbxScene, fbxNode);
3177-
3178-
// check if this object contains animation, keep track of it
3179-
// if it does
3180-
if (exportAnim && GameObjectHasAnimation (unityGo) ) {
3181-
animationNodes.Add (unityGo);
3182-
}
31833165
}
3184-
3185-
// export all GameObjects that have animation
3186-
if (animationNodes.Count > 0) {
3187-
foreach (var go in animationNodes) {
3188-
ExportAnimation (go, fbxScene);
3189-
}
3190-
}
3191-
31923166
return true;
31933167
}
31943168

@@ -3366,7 +3340,7 @@ internal int ExportAll (
33663340
}
33673341

33683342
try {
3369-
bool animOnly = exportData != null ;
3343+
bool animOnly = exportData != null && ExportOptions.ModelAnimIncludeOption == ExportSettings.Include.Anim;
33703344
bool status = false;
33713345
// Create the FBX manager
33723346
using (var fbxManager = FbxManager.Create ()) {
@@ -3508,6 +3482,28 @@ internal int ExportAll (
35083482
}
35093483
}
35103484

3485+
foreach (var unityGo in revisedExportSet)
3486+
{
3487+
IExportData iData;
3488+
if(!exportData.TryGetValue(unityGo, out iData))
3489+
{
3490+
continue;
3491+
}
3492+
var data = iData as AnimationOnlyExportData;
3493+
// export animation
3494+
// export default clip first
3495+
if (data.defaultClip != null)
3496+
{
3497+
var defaultClip = data.defaultClip;
3498+
ExportAnimationClip(defaultClip, data.animationClips[defaultClip], fbxScene);
3499+
data.animationClips.Remove(defaultClip);
3500+
}
3501+
3502+
foreach (var animClip in data.animationClips)
3503+
{
3504+
ExportAnimationClip(animClip.Key, animClip.Value, fbxScene);
3505+
}
3506+
}
35113507
// Set the scene's default camera.
35123508
SetDefaultCamera (fbxScene);
35133509

com.unity.formats.fbx/Editor/Sources/Recorders/FbxRecorder/FbxRecorder.cs

Lines changed: 7 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -45,42 +45,25 @@ protected override void EndRecording(RecordingSession session)
4545
#endif
4646
var root = ((AnimationInputSettings)aInput.settings).gameObject;
4747
clip.name = "recorded_clip";
48-
clip.legacy = true;
49-
Animation animator = root.GetComponent<Animation>();
50-
bool hasAnimComponent = true;
51-
if (!animator)
52-
{
53-
animator = root.AddComponent<Animation>();
54-
hasAnimComponent = false;
55-
}
56-
57-
AnimationClip[] prevAnimClips = null;
58-
if (hasAnimComponent)
59-
{
60-
prevAnimClips = AnimationUtility.GetAnimationClips(root);
61-
}
6248

63-
AnimationUtility.SetAnimationClips(animator, new AnimationClip[] { clip });
6449
var exportSettings = new ExportModelSettingsSerialize();
6550
exportSettings.SetAnimationSource(settings.TransferAnimationSource);
6651
exportSettings.SetAnimationDest(settings.TransferAnimationDest);
52+
exportSettings.SetObjectPosition(ExportSettings.ObjectPosition.WorldAbsolute);
6753
var toInclude = ExportSettings.Include.ModelAndAnim;
6854
if (!settings.ExportGeometry)
6955
{
7056
toInclude = ExportSettings.Include.Anim;
7157
}
7258
exportSettings.SetModelAnimIncludeOption(toInclude);
73-
ModelExporter.ExportObject(clipName, root, exportSettings);
7459

60+
var exportData = new AnimationOnlyExportData();
61+
exportData.CollectDependencies(clip, root, exportSettings);
62+
var exportDataContainer = new Dictionary<GameObject, IExportData>();
63+
exportDataContainer.Add(root, exportData);
64+
65+
ModelExporter.ExportObjects(clipName, new UnityEngine.Object[] { root }, exportSettings, exportDataContainer);
7566

76-
if (hasAnimComponent)
77-
{
78-
AnimationUtility.SetAnimationClips(animator, prevAnimClips);
79-
}
80-
else
81-
{
82-
Object.DestroyImmediate(animator);
83-
}
8467
aInput.GameObjectRecorder.ResetRecording();
8568
}
8669
base.EndRecording(session);

0 commit comments

Comments
 (0)