float UAnimInstance::PlaySlotAnimation(UAnimSequenceBase* Asset, FName SlotNodeName, float BlendInTime, float BlendOutTime, float InPlayRate) { // create temporary montage and play bool bValidAsset = Asset && !Asset->IsA(UAnimMontage::StaticClass()); if (!bValidAsset) { // user warning UE_LOG(LogAnimation, Warning, TEXT("Invalid Asset. If Montage, use Montage_Play")); return 0.f; } if (SlotNodeName == NAME_None) { // user warning UE_LOG(LogAnimation, Warning, TEXT("SlotNode Name is required. Make sure to add Slot Node in your anim graph and name it.")); return 0.f; } USkeleton * AssetSkeleton = Asset->GetSkeleton(); if (!CurrentSkeleton->IsCompatible(AssetSkeleton)) { UE_LOG(LogAnimation, Warning, TEXT("The Skeleton isn't compatible")); return 0.f; } // now play UAnimMontage * NewMontage = NewObject<UAnimMontage>(); NewMontage->SetSkeleton(AssetSkeleton); // add new track FSlotAnimationTrack NewTrack; NewTrack.SlotName = SlotNodeName; FAnimSegment NewSegment; NewSegment.AnimReference = Asset; NewSegment.AnimStartTime = 0.f; NewSegment.AnimEndTime = Asset->SequenceLength; NewSegment.AnimPlayRate = 1.f; NewSegment.StartPos = 0.f; NewMontage->SequenceLength = Asset->SequenceLength; NewTrack.AnimTrack.AnimSegments.Add(NewSegment); FCompositeSection NewSection; NewSection.SectionName = TEXT("Default"); NewSection.StartTime = 0.f; // add new section NewMontage->CompositeSections.Add(NewSection); NewMontage->BlendInTime = BlendInTime; NewMontage->BlendOutTime = BlendOutTime; NewMontage->SlotAnimTracks.Add(NewTrack); return Montage_Play(NewMontage, InPlayRate); }
UObject* UAnimMontageFactory::FactoryCreateNew(UClass* Class, UObject* InParent, FName Name, EObjectFlags Flags, UObject* Context, FFeedbackContext* Warn) { if (TargetSkeleton || SourceAnimation) { UAnimMontage* AnimMontage = ConstructObject<UAnimMontage>(Class,InParent,Name,Flags); if(SourceAnimation) { USkeleton* SourceSkeleton = SourceAnimation->GetSkeleton(); //Make sure we haven't asked to create an AnimComposite with mismatching skeletons check(TargetSkeleton == NULL || TargetSkeleton == SourceSkeleton); TargetSkeleton = SourceSkeleton; FAnimSegment NewSegment; NewSegment.AnimReference = SourceAnimation; NewSegment.AnimStartTime = 0.f; NewSegment.AnimEndTime = SourceAnimation->SequenceLength; NewSegment.AnimPlayRate = 1.f; NewSegment.LoopingCount = 1; NewSegment.StartPos = 0.f; FSlotAnimationTrack NewTrack; NewTrack.AnimTrack.AnimSegments.Add(NewSegment); NewTrack.SlotName = FAnimSlotGroup::DefaultSlotName; AnimMontage->SlotAnimTracks.Add( NewTrack ); AnimMontage->SetSequenceLength(SourceAnimation->SequenceLength); } AnimMontage->SetSkeleton(TargetSkeleton); return AnimMontage; } return NULL; }