[游戏开发][UE5]引擎学习记录

C++ Log和蓝图Log 

C++ Log 方法 UE_Log(参数1,参数2,参数3)

//举例:
UE_LOG(LogTemp, Error, TEXT("Log Info: %s"),"Test Log");

三个参数的作用

参数1:输出窗口归类使用,你写什么它就显示什么

参数2:可选择Log、Warning、Error,分别对应不同颜色,如果程序报错了,一定是Error

参数3:打印内容

C++输出屏幕

用 GEngine->AddOnScreenDebugMessage

要添加”Engine/Engine.h“

GEngine->AddOnScreenDebugMessage(-1, 3.0f, FColor::Green,Name);
GEngine->AddOnScreenDebugMessage(-1, 3.0f, FColor::Red,Stat,true,FVector2D(1.5f,1.5f));

蓝图输出屏幕直接用PrintText和PrintString方法

GameMode

 GameMode主要记录场景配置

1、DefaultPawnClass -- 加载角色蓝图

角色蓝图必须继承自 ACharacter类

角色蓝图包含主角模型,Component等

还可以创建角色蓝图基类,子类重写基类数据等操作,选择角色蓝图的地方选子类蓝图

2、HUDClass -- UI

3、PlayerControllerClass -- 玩家控制器

用户输入的地方,例如键鼠操作

4、GameStateClass

5、PlayerStateClass

6、SpectatorClass

蓝图、C++、Lua调用规则

蓝图调用C++方法

C++方法加宏

UFUNCTION(BlueprintCallable, Category = Projectile,Meta = (Tooltip = "Custom Tip"))

UFUNCTION(BlueprintImplementableEvent, Category = "Cosmos|Game")

Category 的作用是在蓝图中右键调用方式时,给方法分类,快速定位

Tooltip的作用是自定义蓝图提示,鼠标放在蓝图方法上就会显示自定义提示

BlueprintImplementableEvent的作用是你重载这个方法时,它会作为Event存在,Event和Function的区别是:

  1. 事件里可以添加延时节点,函数不可以。
  2. 函数有返回值,事件没有。
  3. 事件可以写成回调函数,函数则不可以写成回调(意思就是事件可以在里面的逻辑中再次调用自己,函数则不可以调用自己)。
  4. 事件可以作为鼠标键盘这类输入事件和碰撞检测事件处理。
  5. 实现接口的时候,有返回值的会变成函数,无返回值的会变成事件。
  6. 事件可以用来发送网络消息,而函数不行。

蓝图修改C++变量

C++变量需要加宏

UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Adjust")

Lua访问C++对象

由于Lua是无法直接访问C++

加载Actor角色物体

 根据蓝图类加载角色

AActor* NewActor = World->SpawnActor<AActor>(ActorClass, InTransform, SpawnParam);
ICMSpawnedActorInterface* CMActor = Cast<ICMSpawnedActorInterface>(NewActor);

 根据路径获得蓝图类

UClass* StaticLoadClass( UClass* BaseClass, UObject* InOuter, const TCHAR* InName, const TCHAR* Filename, uint32 LoadFlags, UPackageMap* Sandbox )
{
	check(BaseClass);

	UClass* Class = LoadObject<UClass>( InOuter, InName, Filename, LoadFlags, Sandbox );
	if( Class && !Class->IsChildOf(BaseClass) )
	{
		FFormatNamedArguments Arguments;
		Arguments.Add(TEXT("ClassName"), FText::FromString( Class->GetFullName() ));
		Arguments.Add(TEXT("BaseClassName"), FText::FromString( BaseClass->GetFullName() ));
		const FString Error = FText::Format( NSLOCTEXT( "Core", "LoadClassMismatch", "{ClassName} is not a child class of {BaseClassName}" ), Arguments ).ToString();
		SafeLoadError(InOuter, LoadFlags, *Error);

		// return NULL class due to error
		Class = NULL;
	}
	return Class;
}

ACMCharacter* UGameplayBPLib::SpawnCharacterWithParams(const UObject* WorldContextObject, const FTransform& InTransform, const FCMNPCSpawnParams& InParams)
{
    FString PawnClassPath = "xxxxxxxx";
    UClass* PawnClass = StaticLoadClass(ACMCharacter::StaticClass(), nullptr, *PawnClassPath);
}

 既然可以用蓝图类文件路径加载角色,那么就可以通过配表去配置不同角色的加载路径,之后就可以DIY了。

蓝图根据路径加载资源

  1. MakeSoftObjectPath用字符串制作路径
  2. SoftObjPathToSoftObjRef从路径获取到类引用,这一步还没拿到对象
  3. LoadAssetBlocking加载UObject资源对象
  4. 把UObject资源对象转换成你想要的类型

资源加载是个非常有用的功能,例如时装系统,头盔、铠甲有无数种,策划只需配表写资源地址,程序根据服务器数据加载不同模型到角色身上。

两种特效类型

 Niagara System 和 Cascade Particle System

 蓝图连接线样式修改

 角色播放蒙太奇动画

 

float ACharacter::PlayAnimMontage(class UAnimMontage* AnimMontage, float InPlayRate, FName StartSectionName)
{
	UAnimInstance * AnimInstance = (Mesh)? Mesh->GetAnimInstance() : nullptr; 
	if( AnimMontage && AnimInstance )
	{
		float const Duration = AnimInstance->Montage_Play(AnimMontage, InPlayRate);
		if (Duration > 0.f)
		{
			// Start at a given Section.
			if( StartSectionName != NAME_None )
			{
				AnimInstance->Montage_JumpToSection(StartSectionName, AnimMontage);
			}
			return Duration;
		}
	}	
	return 0.f;
}

关于蓝图加载和蓝图类对比

首先,项目编译启动时蓝图文件不会像C++工程一样必须全编译完才能启动,而是根据引用关系加载的。 蓝图文件和资源一样,加载后会在内存中缓存,具体如何释放不太清楚

检查Lua对象是不是不是某个蓝图类

 请注意对比的时候要LoadClass,先加载后对比

 骨骼角色与播放骨骼动作

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Little丶Seven

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值