目前還不清楚如何用C++代碼來實現(xiàn)BlendSpace和Montage的邏輯,如果這兩個文件也不我們創(chuàng)建了,那么以下內(nèi)容就是真正意義上的純C++實現(xiàn)角色藍(lán)圖和動畫藍(lán)圖。
邏輯用C++,動畫處理用藍(lán)圖,對于有一定復(fù)雜度的項目來說這種做法很不方便,最方便的方式就是所有跟藍(lán)圖相關(guān)的操作能夠讓C++編碼實現(xiàn)。即使是簡單項目,但是如果模型數(shù)量有幾十個,每個模型的動畫切換邏輯是一樣的,讓你給每一個模型編輯動畫狀態(tài)機(jī)也是個體力活,所以如果這些可以用C++代碼實現(xiàn)的話,只寫一遍動畫操作的邏輯,就可以一勞永逸。
用C++代碼指定Actor的SkeletalMesh
用過藍(lán)圖的都知道,一般指定SkeletalMesh是在角色藍(lán)圖中指定的:
現(xiàn)在沒有角色藍(lán)圖了,設(shè)置SkeletalMesh的C++代碼如下:
- USkeletalMesh* MyMesh = LoadObject<USkeletalMesh>(NULL, TEXT("SkeletalMesh'/Game/MyMesh.MyMesh'"));
- MyActor* Actor = World->SpawnActor<MyActor>(FVector(1000, 1000, 0), FRotator(0, 0, 0));
- Actor->GetMesh()->SetSkeletalMesh(MyMesh);
用C++代碼播放BlendSpace (1D、2D均可)
因為動畫藍(lán)圖也沒有了,所以播放BlendSpace和AnimationSequence也通過C++代碼實現(xiàn):
兩種材質(zhì)的類型在C++中分別對應(yīng)UBlendSpace和UAnimSequence。
1,先定義一個UPROPERTY變量,并在編輯器中設(shè)置該BlendSpace
- UPROPERTY(BlueprintReadOnly, EditAnywhere, Category = "Anims")
- UBlendSpace1D *BlendSpace;
2,設(shè)置BlendSpace參數(shù)并播放動畫,這里BlendSpace假設(shè)以X軸為方向
需要包含頭文件:#include "Runtime/Engine/Classes/Animation/SkeletalMeshActor.h"
- ASkeletalMeshActor *Skel = Cast<ASkeletalMeshActor>(MyActor);
- if (Skel)
- {
- USkeletalMeshComponent *Mesh = Skel->GetSkeletalMeshComponent();
- if (Mesh)
- {
- Mesh->PlayAnimation(BlendSpace, true);
- FVector BlendParams(50.0f, 0.0f, 0.0f);
- Mesh->GetSingleNodeInstance()->SetBlendSpaceInput(BlendParams);
- }
- }
用C++代碼在指定Slot位置播放AnimationSequence
1,先定義一個UPROPERTY變量,并在編輯器中設(shè)置該UAnimSequence
- UPROPERTY(BlueprintReadOnly, EditAnywhere, Category = "Anims");
- UAnimSequence *MyAnimSequence;
2,在指定插槽Slot上播放:
- USkeletalMeshComponent *Mesh = MyActor->FindComponentByClass<USkeletalMeshComponent>();
- if (Mesh)
- {
- UAnimInstance *AnimInst = Mesh->GetAnimInstance();
- if (AnimInst)
- {
- AnimInst->PlaySlotAnimationAsDynamicMontage(MyAnimSequence, TEXT("UpperBody"), 0.1f, 0.1f, 1.0f, 30.0f);
- }
- }
http://aigo.iteye.com/blog/2285001