zoukankan      html  css  js  c++  java
  • UE4学习笔记_06

    继续研究Blueprint,这次主要看看C++和Blueprint的结合方法。官方文档依然没有太大用处,但在wiki上还是有很多值得学习的文章的。当中有个叫Rama的家伙贡献了相当多的教程,他还写了一个很不错的插件,而且将源代码和实现的思路都写在了一个wiki页面里,对社区的帮助很大,MVP应该是没得跑了,要是多一些这样的人UE4就能更快地成熟并推广了。

    不过在动手写代码之前,我首先把那个忍无可忍的VS2013自带的Intellisense给关掉了,我是完全按照官方文档的指引配置了所有的参数,但实际用起来却奇慢无比,再小的工程敲几行代码后要等二十几秒自动完成才能蹦出来,右下角那个处理提示符就几乎没消失过。而且代码帮助还非常不稳定,时有时无,另外还经常给出一些错误的提示。忍不了了,还是装了Visual Assist,瞬间一切都那么顺手又顺眼了。

    工具搞定后,先来看看如何在C++中创建可以在Blueprint中使用的全局函数:

    • 创建一个继承自UBlueprintFunctionLibrary的C++类即可。不知道为什么在Editor中不能直接创建基于UBlueprintFunctionLibrary的C++类,但我们可以在VS中自己修改一下基类
    • 继承自UBlueprintFunctionLibrary类中,凡是具备BlueprintCallable属性的UFUNTION即可在Blueprint中被调用
    • 如果UFUNCTION还带有BlueprintPure属性,那么意味着这个函数不会修改任何游戏状态,因此无需exec链的触发(在Blueprint中体现为没有白线输入),可以在任何时刻被调用获取其结果
    • 作为随时可被调用的全局函数,都需要被声明成static函数

    下面是具体代码:

    MyBPLibrary.h:

     1 // Copyright 1998-2014 Epic Games, Inc. All Rights Reserved.
     2 
     3 #pragma once
     4 
     5 #include "MyBPLibrary.generated.h"
     6 
     7 /**
     8  * 
     9  */
    10 UCLASS()
    11 class UMyBPLibrary : public UBlueprintFunctionLibrary
    12 {
    13     GENERATED_UCLASS_BODY()
    14         
    15     UFUNCTION(BlueprintCallable, BlueprintPure, Category = "Test")
    16         static FString GetHappyMessage();
    17 
    18     UFUNCTION(BlueprintCallable, Category = "Test")
    19         static bool SaveToFile(FString Dir, FString Name, FString Text, bool Overwrite = false);
    20 
    21     UFUNCTION(BlueprintCallable, Category = "Test")
    22         static bool MakeDir(FString Dir);
    23 };

    MyBPLibrary.cpp:

     1 // Copyright 1998-2014 Epic Games, Inc. All Rights Reserved.
     2 
     3 #include "HelloWorld.h"
     4 #include "MyBPLibrary.h"
     5 
     6 
     7 UMyBPLibrary::UMyBPLibrary(const class FPostConstructInitializeProperties& PCIP)
     8     : Super(PCIP)
     9 {
    10 
    11 }
    12 
    13 FString UMyBPLibrary::GetHappyMessage() {
    14     return FString("Hello, I'm Happy!");
    15 }
    16 
    17 bool UMyBPLibrary::MakeDir(FString Dir) {
    18     return FPlatformFileManager::Get().GetPlatformFile().CreateDirectory(*Dir);
    19 }
    20 
    21 bool UMyBPLibrary::SaveToFile(
    22     FString Dir,
    23     FString Name,
    24     FString Text,
    25     bool Overwrite /* = false */
    26 ) {
    27     IPlatformFile& F = FPlatformFileManager::Get().GetPlatformFile();
    28     if (!F.DirectoryExists(*Dir))
    29     {
    30         F.CreateDirectoryTree(*Dir);
    31         if (!F.DirectoryExists(*Dir))
    32         {
    33             return false;
    34         }
    35     }
    36 
    37     Dir += "\";
    38     Dir += Name;
    39 
    40     if (!Overwrite)
    41     {
    42         if (F.FileExists(*Dir))
    43         {
    44             return false;
    45         }
    46     }
    47 
    48     return FFileHelper::SaveStringToFile(Text, *Dir);
    49 }

    这个例子中实现了3个全局函数:GetHappyMessage,MakeDir以及SaveToFile,其中GetHappyMessage为无副作用的函数。它们在Blueprint中就可以这么用了:

    在调试的过程中遇到的一些问题在这里说一下:

    • 在Rama的例子中,对文件的操作都是基于GFileManager,但在实际写代码时发现这个全局变量不存在,只能通过FPlatformFileManager来实现相关操作,可能是Rama写教程之后UE4的代码又发生过变化
    • 在Blueprint中,那些紫色的节点代表一个String类型的输入,但是这里需要注意:在输入框里不要将字符串包围在双引号之间了,也不要对特殊字符转义,系统会帮你处理。一开始不清楚在这里卡了好久
    • 如果你自己的类是继承自PlayerController,那么可以使用ClientMessage来输出一些调试信息;但如果不是(比如上面的这个例子),则可以使用UE_LOG宏,宏的用法和Rama教程里的用法也不太一样了,需要自己去研究一下

    通过在C++中实现供Blueprint调用的全局函数,就实现了Blueprint和C++交互的一种常用途径。后面再写一些其他交互方式的实现方法。

  • 相关阅读:
    Git Bash主题配置
    vuex里mapState,mapGetters使用详解
    Vue基础汇总实践
    Chrome for Mac键盘快捷键!来自Google Chrome官网!
    Vue中ESlint配置文件.eslintrc文件
    axios的get,post方法
    正则表达式识别标记——包括它之间的标记
    关于如何在微信里面让video不全屏播放
    javascript执行机制
    防止表单多次提交方法之二
  • 原文地址:https://www.cnblogs.com/vesnica/p/3632595.html
Copyright © 2011-2022 走看看