Skip to content

Commit 7273fdc

Browse files
committed
add support for recording multiple objects from one recorder
1 parent b0cc284 commit 7273fdc

File tree

5 files changed

+131
-53
lines changed

5 files changed

+131
-53
lines changed
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
#if UNITY_2018_3_OR_NEWER
2+
using UnityEditor.Animations;
3+
#else
4+
using UnityEditor.Experimental.Animations;
5+
#endif
6+
using UnityEditor.Recorder;
7+
using UnityEditor.Recorder.Input;
8+
9+
namespace UnityEditor.Formats.Fbx.Exporter
10+
{
11+
class FbxInput : RecorderInput
12+
{
13+
public GameObjectRecorder[] gameObjectRecorder { get; private set; }
14+
float m_Time;
15+
16+
public override void BeginRecording(RecordingSession session)
17+
{
18+
var aniSettings = (FbxInputSettings)settings;
19+
20+
var srcGOs = aniSettings.gameObjects;
21+
22+
if (srcGOs == null || srcGOs.Length <= 0)
23+
return;
24+
25+
gameObjectRecorder = new GameObjectRecorder[srcGOs.Length];
26+
for (int i = 0; i < srcGOs.Length; i++)
27+
{
28+
gameObjectRecorder[i] = new GameObjectRecorder(srcGOs[i]);
29+
}
30+
31+
/*foreach (var binding in aniSettings.bindingType)
32+
{
33+
gameObjectRecorder.BindComponentsOfType(srcGOs, binding, aniSettings.recursive);
34+
}*/
35+
36+
m_Time = session.recorderTime;
37+
}
38+
39+
public override void NewFrameReady(RecordingSession session)
40+
{
41+
if (gameObjectRecorder != null && gameObjectRecorder.Length > 0 && session.isRecording)
42+
{
43+
foreach(var goRecorder in gameObjectRecorder) {
44+
goRecorder.TakeSnapshot(session.recorderTime - m_Time);
45+
}
46+
m_Time = session.recorderTime;
47+
}
48+
}
49+
}
50+
}

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

Lines changed: 11 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

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

Lines changed: 11 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

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

Lines changed: 49 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -21,61 +21,67 @@ public override void EndRecording(RecordingSession session)
2121
foreach (var input in m_Inputs)
2222
{
2323

24-
var aInput = (AnimationInput)input;
24+
var aInput = (FbxInput)input;
2525

26-
if (aInput.gameObjectRecorder == null)
26+
var recorders = aInput.gameObjectRecorder;
27+
var gameObjects = ((FbxInputSettings)aInput.settings).gameObjects;
28+
if (recorders == null || recorders.Length <= 0)
2729
continue;
2830

29-
var clip = new AnimationClip();
31+
var clips = new AnimationClip[recorders.Length];
32+
for (int i = 0; i < recorders.Length; i++)
33+
{
34+
clips[i] = new AnimationClip();
35+
36+
ars.fileNameGenerator.CreateDirectory(session);
3037

31-
ars.fileNameGenerator.CreateDirectory(session);
38+
var absolutePath = FileNameGenerator.SanitizePath(ars.fileNameGenerator.BuildAbsolutePath(session));
39+
var clipName = absolutePath.Replace(FileNameGenerator.SanitizePath(Application.dataPath), "Assets");
3240

33-
var absolutePath = FileNameGenerator.SanitizePath(ars.fileNameGenerator.BuildAbsolutePath(session));
34-
var clipName = absolutePath.Replace(FileNameGenerator.SanitizePath(Application.dataPath), "Assets");
35-
36-
//AssetDatabase.CreateAsset(clip, clipName);
37-
#if UNITY_2018_3_OR_NEWER
38-
aInput.gameObjectRecorder.SaveToClip(clip, ars.frameRate);
41+
//AssetDatabase.CreateAsset(clip, clipName);
42+
#if UNITY_2018_3_OR_NEWER
43+
recorders[i].SaveToClip(clips[i], ars.frameRate);
3944
#else
40-
aInput.gameObjectRecorder.SaveToClip(clip);
45+
recorder.SaveToClip(clip);
4146
#endif
42-
var root = ((AnimationInputSettings)aInput.settings).gameObject;
43-
clip.name = "recorded_clip";
44-
clip.legacy = true;
45-
Animation animator = root.GetComponent<Animation>();
46-
bool hasAnimComponent = true;
47-
if (!animator)
48-
{
49-
animator = root.AddComponent<Animation>();
50-
hasAnimComponent = false;
51-
}
47+
var root = gameObjects[i];
48+
clips[i].name = "recorded_clip";
49+
clips[i].legacy = true;
50+
Animation animator = root.GetComponent<Animation>();
51+
bool hasAnimComponent = true;
52+
if (!animator)
53+
{
54+
animator = root.AddComponent<Animation>();
55+
hasAnimComponent = false;
56+
}
5257

53-
AnimationClip[] prevAnimClips = null;
54-
if (hasAnimComponent)
55-
{
56-
prevAnimClips = AnimationUtility.GetAnimationClips(root);
57-
}
58+
AnimationClip[] prevAnimClips = null;
59+
if (hasAnimComponent)
60+
{
61+
prevAnimClips = AnimationUtility.GetAnimationClips(root);
62+
}
5863

59-
AnimationUtility.SetAnimationClips(animator, new AnimationClip[] { clip });
60-
var exportSettings = new ExportModelSettingsSerialize();
61-
var toInclude = ExportSettings.Include.ModelAndAnim;
62-
if (!ars.ExportGeometry)
63-
{
64-
toInclude = ExportSettings.Include.Anim;
65-
}
66-
exportSettings.SetModelAnimIncludeOption(toInclude);
67-
ModelExporter.ExportObject(clipName, root, exportSettings);
64+
AnimationUtility.SetAnimationClips(animator, new AnimationClip[] { clips[i] });
65+
var exportSettings = new ExportModelSettingsSerialize();
66+
var toInclude = ExportSettings.Include.ModelAndAnim;
67+
if (!ars.ExportGeometry)
68+
{
69+
toInclude = ExportSettings.Include.Anim;
70+
}
71+
exportSettings.SetModelAnimIncludeOption(toInclude);
72+
ModelExporter.ExportObject(clipName, root, exportSettings);
6873

6974

70-
if (hasAnimComponent)
71-
{
72-
AnimationUtility.SetAnimationClips(animator, prevAnimClips);
73-
}
74-
else
75-
{
76-
Object.DestroyImmediate(animator);
75+
if (hasAnimComponent)
76+
{
77+
AnimationUtility.SetAnimationClips(animator, prevAnimClips);
78+
}
79+
else
80+
{
81+
Object.DestroyImmediate(animator);
82+
}
83+
recorders[i].ResetRecording();
7784
}
78-
aInput.gameObjectRecorder.ResetRecording();
7985
}
8086
base.EndRecording(session);
8187
}

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

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -22,36 +22,36 @@ public bool ExportGeometry
2222
}
2323
}
2424

