[MenuItem("Kit/Timeline/修改StoryExposedObject的链接")]
static void SetStoryExposedObjectPath()
{
UnityEngine.Object[] selObjs = Selection.GetFiltered(typeof(UnityEngine.Object), SelectionMode.DeepAssets);
if (selObjs == null || selObjs.Length == 0)
{
Debug.LogError("请选择需要修改的文件路径!");
return;
}
foreach (UnityEngine.Object obj in selObjs)
{
if (obj.GetType() != typeof(GameObject))
continue;
GameObject story = (GameObject)obj;
PlayableDirector[] pds = story.GetComponentsInChildren<PlayableDirector>();
if (pds == null)
continue;
if (pds.Length == 0)
continue;
for (int i = 0; i < pds.Length;++i)
{
PlayableDirector pd = pds[i];
TimelineAsset timeline = (TimelineAsset)pd.playableAsset;
Debug.Log("timeline: " + timeline.name);
IEnumerable<TrackAsset> tracks = timeline.GetOutputTracks();
IEnumerator it_track = tracks.GetEnumerator();
while (it_track.MoveNext())
{
TrackAsset track = (TrackAsset)it_track.Current;
IEnumerable<TimelineClip> clips = track.GetClips();
IEnumerator it_clip = clips.GetEnumerator();
while (it_clip.MoveNext())
{
TimelineClip clip = (TimelineClip)it_clip.Current;
if (clip.asset.GetType() == typeof(Playable_ActiveObj))
{
Playable_ActiveObj playable = clip.asset as Playable_ActiveObj;
if (playable)
{
SetReferenceValueName(playable.Obj,pd,out playable.Name, out playable.ParentName);
}
}
}
}
}
}
}
static void SetReferenceValueName(ExposedReference<GameObject> Obj, PlayableDirector pd,out string Name,out string ParentName)
{
bool isvalid = false;
Object temp_ = null;
Object defaultObjet = Obj.defaultValue;
if (defaultObjet != null)
{
temp_ = defaultObjet;
}
else
{
temp_ = pd.GetReferenceValue(Obj.exposedName, out isvalid);
}
if (temp_ != null)
{
GameObject temp = temp_ as GameObject;
Name = temp.name;
ParentName = temp.transform.parent.parent.name;
pd.SetReferenceValue(Obj.exposedName, null);
}
else
{
Name = "";
ParentName = "";
}
}