gamemaxs

Üye
15 Kas 2024
30
4
8
Arkadaslar nasil yapabilecegimi ve nasil arayacagimi bilemedigimden size sorayim dedim. Ornegin, multiplayer bir oyunda benim uzerimdeki ceketin rengi sari olacak. Ama diger oyunculardan birine siyah, digerine kirmizi gozukecek.. Yani herkese farkli renkte gosterecek. Bunu static mesh olarakta dusunebilirsiniz, sadece material degil. Bunu nasil yapabilirim?
 
Öncelikle "Unreal Engine Replication Condition" konusunu bilmelisin:
https://dev.epicgames.com/documenta...property-replication?application_version=4.27
Burda sadece bazı kişilere replicate etme var. Mesela sadece owner a ya da simulated proxy ye etc. O sayfada anlatıyor ve bu konu üzerine araştırma yapabilirsin. Bu konuyu öğrenmen gerekiyor.
Ancak senin istediğin sanırım biraz daha ayrıntılı. Yani her bir oyuncuya ne tür olduğundan bağımsız olarak ayrı ayrı görünmesini istiyorsun. Bunun için PlayerState te bir "PlayerID" yaratabilirsin. Her oyuncunun farklı bir ID si olması gerekir. Bundan sonra clientlarda replicated olarak ayarladığın herşeyin replicated olduğunda bu ID ile çek edilmesini sağlarsın. Yani client kendi playerID si ile serverdan gelen PlayerID yi çek eder. Aynı değilse bir şey yapmaz. Aynıysa o replicated event e bir şey yapar. Mesela üzerindeki skeletalmeshi değiştirmek ya da material parameter i değiştirmek vb.
 
  • Beğen
Tepkiler: gamemaxs
Tesekkurler hocam, Replication Condition i biraz inceledim. Sizin dediginiz gibi bir yapi kurmam lazim anladigim kadariyla fakat sizin dediklerinizi kafamda pek oturtamadim. PlayerState unique bir PlayerID vereyim. Bu replicated olsun. Ornegin oyunun bir noktasinda sadece ben sizin elinizdeki meshi farkli gormem lazim. 4 oyuncu var. Idler 1 2 3 4. //// Mesela 2. 3.nun elindeki meshi farkli gorecek.
`herşeyin replicated olduğunda bu ID ile çek edilmesini sağlarsın` buradan sonra koptum hocam. Cizerek anlatabilirseniz cok sevinirim. Tekrardan tesekkurler.
 
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)
 
  • Beğen
Tepkiler: gamemaxs
Tesekkurler hocam, denemeye basladim. RPC, replication vs genel multiplayer yapilarini biliyorum hocam fakat pek kullanmadigim icin pratigim yok ama ogreniyorum.