虚幻Unreal - A计划(永久有效期) 扫二维码继续学习 二维码时效为半小时

(90评价)
价格: 3320.00元

TGProject.Build 里添加 插件

public TGProject(ReadOnlyTargetRules Target) : base(Target)
{
	PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs;

	PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore", "HeadMountedDisplay",
		"EnhancedInput", "OnlineSubsystem", "OnlineSubsystemUtils" });
}

 

[展开全文]
Alonelys · 11天前 · 0

VS 属性页 调试 添加 命令参数

 

[展开全文]
Alonelys · 11天前 · 0
void ATGProjectCharacter::PossessedBy(AController* NewController)
{
    Super::PossessedBy(NewController);
    UE_LOG(MYLog____ATGProjectCharacter, Log, TEXT("---PossessedBy---32323232323"));
    if (GetNetMode() == NM_DedicatedServer)
    {
        if (UTGProjectGameInstance* GI = GetGameInstance<UTGProjectGameInstance>())
        {
            if (ATGProjectPlayerState* PS = GetPlayerState<ATGProjectPlayerState>())
            {
                //读存档
                bool IsNeedDataTable = true;
                if (UTGSettings::Get().bSaveGame)
                {
                    UTGSaveGame* SaveGame = Cast<UTGSaveGame>(UGameplayStatics::LoadGameFromSlot(FString("TGSaveGame_" + PS->GetPlayerName()), 0));
                    if (SaveGame)
                    {
                        PS->SetPlayerCurHP(SaveGame->SG_CurHP);
                        PS->SetPlayerMaxHP(SaveGame->SG_MaxHP);
                        IsNeedDataTable = false;
                    }
                }
                //读表
                if (IsNeedDataTable)
                {
                    if (GI->PlayerInitData)
                    {
                        FTGPlayerInitData* PlayerData = GI->PlayerInitData->FindRow<FTGPlayerInitData>(PlayerInitRowName, TEXT(""));

                        if (ensure(PS))
                        {
                            PS->SetPlayerCurHP(PlayerData->MaxHP);
                            PS->SetPlayerMaxHP(PlayerData->MaxHP);
                        }
                    }
                }

            }
        }
    }
}

 

[展开全文]
Alonelys · 11天前 · 0
void ATGProjectPlayerState::EndPlay(const EEndPlayReason::Type EndPlayReason)
{
    if (UTGSettings::Get().bSaveGame)
    {
        if (GetNetMode() == NM_DedicatedServer)
        {
//创建游戏保存
            UTGSaveGame* SaveGame = Cast<UTGSaveGame>(UGameplayStatics::CreateSaveGameObject(UTGSaveGame::StaticClass()));
            if (SaveGame)
            {
                SaveGame->SG_CurHP = CurHP;
                SaveGame->SG_MaxHP = MaxHP;
//保存文件
                UGameplayStatics::SaveGameToSlot(SaveGame, FString("TGSaveGame_" + GetPlayerName()), 0);
            }
        }
    }

    Super::EndPlay(EndPlayReason);
}

 

[展开全文]
Alonelys · 11天前 · 0

FURL map;

map.Op.add()

向服务器传递消息

GameMode

Login 接收登录事件

FString PN = UGameplayStatics::ParseOption(Options, FString("PN"));

 

FCommandLine::Get() 获取当前游戏的命令行参数字符串

DEFINE_LOG_CATEGORY_STATIC(MYLog____ATGProjectGameInstance, Log, All)

添加打印宏

