当前位置:   article > 正文

斯坦福CS193U-虚幻4C++课程学习笔记(14)_虚幻4 bindufunction

虚幻4 bindufunction

Game Mode

获取特殊的GameMode类

  • GetWorld()->GetAuthGameMode() - 该函数获取服务端唯一的GM实例,并进行Cast操作
  • 等效于Cast(UGameplayStatics::GetGameMode(GetWorld()))

Console Variables

可以通过自定义一些ConsoleVariables来控制程序的执行方式,便于调试,不会在实际打包中出现

// 可在CPP文件中进行如下声明
static TAutoConsoleVariable<T> CVarName(TEXT("YourGameName.VarName"),true,TEXT("Hint"),ECVF_Cheat);
CVarName.GetValueOnGameThread() // 获取数据
  • 1
  • 2
  • 3

好处:

  • 可以通过console命令实现一些调试
  • 控制是否Draw Debug信息而不需要临时在代码中Comment或UnComment

Tips

  • PlayAnimMontage - 返回的时长为不考虑播放速度的蒙太奇动画时长
  • 新的设置Timer回调的方法 // 已使用过Lambda表达式和传统传无参数的回调函数两种方法
  • UE可以使用类似于C语言Printf的方式打印log
    • UE_LOG(LogTemp,Log,TEXT(“%s”),*GetNameSafe(Actor))
FTimerHandle TimerHandle_RespawnPlayer;
FTimerDelegate TimerDelegate_RespawnPlayer;
TimerDelegate_RespawnPlayer.BindUFunction(this,"RespawnTimerElapsed" /* 函数名 */,Player->GetController() /* 函数的参数 */);
float RespawnDelay = 2.0f;
		
GetWorldTimerManager().SetTimer(TimerHandle_RespawnPlayer,TimerDelegate_RespawnPlayer,RespawnDelay,false);

// UE可以使用类似于C语言Printf的方式打印log
UE_LOG(LogTemp,Log,TEXT("OnActorKilled: Victim: %s, Killer: %s"),*GetNameSafe(Victim),*GetNameSafe(Killer));
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • C++函数中的传引用在蓝图中会产生一个return的引脚,而const&则不会

项目代码

GitHub: https://github.com/yufeige4/ActionRoguelike

  • 实现玩家死亡重生逻辑
  • 修复由于UI创建逻辑写在角色身上导致的BUG,写在PC上并修改了动态绑定的逻辑
    • image.png
    • image.png
  • 定义了三个Console Variables
  • 实现Gameplay蓝图函数库两种ApplyDamage方法
    • 重构MagicProjectile类
// GGameplayFunctionLibrary.h

UENUM(BlueprintType)
enum class EAIState : uint8
{
	InCombat	UMETA(DisplayName = "战斗状态"),
	OutCombat	UMETA(DisplayName = "脱战状态"),
	Died	UMETA(DisplayName = "死亡")
};

UCLASS()
class ACTIONROGUELIKE_API UGGameplayFunctionLibrary : public UBlueprintFunctionLibrary
{
	GENERATED_BODY()

public:
	UFUNCTION(BlueprintCallable, Category = "Gameplay")
	static bool ApplyDamage(AActor* FromActor, AActor* ToActor, float DamageAmount);

	UFUNCTION(BlueprintCallable, Category = "Gameplay")
	static bool ApplyDirectionalDamage(AActor* FromActor, AActor* ToActor, float DamageAmount, const FHitResult& HitResult);
};
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
// GGameplayFunctionLibrary.h

bool UGGameplayFunctionLibrary::ApplyDamage(AActor* FromActor, AActor* ToActor, float DamageAmount)
{
	UGAttributeComponent* AttributeComp = UGAttributeComponent::GetAttributeComponent(ToActor);
	if(AttributeComp)
	{
		return AttributeComp->ApplyHealthChange(FromActor,DamageAmount);
	}
	return false;
}

bool UGGameplayFunctionLibrary::ApplyDirectionalDamage(AActor* FromActor, AActor* ToActor, float DamageAmount,
	const FHitResult& HitResult)
{
	if(ApplyDamage(FromActor,ToActor,DamageAmount))
	{
		auto HitComp = HitResult.GetComponent();
		if(HitComp && HitComp->IsSimulatingPhysics(HitResult.BoneName))
		{
			float ImpulseMagnitude = 300000.0f;
			FVector ImpulseDirection = -HitResult.ImpactNormal;
			HitComp->AddImpulseAtLocation(ImpulseDirection*ImpulseMagnitude,HitResult.ImpactPoint,HitResult.BoneName);
		}
        return true;
	}
	return false;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 实现一个积分系统 - Assignment 5
    • 怪物击杀获取积分
    • 使用回复道具消耗积分
    • 拾取金币获取积分
      • 金币为刷新道具的派生类,和回复道具具有相同的基类
  • 实现开局自动刷新金币和道具,EQS - Assignment 5 Bonus

Note: 目前MagicProjectile的受击仍有问题,后续将增加MagicProjectile的碰撞通道来正式解决此问题,临时使用修改碰撞属性来暂时修复
image.png

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/133284
推荐阅读
相关标签
  

闽ICP备14008679号