第一次提交

This commit is contained in:
不明不惑
2026-03-03 01:23:02 +08:00
commit 3e434877e8
1053 changed files with 102411 additions and 0 deletions

View File

@@ -0,0 +1,148 @@
// Copyright 2025 https://yuewu.dev/en All Rights Reserved.
#pragma once
#include "CoreMinimal.h"
#include "GGS_RagdollStructLibrary.h"
#include "Components/PawnComponent.h"
#include "GGS_RagdollComponent.generated.h"
class USkeletalMeshComponent;
DECLARE_DYNAMIC_MULTICAST_DELEGATE(FGGS_RagdollStartedSignature);
DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FGGS_RagdollEndedSignature, bool, bGrounded);
UCLASS(ClassGroup=(GGS), Blueprintable, meta=(BlueprintSpawnableComponent))
class GENERICGAMESYSTEM_API UGGS_RagdollComponent : public UPawnComponent
{
GENERATED_BODY()
public:
// Sets default values for this component's properties
UGGS_RagdollComponent(const FObjectInitializer& ObjectInitializer);
const FGGS_RagdollState& GetRagdollState() const;
bool IsRagdollAllowedToStart() const;
UFUNCTION(BlueprintCallable, BlueprintNativeEvent, Category = "GGS|Ragdoll")
void SetMeshComponent(USkeletalMeshComponent* InMeshComponent);
UFUNCTION(BlueprintCallable, BlueprintNativeEvent, Category = "GGS|Ragdoll")
bool IsRagdolling() const;
UFUNCTION(BlueprintCallable, Category = "GGS|Ragdoll")
void StartRagdoll();
UFUNCTION(BlueprintCallable, Category = "GGS|Ragdoll")
virtual void LocalStartRagdoll();
UPROPERTY(BlueprintAssignable, Category="Event")
FGGS_RagdollStartedSignature OnRagdollStartedEvent;
UPROPERTY(BlueprintAssignable, Category="Event")
FGGS_RagdollEndedSignature OnRagdollEndedEvent;
private:
UFUNCTION(Server, Reliable)
void ServerStartRagdoll();
UFUNCTION(NetMulticast, Reliable)
void MulticastStartRagdoll();
protected:
UFUNCTION(BlueprintNativeEvent, Category = "GGS|Ragdoll")
void OnRagdollStarted();
public:
bool IsRagdollAllowedToStop() const;
UFUNCTION(BlueprintCallable, Category = "GGS|Ragdoll", Meta = (ReturnDisplayName = "Success"))
bool StopRagdoll();
UFUNCTION(BlueprintCallable, Category = "GGS|Ragdoll")
virtual void LocalStopRagdoll();
private:
UFUNCTION(Server, Reliable)
void ServerStopRagdoll();
UFUNCTION(NetMulticast, Reliable)
void MulticastStopRagdoll();
protected:
UFUNCTION(BlueprintNativeEvent, Category = "GGS|Ragdoll")
UAnimMontage* SelectGetUpMontage(bool bRagdollFacingUpward);
UFUNCTION(BlueprintNativeEvent, Category = "GGS|Ragdoll")
void OnRagdollEnded(bool bGrounded);
virtual void OnRagdollEnded_Implementation(bool bGrounded);
private:
void SetRagdollTargetLocation(const FVector& NewTargetLocation);
UFUNCTION(Server, Unreliable)
void ServerSetRagdollTargetLocation(const FVector_NetQuantize& NewTargetLocation);
void RefreshRagdoll(float DeltaTime);
FVector RagdollTraceGround(bool& bGrounded) const;
void ConstraintRagdollSpeed() const;
protected:
// Called when the game starts
virtual void BeginPlay() override;
float DamperExactAlpha(float DeltaTime, float HalfLife);
float Clamp01(float Value);
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Ragdoll Settings")
FName PelvisBoneName{TEXT("pelvis")};
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Ragdoll Settings")
FName SpineBoneName{TEXT("spine_03")};
// If checked, the ragdoll's speed will be limited by the character's last speed for a few frames
// after activation. This hack is used to prevent the ragdoll from getting a very high initial speed
// at unstable FPS, which can be reproduced by jumping and activating the ragdoll at the same time.
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Ragdoll Settings")
uint8 bLimitInitialRagdollSpeed : 1 {true};
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Ragdoll Settings")
bool bPlayGetupMontageAfterRagdollEndedOnGround{false};
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Ragdoll Settings", meta=(EditCondition="bPlayGetupMontageAfterRagdollEndedOnGround"))
TSoftObjectPtr<UAnimMontage> GetUpFrontMontage;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Ragdoll Settings", meta=(EditCondition="bPlayGetupMontageAfterRagdollEndedOnGround"))
TSoftObjectPtr<UAnimMontage> GetUpBackMontage;
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Ragdoll State", Transient)
bool bRagdolling{false};
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Ragdoll State", Transient, Replicated)
FVector_NetQuantize RagdollTargetLocation{ForceInit};
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Ragdoll State", Transient)
FGGS_RagdollState RagdollState;
UPROPERTY(VisibleAnywhere, Category = "Ragdoll State", Transient)
TObjectPtr<USkeletalMeshComponent> MeshComponent{nullptr};
UPROPERTY(VisibleAnywhere, Category = "Ragdoll State", Transient)
TObjectPtr<APawn> PawnOwner{nullptr};
UPROPERTY(VisibleAnywhere, Category = "Ragdoll State", Transient)
TObjectPtr<ACharacter> CharacterOwner{nullptr};
public:
virtual void GetLifetimeReplicatedProps(TArray<FLifetimeProperty>& OutLifetimeProps) const override;
// Called every frame
virtual void TickComponent(float DeltaTime, ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction) override;
};

View File

@@ -0,0 +1,29 @@
// Copyright 2025 https://yuewu.dev/en All Rights Reserved.
#pragma once
#include "CoreMinimal.h"
#include "UObject/Object.h"
#include "Animation/PoseSnapshot.h"
#include "GGS_RagdollStructLibrary.generated.h"
USTRUCT(BlueprintType)
struct GENERICGAMESYSTEM_API FGGS_RagdollState
{
GENERATED_BODY()
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "GGS")
FVector Velocity{ForceInit};
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "GGS", Meta = (ForceUnits = "N"))
float PullForce{0.0f};
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "GGS", Meta = (ClampMin = 0))
int32 SpeedLimitFrameTimeRemaining{0};
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "GGS", Meta = (ClampMin = 0, ForceUnits = "cm/s"))
float SpeedLimit{0.0f};
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "GGS")
FPoseSnapshot FinalRagdollPose;
};