UE_LOG(MYLog____ATGProjectGameInstance,

if (FParse::Value(FCommandLine::Get(), TEXT("PlayerName="), PlayerName))
{
	UE_LOG(MYLog____ATGProjectGameInstance, Log, TEXT("----Init----PlayerName = %s"), *PlayerName);
}

 

[展开全文]
Alonelys · 11天前 · 0

UPROPERTY()  不会被回收

 

[展开全文]
Alonelys · 11天前 · 0

ensure

ensure 是 Unreal Engine 提供的一个调试宏,它用于 验证一个条件是否为真,如果条件为假,则会:

  • 打印一个警告信息
  • 停止当前帧的执行(不崩溃),但是允许程序继续运行。

ensure(Condition);

 

 

PossessedBy() 指定完控制器后

就可以读取数据了

 

服务端 或者 单机状态下 才调用

客户端除外

 

 

[展开全文]
Alonelys · 11天前 · 0

基本数据-》结构-》表格

USTRUCT(BlueprintType)

定义可用于蓝图的结构体

UPROPERTY(EditAnywhere,BlueprintReadWrite)

定义蓝图可访问的变量

 

TEnumAsByte<ECharacterColorType::ColorType> 是什么意思?

在 Unreal Engine C++ 代码中,TEnumAsByte<T> 是一个模板类,它的作用是将 枚举(enum) 存储为 一个字节(uint8,而不是默认的 4 字节 int32。这样可以节省内存,特别是在结构体或 UPROPERTY 变量中。

[展开全文]
Alonelys · 11天前 · 0

DECLARE_DELEGATE_OneParam(FOnPlayerCurHPChange, float);

单播委托,即 只能绑定一个函数

DECLARE_DYNAMIC_DELEGATE_OneParam

动态单播


DECLARE_MULTICAST_DELEGATE_OneParam(FOnPlayerMaxHPChange, float);

多播委托,可以 绑定多个函数

DECLARE_DYNAMIC_MULTICAST_DELEGATE

 动态多播

 OnPlayerCurHPChange.ExecuteIfBound(GetPlayerCurHP());

执行单播

    OnPlayerMaxHPChange.Broadcast(GetPlayerMaxHP());

执行多播

OnPlayerCurHPChange 是一个 DECLARE_DELEGATE_OneParam 定义的委托

ExecuteIfBound() 检查委托是否绑定,如果绑定了,就执行。

GetPlayerCurHP() 是一个返回 float 的函数,获取玩家当前血量。

 

PS->OnPlayerCurHPChange.BindUObject(this, &UUI_PlayerInfoUI::SetPlayerCurHP);

绑定单播


PS->OnPlayerMaxHPChange.AddUObject(this, &UUI_PlayerInfoUI::SetPlayerMaxHP);

绑定多播

 

[展开全文]
Alonelys · 11天前 · 0

UFUNCTION(Reliable, Clien)

服务器调用,仅自己客户端执RunOnOwningClient>


UFUNCTION(Reliable, Server)

客户端调用,服务器执行<血量控制>

 
UFUNCTION(Reliable, NetMulticast)

服务器调用,服务器和所有客户端执行

同步服务器和客户端事件

 宏标记

Reliable 重要 TCP

unreliable 不重要 UDP

 

[展开全文]
Alonelys · 11天前 · 0

UPROPERTY(Replicated)

  • 让变量在服务器和客户端之间自动同步
  • 适用于简单数据同步,但不会自动通知客户端值发生了变化。
  •  

UPROPERTY(ReplicatedUsing="OnRep_ChangeCurHP")

  • Replicated 类似,但带有回调函数
  • 当变量在客户端发生变化时,自动调用 OnRep_ChangeCurHP
  • 适用于需要额外处理的同步变量(如 UI 更新、动画触发)。

 

  • 默认情况下,AActor 的变量不会自动同步,必须手动设置 Replicated
  • 必须调用 SetReplicates(true)bReplicates = true;,否则变量不会同步。
  • 变量必须使用 UPROPERTY(Replicated)UPROPERTY(ReplicatedUsing=OnRep_Function)
  • 服务器端修改变量,客户端才能收到同步
  •  
[展开全文]
Alonelys · 11天前 · 0

GetWorld() 代表当前关卡的游戏世界。

 

SpawnActor<AActor> 是 UE5 中用于在世界中创建新 Actor 的方法 T 是模板参数

 

TSubclassOf<AActor> 是 Unreal Engine 中 表示 AActor 及其子类的泛型类型,用于存储 UClass 类型,但只能是 AActor 或其派生类。

 

Actor 同步 打开Replicates 

 

[展开全文]
Alonelys · 11天前 · 0

UE 提供了 无缝旅行(Seamless Travel),可以让 PlayerState 在切换关卡时保持不变。步骤如下:

[展开全文]
Alonelys · 12天前 · 0

游戏实例类

GameInstance

   SUper::Init() 父类初始化

    Init()

 

 

[展开全文]
Alonelys · 12天前 · 0

//修改新建 蓝图 打开是独立窗口

编辑器设置-》外观-》资产编辑器打开路径

修改成Main windows

 

[展开全文]
Alonelys · 12天前 · 0

 

1. 蓝图相关参数

参数

作用

适用场景

BlueprintCallable

允许蓝图调用该函数

蓝图按钮、角色逻辑

BlueprintPure

纯函数,无需执行引脚,不修改对象状态

数学运算、数据查询

BlueprintImplementableEvent

蓝图必须实现,C++ 不能定义

特效、UI 事件

BlueprintNativeEvent

蓝图可选实现,C++ 可提供默认定义

可扩展功能,如 AI 逻辑

BlueprintAuthorityOnly

仅在 服务器 可调用

服务器专属逻辑,如物品掉落

BlueprintCosmetic

仅客户端 可执行

UI、动画、粒子特效

 


// 示例:蓝图可调用函数
UFUNCTION(BlueprintCallable, Category="Gameplay")
void Jump();
//蓝图里可以调用 Jump(),但 C++ 里仍然可以正常使用。

 


2. 网络(RPC)相关参数

参数

作用

适用场景

Server

仅在 服务器 执行(需要 HasAuthority()

服务器逻辑(如伤害计算)

Client

仅在 客户端 执行(服务器调用)

客户端特效(如 UI 更新)

NetMulticast

服务器执行,并让所有客户端同步执行

全体可见效果(如爆炸特效)

Reliable

确保 RPC 可靠 传输(数据重要时使用)

物品拾取、开门

Unreliable

允许 RPC 不可靠 传输(节省带宽)

瞬时数据,如子弹轨迹

// 示例:服务器 RPC

UFUNCTION(Server, Reliable)
void Server_TakeDamage(int32 Damage);

// 客户端调用 Server_TakeDamage(),但代码只会在服务器端执行。

 


 

3. 执行权限

参数

作用

适用场景

Exec

允许在 控制台 输入命令执行

调试命令、AI 刷新

CallInEditor

允许在 编辑器模式 执行

自动化工具、地图生成

//示例:控制台命令


UFUNCTION(Exec)
void SpawnEnemy();

// 在游戏控制台(~ 键)输入 SpawnEnemy 即可执行此函数。

 


 

4. 反射系统(反序列化、垃圾回收等)

参数

作用

适用场景

Category="..."

设定蓝图中的分类

组织蓝图函数

CustomThunk

自定义 thunk 代码(高级用法)

底层优化

Meta=(Key=Value)

额外元数据(用于 UE 反射系统)

高级蓝图控制

 

//示例:设置蓝图分类


UFUNCTION(BlueprintCallable, Category="Player Actions")
void Sprint();

// 蓝图中 Sprint() 会归类到 "Player Actions" 里。

 

5. 编辑器功能

参数

作用

适用场景

DeprecatedFunction

标记函数为 废弃,不推荐使用

API 变更

SealedEvent

防止蓝图重写该事件

不希望子类修改

WithValidation

RPC 调用前检查参数合法性

安全性检查

 

//示例:废弃函数


UFUNCTION(BlueprintCallable, DeprecatedFunction, Category="Legacy")
void OldFunction();

// 蓝图会提示 OldFunction() 已废弃,但仍然可以调用。

 


 

6.组合使用示例 



UFUNCTION(BlueprintCallable, Server, Reliable, Category="Networking")
void Server_DealDamage(int32 Damage);

UFUNCTION(BlueprintImplementableEvent, BlueprintCosmetic, Category="UI")
void ShowDamageEffect();
//服务器端计算伤害 (Server_DealDamage),客户端显示受伤特效 (ShowDamageEffect)。

[展开全文]
Alonelys · 12天前 · 0

PreLogin(检查登录条件)

  • 发生在客户端尝试连接到服务器时,但尚未真正建立 PlayerController
  • 主要用于验证玩家是否可以加入,比如检查 ban list(黑名单)、服务器是否已满 等。
  • 如果验证失败,可以拒绝玩家加入。

Login(创建 PlayerController)

  • 服务器 负责创建 PlayerController,并接管管理。
  • 在这个阶段,GameMode 还不会创建 Pawn,只是保证 玩家控制器 已建立。

PostLogin(玩家初始化)

  • 这里玩家已经 完全连接,可以进行各种初始化操作,比如:
    1. 初始化 HUD(UI 界面)。
    2. 将玩家加入 GameplayMuteList(用于管理语音或文本聊天的静音列表)。
    3. 创建 Pawn 并进行 Possess(如果 GameMode 允许)。
    4. 初始化玩家状态(PlayerState),同步玩家信息。
    5. 可以使用RPC 函数了

额外补充

GameModePostLogin 之后,一般还会触发 OnPostLogin 事件,开发者可以在这里进行额外的玩家初始化,比如 匹配系统、分配队伍、同步游戏状态 等。

[展开全文]
Alonelys · 12天前 · 0

BP主角蓝图

角色移动组件(Character Movement)

优化跑步速度

转向摩擦力

空中控制力

空中横向摩擦力

重力(Gravity Scale):4 

启用单独的摩擦系统(Use Separate Braking Friction)

[展开全文]
0大企鹅0 · 01-25 · 0

组件Components
Actor上进行使用的附加物,可以提供额外的功能Actor可以对这些组件进行自定义的修改

常用组件:

场景组件(Scene:

提供Actor在场景中的位置、旋转、缩放信息

音频组件(Audio:

播放音效(UE只将WAV(WAVE)格式的文件视为音频)

光源组件(Light:

发出亮光,可以自定义强度、颜色等

静态网格体组件(StaticMesh:

主要显示不会动的物体外观,优化好,更高效

几何体外观组件是其选定好的模板

骨骼网格体组件(SkeletalMesh:

主要显示会动的物体外观,需要动画资源

弹簧臂组件(SpringArm):

连接Actor和摄像机,以提供更灵活的画面

摄像机组件(Camera):

主要用来提供游戏画面

碰撞检测组件(Collision):

形状分为球(Sphere)、盒体(Box)、胶囊体(Capsule),不同的型状为不同的组件

进行碰撞检测,如果满足条件就会触发某些逻辑

控件组件(Widget):

分为Widget(控件组件)和WidgetInteraction(控件交互组件)

用于显示UI,可设置显示的方式和属性

公告板组件(Billboard):

Actor打上图片标记,方便在场景中点击选中,该标记在运行阶段时不会显示

文本渲染组件(TextRender):

Actor打上文字标记,方便在场景中点击选中和作为提示区分,该标记在运行阶段时会显示

粒子特效组件(ParticleSystem):

作为特效使用

NiagaraParticleSystemComponent,使用Niagara粒子系统

CascadeParticleSystemComponent,使用Cascade粒子系统

后期处理组件(PostProcess):

处理Actor的渲染、光照等属性

Actor组件(ChildActor):

将一个Actor附加到蓝图中

发射物移动组件(ProjectileMovement):

Actor生成后,具有一定的速度,会以该速度在生成后进行移动

[展开全文]
DUChicken · 01-12 · 0

增强输入(Enhanced Input

使用Enhanced Input插件

对比操作映射和轴映射系统,增强输入系统有着更多的灵活性和控制能力

增强输入系统有着高度定制的优点,可以定义输入的优先级和条件,可以控制更复杂的游戏输入

增强输入系统可以创建很多套(Input Mapping Context

创建Input Action输入提供给Input Mapping Context进行绑定使用

Input Action的关键属性为值类型

在使用输入前,需要为蓝图的控制器类激活并指定一个输入映射情景:

获取控制器引用(需要cast

获得该引用的增强输入本地玩家子系统(Enhanced Input Local Player Subsystem

判断该子系统是否有效(Is Valid

有效则添加映射上下文(Add Mapping Context

触发的概念及顺序:

按下(started-按住(triggered-抬起(completed

引脚:

Triggered:根据触发器的类型决定其触发行为(默认为tick),在Started执行完后才会开始执行

Started:按下时会触发一次,最先开始执行

Ongoing:在触发前执行,需要定义触发器

Canceled:在触发取消时执行,需要定义触发器

Completed:在触发完成后执行(按键抬起),最后执行

值类型引脚:分为Bool型、浮点型、向量型,其值的值与当前触发状态有关

Elapsed Seconds:触发按键后的计时,触发完成或中断后会停止

Triggered Seconds:触发按键后的计时,触发完成后会停止

Input Action:返回对于的Input Action引用

触发器(均可设置驱动阈值)

驱动阈值:用于有力反馈的输入设备,只有输入的力超出设定的驱动阈值时才会触发的限定值,一般范围为(0,1]超出范围时会出现错误

时间膨胀:时间的流动速度

 

下移

先执行Started,后在按下时以tick的方式执行Triggered,松开时执行Completed

已按下:

先执行Started,后只执行一次Triggered,随后立马执行Completed

已松开:

先执行Started,后在按下时以tick的方式执行Ongoing,松开按键时只执行一次Triggered,随后执行Completed

弦操作:

需要绑定一个输入行为作为弦操作,当弦操作触发时,才能执行该触发器的行为。

先执行Started,后在按下时以tick的方式执行Triggered,松开时执行Completed

注意:当绑定的弦操作正在触发Triggered时,此时进行该修改器的触发行为会终止绑定的弦操作的触发行为,但是仍然保持其触发状态

点按:

先执行Started,会检测按键按下的时间是否小于设置的点按释放时间阈值,在检测期间会一直以tick的方式执行Ongoing,当在阈值内抬起按键则会执行一次Triggered,随后立马执行Completed(成功触发),否则不会执行Triggered会直接执行Canceled(中断触发)。

点按受到时间膨胀的影响

组合(Beta):

分为组合操作和取消操作

可绑定多个输入行为,按下按键后先执行Started会在该期间tick的方式执行Ongoing在该按键的规定时间内按下其他组合的按键(不能同时)则执行一次Triggered,随后执行一次Completed,否则执行Canceled

可设置按键的时间

脉冲:

按下后先执行Started会根据设定的间隔间歇式地执行一次Triggered,在等待阶段会以tick的方式执行Ongoing,在Triggered执行完后松开按键则执行Completed,若在等待阶段松开按键则执行Canceled

当设置了触发限制的次数后,该脉冲输入会在执行对应的Triggered次数后,自动执行Completed

脉冲受到时间膨胀的影响

 

长按:

按下后先执行Started

按下的时间在保存时间阈值以内时则会以tick的方式执行Ongoing

当按下的时间大于保存时间阈值时则会以tick的方式执行Triggered,此时松开按键则会执行Completed,若小于,则直接执行Canceled

当设置为一次性时,在按下的时间等于保存时间的阈值时,会执行一次Triggered,随后会执行Completed

长按受到时间膨胀影响

可设定保存时间阈值一次性

长按和松开:

按下后先执行Started

按下时则会以tick的方式执行Ongoing

松开时,当按下的时间大于保存时间阈值时,则会执行一次Triggered,随后会执行Completed;当按下的时间小于保存时间阈值时,则直接执行Canceled

长按和松开受到时间膨胀影响

可设定保存时间阈值

与操作映射的区别:

可以进行连续触发,可以获得值类型的值、触发后的状态

与轴映射的区别:

可以利用输入行为的值类型来将不同轴的输入集合起来,以不同类型的形式输出

[展开全文]
DUChicken · 01-10 · 0