• 本站文章均为 李华明Himi 原创,转载务必在明显处注明: 转载自【黑米GameDev街区】 原文链接: http://www.himigame.com/unreal-engine-game/2164.html首先Himi在这里解释下,为什么还是开篇… 原因主要有两点:...
    本站文章均为 李华明Himi 原创,转载务必在明显处注明: 
    转载自【黑米GameDev街区】 原文链接: http://www.himigame.com/unreal-engine-game/2164.html

    width="150" height="210" frameborder="0" scrolling="no" src="http://widget.weibo.com/relationship/bulkfollow.php?language=zh_cn&uids=1916000601&wide=1&color=FFFFFF,FFFFFF,0082CB,666666&showtitle=0&showinfo=1&sense=0&verified=1&count=1&refer=http%3A%2F%2Fwww.himigame.com%2Funreal-engine-game%2F2164.html&dpc=1" style="margin: 0px; padding: 0px; border-width: 0px; border-style: initial; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit;font-size:undefined; line-height: inherit; font-family: inherit; max-width: 100%;">

    首先Himi在这里解释下,为什么还是开篇… 原因主要有两点:

    1. 考虑到要写也要写点干货不是么?!但是由于官方文档写的真的够详细了,对于提到的基础知识我真的不想再赘述,因此希望各位新童鞋一定要先跟着文档动手过一遍!!!很重要!!!!!!!!!!!
    2. 另一方面,本想拿着UE4写点小项目练手,然后写点官方文档里没有的或项目中遇到的问题与重点。但是Himi最近在研究React Native,近期可能无法着手继续研究UE4,因此本篇属于开篇更合适一些。等回头正式回归继续学习研究UE4时,届时正式开始教程系列。

    大家可以先进群进行交流学习,本群的管理员都是超过2年以上虚幻引擎开发老手!

       ☞ 【Unreal Engine】191452043

     

    1

    先引用官方文档的解释:

    虚幻引擎4为程序员提供了两套工具集,可共同使用来加速开发的工作流程。 新的游戏类、Slate和Canvas用户接口元素以及编辑器功能可以使用C++语言来编写,并且在使用Visual Studio 或 XCode之一编译后可以在虚幻编辑器中反映出全部变更内容。 蓝图可视化脚本系统是一个强劲的工具,可以让类通过连接函数区块和属性引用来在编辑器中进行创建。

    C++类可以作为蓝图类的基类使用,并且这样的话,程序员就可以设置基础的游戏类,随后,它们由关卡设计师来进行子类和迭代处理。

    OK,说点通俗点:

      蓝图与C++是相互配合的,不论你通过哪种方式创建的工程,都可以在项目中创建所需的C++类或蓝图类。

    针对蓝图来说:更倾向于项目前期快速构建进行试水看效果。

    在Himi的理解来看,蓝图属于主导,而C++属于辅助。蓝图快速搭建架子,C++来进行重构、整理、补充!

     

    简单来看下面这张图,大家更容易理解:

    简单来看下面这张图,大家更容易理解:

    7

    如上图所示,你总不想让你的项目到后期如图一样吧。(笑哭)

    如上图所示,你总不想让你的项目到后期如图一样吧。(笑哭)

    好了,下面Himi简单举个例子来说:

    一: 首先大家创建一个C++的项目,然后请按照官方文档创建一个可移动的Actor。

    链接: https://docs.unrealengine.com/latest/CHN/Programming/Tutorials/PlayerInput/index.html

    二:在项目中创建一个蓝图类,并选择我们第一步创建好的C++ Actor (MyPawn),如下图:

    2               3

    Himi 这里将此蓝图命名为:“BP_MyPawn”

    三:双击打开进行编辑BP_MyPawn蓝图,编辑其Event Graph如下图:

    4

    这里主要对此Actor进行了添加键盘Q和E的事件:

    按键Q: 创建一个时间轴来循环打印一句话

    按键E:利用(a+b)*c的公式来随机打印出一个数值

    四:将第一步骤的C++ Actor 与 我们新建的蓝图Actor ,都放在世界中。

    五:打开关卡蓝图,编辑Event Graph,如下图:

    7

    这里主要添加按键1,2来在C++ Actor与蓝图Actor 之间进行切换控制权。

    六:效果图如下:(点击查看动态效果)

    jdfw

    按下键盘2,控制蓝图Actor,然后Q和E按键都有事件触发。

    按下键盘1,切回到C++的Actor视角,按下Q和E没有任何事件触发。

              通过这个小例子,完成了C++与蓝图配合实现继承关系的过程!当然至于如何能够更好的配合使用,就交给各位了~ 发挥你的想象吧,希望本篇能为新童鞋解惑C++与蓝图。(PS. 其中很多蓝图的操作或者哪些看不懂的地方,那么请你先去好好撸一遍官方文档后,再来看:so easy!)

    Himi 在UE4上也是个萌新,希望大家【加群 191452043】多多讨论共同进步!

    展开全文
  •  我有一个纯蓝图的项目,挺大的项目。我后面想添加一个C++的文件,于是我就点击添加,结果失败了,输出显示“ERROR: UnrealBuildTool encountered an error while compiling source files”。我想一定是哪些文件有...

    坑描述:

        我有一个纯蓝图的项目,挺大的项目。我后面想添加一个C++的文件,于是我就点击“New C++ Class”添加,结果失败了,输出显示“ERROR: UnrealBuildTool encountered an error while compiling source files”。我想一定是哪些文件有冲突了,就将工程目录多余的全部删除了,只留“Config”、“Content”、“ProjectName.uproject”。我天真的以为这时候双击“ProjectName.uproject”可以打开,可是我错了!弹出对话框出错:ProjectName could not be compiled. Try rebuilding form source manually。我的项目呀!!!怎么都打不开了!!!天呐!!!

    解决方法:

        打开.uproject文件发现还有“Modules”字段,删了它,天下太平了!!而且再次添加C++代码也没问题!!

    展开全文
  • C++中直接使用Interface大家应该很熟悉。只是简单先定义一个个有虚函数的基类,然后在子类中实现相应的虚函数。像这样的虚函数的基类一般概念上叫接口。那接下来看看UE4中怎样在C++中定义接口的。 .h #...

    这个教程是从UE4 Wiki上整理而来.

    在C++中直接使用Interface大家应该很熟悉。只是简单先定义一个个有虚函数的基类,然后在子类中实现相应的虚函数。像这样的虚函数的基类一般概念上叫接口。那接下来看看UE4中怎样在C++中定义接口的。

    .h

    复制代码
    #pragma once
    #include "TargetInterface.generated.h"
    UINTERFACE(MinimalAPI)
    class UTargetInterface :
        public UInterface
    {
        GENERATED_UINTERFACE_BODY()
    };
     
    class ITargetInterface{
        GENERATED_IINTERFACE_BODY()
    public:
        UFUNCTION(BlueprintImplementableEvent, meta=(FriendlyName = "On Interact"))
        void OnInteract(bool bNewOpen);
        virtual float GetHealth();
     
    };
    复制代码

    .cpp

    复制代码
    #include "YourProject.h"
    #include "TargetInterface.h"
     
    UTargetInterface::UTargetInterface(const FObjectInitializer& ObjectInitializer) 
        : Super(ObjectInitializer)
    {
     
    }
    // Give GetHealth a default implementation
    float ITargetInterface::GetHealth(){
        return 0.0f;
    }
    复制代码

    首先定义一个UTargetInterface这个是给引擎内部模块用的,一般不会用到,但是要定义。

    ITargetInterface是你要使用的类,你要声明的函数接口都放在这里面。如果是定义函数给C++用的,那么你就直接按标准的C++声明一个虚函数就OK了,然后你要实现这个接口的子类继承ITargetInterface实现GetHealth函数就可以了。如果是给Blueprint用的,就要在函数前一行声明的UFUNCTION内加上BlueprintImplementableEvent,这样蓝图就可以实现这个接口了,蓝图中就像普通事件一样实现。

    .h

    复制代码
    #pragma once
    
    #include "GameFramework/Actor.h"
    #include "TargetInterface.h"
    #include "NPCActor.generated.h"
    
    UCLASS()
    class MMWORLD_API NPCActor
        : public AActor
        , public ITargetInterface
    {
        GENERATED_BODY()
    public:
        AInteractiveTargetActor();
    virtual float GetHealth() override;
    protected:
        float Health;
    };
    复制代码

     

    .cpp

    复制代码
    #include "YourProject.h"
    #include "NPCActor.h"
    
    NPCActor::NPCActor()
    {
       Health = 100.0f;
    }
    
    float NPCActor::GetHealth()
    {
       return Health;
    }
    复制代码
     

    在C++代码中这样调用.如果是你知道Actor类的实际类型,直接调用就可以了。你不知道Actor的类型时候Interface才有实际的用处。

    auto MyInterface = Cast<ITargetInterface>(ActorInstance);
    if (MyInterface)
    {
       float ActorHealth = MyInterface->GetHealth();
    }

    但是这样的接口蓝图中是无法使用的,蓝图完全无法知道它的存在。你可以再用Blueprint Function Library的方式再包装一层,但是我觉得这不是很好。

    在蓝图中实现Event接口:

    之前的NPCActor因为已经继承了ITargetInterface所以,你在蓝图编辑器里可以直接实现OnInteract接口事件。

    那如果你纯蓝图的Actor怎么办。

    进入蓝图编辑点Class Settings

    3402568203

    在Interfaces面板点Add加入Target Interface就好了

    3523847589

     

    那怎调用这个蓝图实现的接口在C++里?

    看下面的代码

    if (ActorInstance->GetClass()->ImplementsInterface(ITargetInterface::StaticClass()))
    {
      ITargetInterface::Execute_OnInteract(ActorInstance, true);
    }
    ActorInstance->GetClass()->ImplementsInterface(ITargetInterface::StaticClass())) 是用来判断这个Actor是否实现了TargetInterface,不管是在蓝图还是C++中都可以正确的判断(但是只有BlueprintImplementableEvent和BlueprintNativeEvent(这个后面再介绍)的函数才可以被蓝图实现)。Execute_OnInteract执行蓝图事件,第一个参数是UObject对象(接口调用的执行目标对象),后面的参数就是OnInteract函数的参数。这个函数是UHT自动生成的。其实这个函数本质上就是调用的UObject的ProcessEvent,具体你可以看生成的代码。(你到这个目录下的文件看看就知道了,Yourproject\Intermediate\Build\Win64\Inc\Yourproject\Yourproject.generated.cpp,Yourproject是你的项目名称)
     

    最后一个问题,那如果想要这个函数接口既可以被C++实现又要被Blueprint实现怎么办?

    你只要简单的把BlueprintImplementableEvent改成BlueprintNativeEvent就可以了。

    .h

    复制代码
    #pragma once
    
    #include "InteractionsInterface.generated.h"
    
    UINTERFACE()
    class MMWORLD_API UInteractionsInterface : public UInterface
    {
        GENERATED_UINTERFACE_BODY()
    };
    
    class MMWORLD_API IInteractionsInterface
    {
        GENERATED_IINTERFACE_BODY()
    public:
        UFUNCTION(BlueprintNativeEvent)
        void SwitchTurned(bool bNewOnOrOff, int32 CustomParam);
    };
    复制代码

    .cpp

    复制代码
    #include "MMWorld.h"
    #include "InteractionsInterface.h"
    
    UInteractionsInterface::UInteractionsInterface(const FObjectInitializer& ObjectInitializer)
        : Super(ObjectInitializer)
    {
    
    }
    复制代码

    实现的Actor

    .h

    复制代码
    #pragma once
    
    #include "GameFramework/Actor.h"
    #include "InteractionsInterface.h"
    #include "InteractiveTargetActor.generated.h"
    
    UCLASS()
    class MMWORLD_API AInteractiveTargetActor
        : public AActor
        , public IInteractionsInterface
    {
        GENERATED_BODY()
    public:
        AInteractiveTargetActor();
    
        virtual void SwitchTurned_Implementation(bool bNewOnOrOff, int32 CustomParam) override;
    
        UFUNCTION(BlueprintImplementableEvent, Category = Interactive)
        void SwitchAllTurnedOnOrOff(bool bOnOrOff);
    
        UFUNCTION(BlueprintCallable, Category = Interactive)
        bool IsSwitchTurned(int32 Index);
    
        UFUNCTION(BlueprintCallable, Category = Interactive)
        bool IsSwitchAllTurnedOn();
    
        UFUNCTION(BlueprintCallable, Category = Interactive)
        bool IsSwitchAllTurnedOff();
    
    protected:
        UPROPERTY(EditAnywhere, BlueprintReadOnly, meta = (ClampMin = "1", ClampMax = "32", UIMin = "1", UIMax = "32"))
        int32 NeedSwitchTurnedNum;
    
        uint32 SwitchTurnedStates;
    };
    复制代码

    SwitchTurned在C++中要实现的函数是virtual void SwitchTurned_Implementation(bool bNewOnOrOff, int32 CustomParam) override; (BlueprintNativeEvent的函数名字_Implementation)。这个函数也是UHT自动生成的。

    如果是你在Blueprint中是实现了SwitchTurned接口,那么C++的实现就会被覆盖隐藏掉。

    那如果你的蓝图又要掉用C++接口实现怎么办?

    UE4中没有直接实现这样的机制。但是你可以把SwitchTurned_Implementation实现提取出来一个新函数,然后把这个函数定义成UFUNCTION(BlueprintCallable, Category = Interactive),然后在蓝图中调用这个函数就解决了。

     

    好了就介绍到这里,第一次写关于UE4的东西,不对的地方希望大家指正。希望这个对你有帮助。

    参考例子:

    https://github.com/henrya2/MMWorld

    展开全文
  • 我想在现有的蓝图项目基础上,加入语音事件等方式输入控制场景内的属性变换,请问在现有的关卡蓝图中如何添加自定义输入事件![图片说明](https://img-ask.csdn.net/upload/201702/12/1486896182_668388.jpg)
  • UE4蓝图C++ OnComponentBeginOverlap (1)首先在头文件中(本人是PlayerCharacterBase.h)声明重叠绑定的函数,函数名任意,参数按照蓝图 UFUNCTION() void OnOverlap( UPrimitiveComponent* ...

    UE4蓝图转C++:节点转换

    1. OnComponentBeginOverlap

    (1)首先在头文件中(本人是PlayerCharacterBase.h)声明重叠绑定的函数,函数名任意,参数按照蓝图

    UFUNCTION()
    	void OnOverlap( UPrimitiveComponent* OverlappedComponent,  AActor* OtherActor,  UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepHit);

    (2)然后在SetupPlayerInputComponent函数中绑定

    void APlayerCharacterBase::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent)
    {
        	WeaponCollision->OnComponentBeginOverlap.AddDynamic(this,&APlayerCharacterBase::OnOverlap);
    }

    (3)在PlayerCharacterBase.CPP中定义

    展开全文
  • UE4 c++类派生蓝图

    2018-10-23 22:59:12
    先列代码 // Fill out your copyright notice in the Description page of ... #pragma once #include "GameFramework/Actor.h" #include "MyActor.generated.h"...class TESTUNREALC_API AMyA...

    先列代码

    // Fill out your copyright notice in the Description page of Project Settings.

    #pragma once

    #include "GameFramework/Actor.h"
    #include "MyActor.generated.h"

    UCLASS()
    class TESTUNREALC_API AMyActor : public AActor
    {
     GENERATED_BODY()
     
    public: 
     // Sets default values for this actor's properties
     AMyActor();

     UPROPERTY(EditAnywhere, BlueprintReadWrite,Category = "Damage")
      int32 TotalDamage;

     UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Damage")
      float DamageTimeInSeconds;

     UPROPERTY(BlueprintReadOnly, VisibleAnywhere, Transient, Category = "Damage")
      float DamagePerSecond;

     UFUNCTION(BlueprintCallable, Category = "Damage")
      void CalculateValues();

     UFUNCTION(BlueprintImplementableEvent, Category = "DAMAGE")
      void CalledFromCpp();

     void CalledFromCpp_Implementation();
     // Called when the game starts or when spawned
     virtual void BeginPlay() override;
     
     // Called every frame
     virtual void Tick( float DeltaSeconds ) override;

     virtual void PostInitProperties() override;

     virtual void PostEditChangeProperty(FPropertyChangedEvent& PropertyChangedEvent) override;
     
     
    };

    // Fill out your copyright notice in the Description page of Project Settings.

    #include "testunrealc.h"
    #include "MyActor.h"


    // Sets default values
    AMyActor::AMyActor()
    {
      // Set this actor to call Tick() every frame.  You can turn this off to improve performance if you don't need it.
     PrimaryActorTick.bCanEverTick = true;
     TotalDamage = 200;
     DamageTimeInSeconds = 1.0f;
     DamagePerSecond = TotalDamage / DamageTimeInSeconds;

    }

    // Called when the game starts or when spawned
    void AMyActor::BeginPlay()
    {
     Super::BeginPlay();
     
    }

    // Called every frame
    void AMyActor::Tick( float DeltaTime )
    {
     Super::Tick( DeltaTime );

    }

    void AMyActor::PostInitProperties()
    {
     Super::PostInitProperties();
     this->CalculateValues();
    }

    void AMyActor::CalculateValues()
    {
     DamagePerSecond = TotalDamage / DamageTimeInSeconds;
    }

    #if WITH_EDITOR
    void AMyActor::PostEditChangeProperty(FPropertyChangedEvent& PropertyChangedEvent)
    {
     this->CalculateValues();
     Super::PostEditChangeProperty(PropertyChangedEvent);
    }
    #endif

    void AMyActor::CalledFromCpp_Implementation()
    {

    }

     

    从此类中派生出两个蓝图类,其中一个蓝图类在编辑框的值能够随着输入值的变化而变化,一个不能随时计算

     

     

    原因在于


    void AMyActor::PostInitProperties()
    {
     Super::PostInitProperties();
     this->CalculateValues();
    }

    #if WITH_EDITOR
    void AMyActor::PostEditChangeProperty(FPropertyChangedEvent& PropertyChangedEvent)
    {
     this->CalculateValues();
     Super::PostEditChangeProperty(PropertyChangedEvent);
    }
    #endif

    展开全文
  • 使用UFunction CustomThunk函数方式,实现蓝图模板功能节点,用来处理任意类型的数组,并探索实现细节背后的蓝图机制。
  • 平衡蓝图C++一文中讨论了C++蓝图的选择问题,对自己的理解做一定的记录。 C++的优势: 更快的运行时性能,C++逻辑比蓝图要快很多。 显示设计,更易维护 更广泛的访问:可以从其他系统访问C++函数和变量 更...
  • 4.12版本还没有提供内置迁移基于C++蓝图类功能,但是我就需要!!!开整!  首先,我用U3D的思维,Content目录下的uasset文件和Source目录下的C++源代码复制粘贴到我的新项目中去,结果项目打开时系统崩溃显示...
  • 这篇博客主要是深入理解蓝图整个流程的的底层机制,包括节点编辑、编译、字节码解释执行。理解了这些,对前面几篇所讲的蓝图扩展,可以有一个更清晰的认识。
  • DECLARE_DYNAMIC_MULTICAST_DELEGATE_TwoParams(FReceiveDelegateEvent, FString, Value1, FString, Value2); UPROPERTY(BlueprintAssignable, Category = "Event") FReceiveDelegateEvent ReceiveDelegateEv
  • C++公开给蓝图 UFUNCTION(BlueprintCallable, Category = "MyCppFunc") void MyFunc(); C++调用蓝图(在头文件声明,蓝图内实现即可,无需在cpp文件实现) UFUNCTION(BlueprintImplementableEvent, Category = ...
  • 通过派生class UK2Node,为蓝图添加自定义节点;这篇博客我们先实现一个最简单的自定义节点,下篇文章将完成“动态添加输入Pin”的蓝图节点。
  • UE4蓝图调用C++函数

    2016-03-17 23:33:27
      调用UFUNCTION(UE4模版函数): https://wiki.unrealengine.com/Blueprints,_Creating_C%2B%2B_Functions_as_new_Blueprint_Nodes    
  • 首先,本文只是针对有比较熟练C++技能的程序员,他可以没有任何图形学或游戏引擎方面的经验知识。其次,本文只是偏重工程方面的介绍,没多少理论知识的介绍,目的纯粹就是让一个完全没有接触过UE4的C++程序员能够...
  • 前面两篇博客我们都是通过ExpandNode来实现蓝图节点的功能,这一篇来介绍另外一种重要的蓝图扩展方式,就是Node Handler。
  • epic games宣布ue4免费使用之后,吸引了大批看好...不过国内ue4教程和资料太少,而且一大部分资料都是关于蓝图(Blueprint)的,好在官网放出了guide和demo。更多讨论,可以前往讨论区:http://www.52vr.com/forum-93-1.
  • 我们都知道蓝图调用C++的函数或者变量都很简单, 直接在C++的.h文件中所要暴露的变量或者函数头上 加上宏就可以了 然而,在C++中调用蓝图写好的函数就不是很简单了 1,首先我们创建一个C++类,我用的是Pawn、...
  • Unreal Engine4 蓝图入门

    2019-07-24 20:12:07
    微信公众号:UE交流学习 UE4开发群:344602753 蓝图Unreal Engine的特点,用C++编程固然好,但是效率要低很多,主要是国内资料比较少,所以不太容易学习,用蓝图编程可以节省开发成本,我认为蓝图编程也是可以解决...
  • 3.打包完成后才回在原项目工程中生成蓝图转换成c++的代码 4.如图路径(转换后的代码路径较深所以一步一步说明) C_SourceCode是我建立UE4的项目名 Intermediate文件夹内是转化后的代码 WindowsNoEditor 是本文...
1 2 3 4 5 ... 20
收藏数 1,169
精华内容 467