1. 程式人生 > >UE4新手之程式設計指南

UE4新手之程式設計指南

  虛幻引擎4為程式設計師提供了兩套工具集,可共同使用來加速開發的工作流程。 新的遊戲類、Slate和Canvas使用者介面元素以及編輯器功能可以使用C++語言來編寫,並且在使用Visual Studio 或 XCode之一編譯後可以在虛幻編輯器中反映出全部變更內容。 藍圖視覺化腳本系統是一個強勁的工具,可以讓類通過連線函式區塊和屬性引用來在編輯器中進行建立。

  C++類可以作為藍圖類的基類使用,並且這樣的話,程式設計師就可以設定基礎的遊戲類,隨後,它們由關卡設計師來進行子類和迭代處理。

虛幻引擎API引用

虛幻引擎架構

無論您使用C++、藍圖還是同時使用兩者來程式設計,底層的虛幻架構是相同的。

虛幻引擎遊戲的遊戲性

資源處理參考指南

動畫節點技術指南

動畫節點用於在Vim 藍圖 中執行 操作,比如混合姿勢或直接操作骨骼。雖然僅提供了幾個動畫節點, 但是您可以建立自定義節點來滿足任何遊戲的需要。

動畫節點剖析

動畫節點由兩部分組成:

  • 一個執行時結構體,它執行真正的操作來生成輸出姿勢。

  • 一個編輯器中使用的容器類,用於在圖表中處理節點的顯示效果和功能, 比如,節點標題和關聯選單。

要想新增一個新動畫節點,就必須建立這兩個部分內容。

節點層次結構

儘管可以建立節點的層次結構,但任何在編輯器中使用的非抽象類都應該正確地包含 一個執行時節點(當進行繼承時不要新增任何額外的節點,除非父類是抽象類且沒有包含任何節點)。 請參照 UAnimGraphNode_BlendListBase 獲得示例。

執行時節點

執行時結構體繼承於 FAnimNode_Base ,負責初始化、更新及操作一個或多個 輸入姿勢來生成期望的輸出姿勢。它還聲明瞭節點執行期望操作所需的 任何輸入姿勢連線和屬性。

姿勢輸入

在執行時節點中,通過建立 FPoseLinkFComponentSpacePoseLink 型別的屬性來暴露姿勢輸入 。當在本地空間中應用姿勢時使用 FPoseLink,比如 混合動畫。當在元件空間中應用姿勢時使用 FComponentSpacePoseLink 。 比如,應用骨架控制器。

一個節點可以具有一個單獨的姿勢輸入:

本地空間

UPROPERTY(Category=Links)
FPoseLink BasePose;

元件空間

UPROPERTY(Category=Links)
FComponentSpacePoseLink ComponentPose;


元件空間姿勢引腳是藍色的。

或者,節點也可以具有多個輸入,用於混合多個動畫:

UPROPERTY(Category=Links)
FPoseLink Base;

UPROPERTY(Category=Links)
FPoseLink Additive;
每個這樣的屬性都會導致顯示一個姿勢連線。這種型別的屬性總是暴露為 輸入引腳。這些引腳不能進行選擇性地隱藏或僅用作 詳細資訊 面板中 的可編輯屬性。

屬性和資料輸入

動畫節點可以有多個屬性(比如一個alpha 或 變換資料),用於執行節點的操作 。這些屬性的宣告方式和其他屬性一樣,使用 UPROPERTY() 巨集進行宣告。

UPROPERTY(Category=Settings, meta(PinShownByDefault))

mutable float Alpha;

通過使用特殊的元資料關鍵字,可以將動畫節點的屬性暴露為資料輸入,從而可以向該 節點傳入值。這允許節點的屬性使用在節點之外計算的值。 以下是可用的元資料關鍵字:

編輯器節點

編輯器類繼承於 UAnimGraphNode_Base ,負責類似於顯示節點標題或 新增關聯選單動作這樣的事情。

在編輯器中使用的類應該包含一個您的執行時節點的例項,且該例項暴露為可編輯狀態。

UPROPERTY(Category=Settings)
FAnimNode_ApplyAdditive Node;

標題

在角色編輯器內的 動畫藍圖 的圖表中顯示的動畫節點的背景顏色和標題文字, 是通過過載 GetNodeTitle()GetNodeTitleColor() 函式定義的。

比如, UAnimGraphNode_ApplyAdditive 節點使用灰色背景,且顯示 "Apply Additive":

FLinearColor UAnimGraphNode_ApplyAdditive::GetNodeTitleColor() const
{
    return FLinearColor(0.75f, 0.75f, 0.75f);
}

FString UAnimGraphNode_ApplyAdditive::GetNodeTitle(ENodeTitleType::Type TitleType) const
{
    return TEXT("Apply Additive");
}


工具提示資訊

在角色編輯器中,當滑鼠懸停到節點上時顯示的工具提示資訊,該資訊是通過過載 GetTooltip() 函式定義的。

FString UAnimGraphNode_ApplyAdditive::GetTooltip() const
{
    return TEXT("Apply additive animation to normal pose");
}

關聯選單

每個動畫節點可以新增節點相關的選項到關聯選單中,當您右擊角色編輯器中的圖表中的節點時會顯示該 關聯選單。這些選項是通過 GetContextMenuActions() 函式新增的,該函式 是所有藍圖節點的成員函式。

比如, UAnimGraphNode_LayeredBoneBlend 節點新增選單項,用於新增新的輸入或刪除現有輸入:

void UAnimGraphNode_LayeredBoneBlend::GetContextMenuActions(const FGraphNodeContextMenuBuilder& Context) const
{
    if (!Context.bIsDebugging)
    {
        if (Context.Pin != NULL)
        {
            // we only do this for normal BlendList/BlendList by enum, BlendList by Bool doesn't support add/remove pins
            if (Context.Pin->Direction == EGPD_Input)
            {
                //@TODO: Only offer this option on arrayed pins
                Context.MenuBuilder->BeginSection("AnimNodesLayeredBoneBlend", NSLOCTEXT("A3Nodes", "LayeredBoneBlend", "Layered Bone Blend").ToString());
                {
                    Context.MenuBuilder->AddMenuEntry(FGraphEditorCommands::Get().RemoveBlendListPin);
                }
                Context.MenuBuilder->EndSection();
            }
        }
        else
        {
            Context.MenuBuilder->BeginSection("AnimNodesLayeredBoneBlend", NSLOCTEXT("A3Nodes", "LayeredBoneBlend", "Layered Bone Blend").ToString());
            {
                Context.MenuBuilder->AddMenuEntry(FGraphEditorCommands::Get().AddBlendListPin);
            }
            Context.MenuBuilder->EndSection();
        }
    }
}