Mesela EColor diye bir enum ile ilgili böyle bir sistem kurmak istesek C++ ta şuna yakın bir kod yazabiliriz. Bu arada senin kuralının neye göre olduğunu bilmiyorum. Onu senin belirlemen gerekiyor. Yani kim kimi niye görecek. Kural ne. PlayerID son rakamı tek olanlar kırmızı görecek mesela. Team farklı olan mı görecek. Konuşurken farazi konuşabiliriz ama bunu kodda kural olarak net belirlememiz gerekecek. Ben aşağıda ki kodda PlayerID==1 ise şöyle böyle yap diye yazı yazdırdım. Sen de buna PlayerID==2 ise şu olsun diye ekeleyebilirsin: Mesel PlayerID==3 se gelen Black EColor White olsun diyebilirsin. Ya da kafandaki kural her ne ise. ( Bu arada syntax olarak doğru değil ben mantığı göstermek için hızlıca text editor de yazdım. )
#include "GameFramework/PlayerController.h"
#include "GameFramework/PlayerState.h"
#include "Engine/Engine.h"
#include "YourProjectPlayerState.h"
#include "YourProjectCharacter.h"
UCLASS()
class YOURPROJECT_API AYourCharacter : public ACharacter
{
GENERATED_BODY()
public:
AYourCharacter();
protected:
// Replicated variable
UPROPERTY(ReplicatedUsing=OnRep_Color)
EColor Color;
// RepNotify function
UFUNCTION()
void OnRep_Color();
virtual void GetLifetimeReplicatedProps(TArray<FLifetimeProperty>& OutLifetimeProps) const override;
};
AYourCharacter::AYourCharacter()
{
// Default values for the character or initialization
}
void AYourCharacter::OnRep_Color()
{
// Ensure we have a valid player controller
APlayerController* PlayerController = GetController<APlayerController>();
if (PlayerController)
{
// Get the PlayerState
APlayerState* PlayerState = PlayerController->GetPlayerState<APlayerState>();
if (PlayerState)
{
// You can access your custom PlayerState here
AYourProjectPlayerState* CustomPlayerState = Cast<AYourProjectPlayerState>(PlayerState);
if (CustomPlayerState)
{
// Check PlayerID (assuming PlayerID is available in the PlayerState)
int32 PlayerID = CustomPlayerState->GetPlayerId();
if (PlayerID == 1) // Example condition for PlayerID
{
switch (Color)
{
case EColor::Red:
UE_LOG(LogTemp, Warning, TEXT("Player %d has selected Red color in PlayerState: %s"), PlayerID, *CustomPlayerState->GetName());
break;
case EColor::Blue:
UE_LOG(LogTemp, Warning, TEXT("Player %d has selected Blue color in PlayerState: %s"), PlayerID, *CustomPlayerState->GetName());
break;
case EColor::Green:
UE_LOG(LogTemp, Warning, TEXT("Player %d has selected Green color in PlayerState: %s"), PlayerID, *CustomPlayerState->GetName());
break;
case EColor::Yellow:
UE_LOG(LogTemp, Warning, TEXT("Player %d has selected Yellow color in PlayerState: %s"), PlayerID, *CustomPlayerState->GetName());
break;
default:
UE_LOG(LogTemp, Warning, TEXT("Player %d has selected an unknown color in PlayerState: %s"), PlayerID, *CustomPlayerState->GetName());
break;
}
}
else
{
// For other PlayerID's, display a different log or behavior
UE_LOG(LogTemp, Warning, TEXT("Player %d has a different PlayerState: %s"), PlayerID, *CustomPlayerState->GetName());
}
}
}
}
}
void AYourCharacter::GetLifetimeReplicatedProps(TArray<FLifetimeProperty>& OutLifetimeProps) const
{
Super::GetLifetimeReplicatedProps(OutLifetimeProps);
// Replicate the Color variable
DOREPLIFETIME(AYourCharacter, Color);
}
Editor açıp BP kodları yazmak daha zor geldi o yüzden böyle yazdım.. Aynısı BP de de bu şekilde yapılabilir. Burda özetle Client ta çalışan OnRepNotify da PlayerState deki PlayerID ye göre bir şeyler değiştiriyoruz. Ben burda bir se iki ise dedim. Sen bunu istediğin gibi geliştirebilirsin.
(OnRepNotify nedir biliyorsundur umarım. Yoksa onu da öğrenmen gerekecek)