? 久久伊人中文无码精品,久久精品国产在9互動交流
聯(lián)系我們

給我們留言

聯(lián)系我們

地址:福建省晉江市青陽街道洪山路國際工業(yè)設(shè)計園納金網(wǎng)

郵箱:info@narkii.com

電話:0595-82682267

(周一到周五, 周六周日休息)

當(dāng)前位置:主頁 > 3D教程 > 圖文教程

UE4不使用角色藍(lán)圖、動畫藍(lán)圖、狀態(tài)機(jī),用“2

來源: 52VR | 責(zé)任編輯:傳說的落葉 | 發(fā)布時間: 2019-06-06 08:17 | 瀏覽量:

目前還不清楚如何用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)圖中指定的:
 

[UE4]不使用角色藍(lán)圖、動畫藍(lán)圖、狀態(tài)機(jī),用“24K純C++”實現(xiàn)動畫播放

 

現(xiàn)在沒有角色藍(lán)圖了,設(shè)置SkeletalMesh的C++代碼如下:

 
  1. USkeletalMesh* MyMesh = LoadObject<USkeletalMesh>(NULL, TEXT("SkeletalMesh'/Game/MyMesh.MyMesh'"));  
  2. MyActor* Actor = World->SpawnActor<MyActor>(FVector(1000, 1000, 0), FRotator(0, 0, 0));  
  3. Actor->GetMesh()->SetSkeletalMesh(MyMesh);  

 
  

用C++代碼播放BlendSpace (1D、2D均可)

因為動畫藍(lán)圖也沒有了,所以播放BlendSpace和AnimationSequence也通過C++代碼實現(xiàn):
兩種材質(zhì)的類型在C++中分別對應(yīng)UBlendSpaceUAnimSequence。
 

 1,先定義一個UPROPERTY變量,并在編輯器中設(shè)置該BlendSpace

 
  1. UPROPERTY(BlueprintReadOnly, EditAnywhere, Category = "Anims")  
  2. UBlendSpace1D *BlendSpace;  
 

 

2,設(shè)置BlendSpace參數(shù)并播放動畫,這里BlendSpace假設(shè)以X軸為方向

 需要包含頭文件:#include "Runtime/Engine/Classes/Animation/SkeletalMeshActor.h"

Cpp代碼  收藏代碼
  1. ASkeletalMeshActor *Skel = Cast<ASkeletalMeshActor>(MyActor);  
  2. if (Skel)  
  3. {  
  4.     USkeletalMeshComponent *Mesh = Skel->GetSkeletalMeshComponent();  
  5.     if (Mesh)  
  6.     {  
  7.         Mesh->PlayAnimation(BlendSpace, true);  
  8.         FVector BlendParams(50.0f, 0.0f, 0.0f);  
  9.         Mesh->GetSingleNodeInstance()->SetBlendSpaceInput(BlendParams);  
  10.     }  
  11. }  
 

  

用C++代碼在指定Slot位置播放AnimationSequence

1,先定義一個UPROPERTY變量,并在編輯器中設(shè)置該UAnimSequence

 

  1. UPROPERTY(BlueprintReadOnly, EditAnywhere, Category = "Anims");  
  2. UAnimSequence *MyAnimSequence;  
 
2,在指定插槽Slot上播放:
 
  1. USkeletalMeshComponent *Mesh = MyActor->FindComponentByClass<USkeletalMeshComponent>();  
  2. if (Mesh)  
  3. {  
  4.     UAnimInstance *AnimInst = Mesh->GetAnimInstance();  
  5.     if (AnimInst)  
  6.     {  
  7.         AnimInst->PlaySlotAnimationAsDynamicMontage(MyAnimSequence, TEXT("UpperBody"), 0.1f, 0.1f, 1.0f, 30.0f);  
  8.     }  
  9. }  
  10.    
注:GetAnimInstance之前需要SetAnimInstanceClass,如何設(shè)置,參見:
http://aigo.iteye.com/blog/2285001

3,播放AnimMontage:
 
  1. MyAnimTimer = AnimInstance->Montage_Play(MyMontage);  
  2. GetWorldTimerManager().SetTimer(PauseMontageTimerHandle, this, &MyActor::PauseMontageFunc, MyAnimTimer, false);  
上面例子中UBlendSpace1D和UAnimSequence變量可以在編輯器中設(shè)置以外,也可以通過C++代碼加載設(shè)置,具體方法:

C++實現(xiàn)動態(tài)加載的問題:LoadClass<T>()和LoadObject<T>()

http://aigo.iteye.com/blog/2281558

 

文章參考自:

How can I play animations strictly from C++? 這個帖子講了如何不使用動畫藍(lán)圖,不使用動畫狀態(tài)機(jī),純C++編碼方式實現(xiàn)動畫播放。

https://answers.unrealengine.com/questions/292345/how-can-i-play-animations-strictly-from-c.html


Animation Blueprint, Implement Custom C++ Logic Via Tick Updates

https://wiki.unrealengine.com/Animation_Blueprint,_Implement_Custom_C%2B%2B_Logic_Via_Tick_Updates
 

Using Additive Animations

https://docs.unrealengine.com/latest/INT/Engine/Animation/AnimHowTo/AdditiveAnimations/index.html



相關(guān)文章
網(wǎng)友評論

您需要登錄后才可以發(fā)帖 登錄 | 立即注冊

關(guān)閉

全部評論:0條

推薦
熱門