zoukankan      html  css  js  c++  java
  • UE4 C++ 笔记

    1.获取当前的GameMode:GameMode = Cast<你GameMode的类名>( UGameplayStatics::GetGameMode(this));

    2.输出日志Debug UE_LOG(LogTemp, Log, TEXT("StartPoint:%s"), *StarPoint.ToString()); %d表示按整型数据的实际长度输出数据、%c用来输出一个字符、%s用来输出一个字符串、%x表示以十六进制数形式输出整数。

    3.给碰撞组件动态绑定碰撞函数:GetCapsuleComponent()->OnComponentBeginOverlap.AddDynamic(this, &你的类名::你的函数名);

    4.Character键值绑定,键轴绑定:

    void APacManCharacter::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent)
    {
    Super::SetupPlayerInputComponent(PlayerInputComponent);

    PlayerInputComponent->BindAxis("MoveX", this, &你的character类::MoveXAxis);
    PlayerInputComponent->BindAxis("MoveY", this, &你的character类::MoveYAxis);
    PlayerInputComponent->BindAction("NewGame",IE_Pressed, this, &你的character类::NewG);
    PlayerInputComponent->BindAction("Restart", IE_Pressed, this, &你的character类::RS);
    PlayerInputComponent->BindAction("Pause", IE_Pressed, this, &你的character类::Pa);

    }

    5.添加队列,遍历每个元素:定义头文件 TArray<class AEnemy*> Enemys;  在cpp里引入头文件 #include"Public/EngineUtils.h"  然后在队列里添加元素  

    for (TActorIterator<AEnemy> EnemyItr(GetWorld()); EnemyItr; ++EnemyItr)
    {
    AEnemy* enemy = Cast<AEnemy>(*EnemyItr);
    if (enemy)
    {
    Enemys.Add(enemy);
    }
    }

    遍历列表中的每个元素,调用每个元素的方法

    for (auto Iter(Enemys.CreateIterator()); Iter; Iter++)
    {
    (*Iter)->Destroy();
    }

    6.FORCEINLINE 内联函数,目的是为了提高函数的执行效率。声明类型后再直接在头文件下面添加FORCEINLINE关键字:

    EGameState GetCurrentState() const; 

    FORCEINLINE EGameState 你的GameMode类名::GetCurrentState() const
    {
    return currentState;
    }

    7.定时器:在头文件里定义一个FTimerHandle TimeVulnerable;  在cpp里引入头文件#include"Public/TimerManager.h"

    GetWorldTimerManager().SetTimer(TimeVulnerable, this, &你的类::时间结束后执行的函数, 你的时间.0f, bool是否循环);

    8.利用ConstructorHelpers来找资源:引入头文件#include"UObject/ConstructorHelpers.h"

    然后开始找资源  例如 static ConstructorHelpers::FObjectFinder<UStaticMesh> CylinderObj(TEXT("'/Game/StarterContent/Shapes/Shape_Cylinder'"));

    安全校验 如果查找成功 if (CylinderObj.Succeeded()) 

    9.创建一个staticmeshcomponent:在头文件里定义一个指针变量  UStaticMeshComponent* EnemyBody;  然后在cpp里引入头文件  #include"Components/StaticMeshComponent.h"

    再在构造函数里创建mesh资源   EnemyBody = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("Body"));

    10.C++AI,继承AAIController  可重写两个虚函数 

    .h头文件里重写  virtual void Possess(class APawn* InPawn) override;  相当于beginplay 游戏刚开始的时候调用的函数 

    .cpp里实现函数前要先调用父类的方法  Super::Possess(InPawn);

    void AAIEnemy::Possess(class APawn* InPawn)

    {
    Super::Possess(InPawn);

    }

    第二个是重写移动完成后的函数

    .h头文件里重写 virtual void OnMoveCompleted(FAIRequestID RequestID, const FPathFollowingResult& Result) override;  参数尽量保持一致

    .cpp里实现移动完成后寻找下一个点

    void AAIEnemy::OnMoveCompleted(FAIRequestID RequestID, const FPathFollowingResult & Result)
    {

    SearchNewPoint();

    }

    10.导航网格实现路径寻找:

    void AAIEnemy::SearchNewPoint()
    {

    UNavigationSystem* NavMesh = UNavigationSystem::GetCurrent(this);
    if (NavMesh)
    {

    const float SearchRadius = 10000.0f; //搜寻半径
    FNavLocation RamdomPt;
    const bool bFound = NavMesh->GetRandomReachablePointInRadius(Bot->GetActorLocation(),SearchRadius,RamdomPt);
    if (bFound)
    {
    MoveToLocation(RamdomPt);
    }
    }

     11.C++绘制HUD:新建一个C++类继承AHUD类  头文件重写DrawHUD函数 virtual void DrawHUD() override;

    然后在cpp里实现在屏幕上中央打印文字    

    DrawText(TEXT("Hello")
    , FColor::White, (Canvas->SizeX) / 2.0f-150, (Canvas->SizeY) / 2.0f-100, HUDFont);

    12.获取当前角色character:你的Character类* Man = Cast<你的Character类>(UGameplayStatics::GetPlayerPawn(this, 0))

    13.物体碰撞函数及参数设置:

    UFUNCTION()
    void OnCollision(class UPrimitiveComponent* HitComp, class AActor* OtherActor, class UPrimitiveComponent* OtherComponent, int OtherBodyIndex, bool bFromSweep, const FHitResult &SweepResult);

    实现:

    void AEnemy::OnCollision(UPrimitiveComponent * HitComp, AActor * OtherActor, UPrimitiveComponent * OtherComponent, int OtherBodyIndex, bool bFromSweep, const FHitResult & SweepResult)
    {
    if (OtherActor->IsA(你的Character类::StaticClass()))  //判断碰到的物体是不是主角
    }

  • 相关阅读:
    共享内存
    文件IO函数和标准IO库的区别
    链表程序
    flash_header.S ( freescale imx6 board)
    深入理解二维数组
    putchar和puts
    指针目标
    C语言:break和continue
    C语言:输入输出
    python lambda
  • 原文地址:https://www.cnblogs.com/yukiArea/p/10132407.html
Copyright © 2011-2022 走看看