Загрузить Prefab и AnimationClips из разных AssetBundle

Я пытаюсь загрузить Prefab из одного AssetBundle и соответствующие ему AnimationClips из другого. На данный момент загрузка Prefab из AssetBundle и Instantiate прошла успешно.

AssetBundle assetBundle = AssetBundle.LoadFromFile(path);
if (assetBundle == null) {
     return;
}

GameObject prefab = assetBundle.LoadAsset<GameObject>(name);
Instantiate(prefab, targetTransform.position, targetTransform.rotation);
assetBundle.Unload(false);

Загрузка AnimationClips (устаревшие анимации) и добавление их к созданному выше игровому объекту также выполняется успешно.

AssetBundle assetBundle = AssetBundle.LoadFromFile(path);
if (assetBundle == null) {
     return;
}

List<AnimationClip> animationClips = new List<AnimationClip>();
foreach (string name in names) {
     AnimationClip animationClip = assetBundle.LoadAsset<AnimationClip>(name);
     if (animationClip != null) {
        animationClips.Add(animationClip);
     }
}
assetBundle.Unload(false);

Когда я пытаюсь воспроизвести анимацию, она не работает, и я не получаю никаких ошибок.

Animation animation = prefab.GetComponent<Animation>();

foreach (AnimationClip animationClip in animationClips) {
      string clipName = animationClip.name;
      animation.AddClip(animationClip, clipName);
}
foreach (AnimationClip animationClip in animationClips) {
      string clipName = animationClip.name;
      animation.PlayQueued(clipName, QueueMode.CompleteOthers);
}

Я что-то упустил или как это должно быть сделано?


person Vignesh    schedule 26.09.2018    source источник
comment
Сборка чего? Сетка с прикрепленным к ней компонентом анимации?   -  person Programmer    schedule 26.09.2018
comment
@Programmer Да Сетка игрового объекта и компонент анимации прикреплены.   -  person Vignesh    schedule 26.09.2018


Ответы (1)


Проблема в том, что вы пытаетесь воспроизвести анимацию на префабе вместо созданного объекта:

GameObject prefab = assetBundle.LoadAsset<GameObject>(name);
//You instantiated object but did nothing with it. What's the point of the instantiation?
Instantiate(prefab, targetTransform.position, targetTransform.rotation);
//Don't do this. The Animation is attached to the prefab
Animation animation = prefab.GetComponent<Animation>();

Когда вы вызываете функцию Instantiate, она возвращает экземпляр объекта. Этот возвращаемый объект — это то, что вы должны использовать, чтобы получить компонент Animation, а затем воспроизвести анимацию. Обратите внимание, что ваш код не завершен, поэтому могут быть другие проблемы, но эта также может вызвать проблему, которая у вас есть.

GameObject prefab = assetBundle.LoadAsset<GameObject>(name);
//Instantiate the prefab the return the instantiated object
GameObject obj = Instantiate(prefab, targetTransform.position, targetTransform.rotation);
//Get the Animation component from the instantiated prefab
Animation animation = obj.GetComponent<Animation>();

Теперь вы можете играть в нее.

person Programmer    schedule 26.09.2018