导言
当你试图在游戏中切换英雄或打开背包时,你面临的第一个问题就是怎么打开这些带有独立光照、背景的场景,并且不影响原本的世界。
问题
- 场景切换问题。
- UI切换问题。
- 控制器切换问题
- 守望先锋
大约 5 分钟
当你试图在游戏中切换英雄或打开背包时,你面临的第一个问题就是怎么打开这些带有独立光照、背景的场景,并且不影响原本的世界。
void FCommonGameModule::StartupModule()
{
RegisterSettings();
}
void FCommonGameModule::ShutdownModule()
{
if (UObjectInitialized())
{
UnregisterSettings();
}
}
先设置Max的属性,再设置正常的属性。
#define ATTRIBUTE_ACCESSORS(ClassName, PropertyName) \
GAMEPLAYATTRIBUTE_PROPERTY_GETTER(ClassName, PropertyName) \
GAMEPLAYATTRIBUTE_VALUE_GETTER(PropertyName) \
GAMEPLAYATTRIBUTE_VALUE_SETTER(PropertyName) \
GAMEPLAYATTRIBUTE_VALUE_INITTER(PropertyName)
class EXORCIST_API UExorcistAttributeSet : public UAttributeSet
{
GENERATED_BODY()
public:
UExorcistAttributeSet();
//重写复制函数
virtual void GetLifetimeReplicatedProps(TArray<FLifetimeProperty>& OutLifetimeProps) const override;
//属性修改前调用的函数,用于钳制输出或者一些规则设定,但他不会真正的修改某个Attributes属性
virtual void PreAttributeChange(const FGameplayAttribute& Attribute, float& NewValue) override;
//设置Health
UPROPERTY(BlueprintReadOnly, Category = "Health", ReplicatedUsing = OnRep_Health)
FGameplayAttributeData Health;
ATTRIBUTE_ACCESSORS(UExorcistAttributeSet, Health);
//设置最大Health
UPROPERTY(BlueprintReadOnly, Category = "Health", ReplicatedUsing = OnRep_MaxHealth)
FGameplayAttributeData MaxHealth;
ATTRIBUTE_ACCESSORS(UExorcistAttributeSet, MaxHealth);
}
UExorcistAttributeSet::UExorcistAttributeSet()
{
InitHealth(100.f);
InitMaxHealth(100.f);
}
void UExorcistAttributeSet::GetLifetimeReplicatedProps(TArray<FLifetimeProperty>& OutLifetimeProps) const
{
Super::GetLifetimeReplicatedProps(OutLifetimeProps);
DOREPLIFETIME_CONDITION_NOTIFY(UExorcistAttributeSet, Health, COND_None, REPNOTIFY_Always);
DOREPLIFETIME_CONDITION_NOTIFY(UExorcistAttributeSet, MaxHealth, COND_None, REPNOTIFY_Always);
}
void UExorcistAttributeSet::OnRep_Health(const FGameplayAttributeData& OldHealth)
{
GAMEPLAYATTRIBUTE_REPNOTIFY(UExorcistAttributeSet, Health, OldHealth);
}
void UExorcistAttributeSet::OnRep_MaxHealth(const FGameplayAttributeData& OldHealth)
{
GAMEPLAYATTRIBUTE_REPNOTIFY(UExorcistAttributeSet, MaxHealth, OldHealth);
}
UFUNCTION(BlueprintCallable, BlueprintAuthorityOnly, Category = "Gameplay Abilities", meta = (DisplayName = "Give Ability", ScriptName = "GiveAbility"))
FGameplayAbilitySpecHandle K2_GiveAbility(TSubclassOf<UGameplayAbility> AbilityClass, int32 Level = 0, int32 InputID = -1);
/**
* 返回上一次由 ConsumeMovementInputVector() 处理的世界空间中的输入向量,这通常由 Pawn 或 PawnMovementComponent 完成。
* 任何需要了解上次影响移动的输入的用户都应该使用此函数。
* 例如,动画更新会使用这个函数,因为默认情况下,帧中更新的顺序是:
* PlayerController(设备输入)-> MovementComponent -> Pawn -> Mesh(动画)
*
* @return 上一次由 ConsumeMovementInputVector() 处理的世界空间中的输入向量。
* @see AddMovementInput(), GetPendingMovementInputVector(), ConsumeMovementInputVector()
*/
UFUNCTION(BlueprintCallable, Category="Pawn|Input", meta=(Keywords="GetMovementInput GetInput"))
ENGINE_API FVector GetLastMovementInputVector() const;
以方向为例,优化方向结构体的网络传输
UENUM(BlueprintType)
enum class EDirectionType : uint8
{
Forward UMETA(DisplayName = "Forward"),
Backward UMETA(DisplayName = "Backward"),
Left UMETA(DisplayName = "Left"),
Right UMETA(DisplayName = "Right"),
Invalid UMETA(DisplayName = "Invalid")
};
bIgnoreClientMovementErrorChecksAndCorrection
用途:
true
时,服务器会忽略来自客户端的移动误差修正请求。适用场景:
bIgnoreClientMovementErrorChecksAndCorrection
可以减少这种不必要的“位置拉扯”。ExorcistUIMessaging
是一个用于在游戏中展示全局消息框(MessageBox)的子系统,支持错误、确认等提示信息。
它基于 MVC 设计模式实现,通过异步蓝图节点来展示消息,能够简化用户与系统之间的交互。
UFUNCTION(BlueprintCallable, BlueprintCosmetic, meta = (BlueprintInternalUseOnly = "true", WorldContext = "InWorldContextObject"))
static UAsyncAction_ShowConfirmation* ShowConfirmationYesNo(
UObject* InWorldContextObject, FText Title, FText Message
);