25-
[SerializeField] AnimationInputSettings m_AnimationInputSettings = new AnimationInputSettings();
25+
[SerializeField] FbxInputSettings m_AnimationInputSettings = new FbxInputSettings();
2626

27-
public AnimationInputSettings animationInputSettings
27+
public FbxInputSettings animationInputSettings
2828
{
2929
get { return m_AnimationInputSettings; }
3030
set { m_AnimationInputSettings = value; }
3131
}
3232

3333
public FbxRecorderSettings()
3434
{
35-
var goWildcard = DefaultWildcard.GeneratePattern("GameObject");
35+
//var goWildcard = DefaultWildcard.GeneratePattern("GameObject");
3636

37-
fileNameGenerator.AddWildcard(goWildcard, GameObjectNameResolver);
37+
//fileNameGenerator.AddWildcard(goWildcard, GameObjectNameResolver);
3838
fileNameGenerator.AddWildcard(DefaultWildcard.GeneratePattern("GameObjectScene"), GameObjectSceneNameResolver);
3939

4040
fileNameGenerator.forceAssetsFolder = true;
4141
fileNameGenerator.root = OutputPath.Root.AssetsFolder;
42-
fileNameGenerator.fileName = "animation_" + goWildcard + "_" + DefaultWildcard.Take;
42+
fileNameGenerator.fileName = "animation_" /*+ goWildcard*/ + "@" + DefaultWildcard.Take;
4343
}
4444

4545
string GameObjectNameResolver(RecordingSession session)
4646
{
47-
var go = m_AnimationInputSettings.gameObject;
48-
return go != null ? go.name : "None";
47+
var go = m_AnimationInputSettings.gameObjects;
48+
return /*go != null ? go[0].name :*/ "None";
4949
}
5050

5151
string GameObjectSceneNameResolver(RecordingSession session)
5252
{
53-
var go = m_AnimationInputSettings.gameObject;
54-
return go != null ? go.scene.name : "None";
53+
var go = m_AnimationInputSettings.gameObjects;
54+
return go != null && go.Length > 0 ? go[0].scene.name : "None";
5555
}
5656

5757
public override bool isPlatformSupported
@@ -73,7 +73,7 @@ internal override bool ValidityCheck(List<string> errors)
7373
{
7474
var ok = base.ValidityCheck(errors);
7575

76-
if (m_AnimationInputSettings.gameObject == null)
76+
if (m_AnimationInputSettings.gameObjects == null)
7777
{
7878
ok = false;
7979
errors.Add("No input object set");

0 commit comments

Comments
 (0)