Hallo,
Ich suche etwas Hilfe!
Rahmenbedingungen:
Ich arbeite gerade an einem Top-Down-Shooter mit lokalem Multiplayer. Dabei können vier Spieler zusammen auf einem Bildschirm spielen und müssen gegen Monster Wellen kämpfen.
Situation:
Ich habe einen CameraActor geschrieben, der das Zentrum aller Charaktere fokussiert. Zusätzlich zoomt die Kamera automatisch abhängig zur Entfernung zwischen den Charakteren.
Ziel:
Die Charaktere können nicht aus dem Bild laufen sondern werden im Bild gehalten, damit keiner verloren geht.
Problem:
Ich habe folgendes System implementiert, welches wunderbar funktioniert, aber nur für den ersten Spieler. Diese Bewegungseinschränkung wird von den anderen Spielern ignoriert.
public:
// Range between the X ScreenEdge and the Movement Boundary in %
UPROPERTY(EditAnywhere, Category = Camera)
float m_XBoundary;
// Range between the Y ScreenEdge and the Movement Boundary in %
UPROPERTY(EditAnywhere, Category = Camera)
float m_YBoundary;
ATDS_PlayerController* m_PlayerController;
protected:
// Left Stick / WASD Input
void MovementForward(float Value);
void MovementRight(float Value);
// Character Movement Boundary
void SetBoundary();
Alles anzeigen
// Called when the game starts or when spawned
void ATDS_Character::BeginPlay()
{
Super::BeginPlay();
m_PlayerController = Cast<ATDS_PlayerController>(Controller);
}
void ATDS_Character::Tick( float DeltaTime )
{
Super::Tick( DeltaTime );
if (m_PlayerController != NULL)
{
SetBoundary();
}
//...
}
void ATDS_Character::MovementForward(float Value)
{
if ((Controller != NULL) && (Value != 0.0f))
{
// find out which way is forward
FRotator Rotation = Controller->GetControlRotation();
// Limit pitch when walking or falling
if (GetCharacterMovement()->IsMovingOnGround() || GetCharacterMovement()->IsFalling())
{
Rotation.Pitch = 0.0f;
}
// add movement in that direction
const FVector Direction = FRotationMatrix(Rotation).GetScaledAxis(EAxis::X);
AddMovementInput(Direction, Value);
}
}
void ATDS_Character::MovementRight(float Value)
{
if ((Controller != NULL) && (Value != 0.0f))
{
// find out which way is right
const FRotator Rotation = Controller->GetControlRotation();
const FVector Direction = FRotationMatrix(Rotation).GetScaledAxis(EAxis::Y);
// add movement in that direction
AddMovementInput(Direction, Value);
}
}
void ATDS_Character::SetBoundary()
{
FVector2D ViewportSize = FVector2D(GEngine->GameViewport->Viewport->GetSizeXY());
m_PlayerController->ProjectWorldLocationToScreen(GetActorLocation(), m_ScreenLocation);
if (m_ScreenLocation.X < (10 + (ViewportSize.X / m_XBoundary)))
{
MovementRight(1.0f);
}
if (m_ScreenLocation.X >(ViewportSize.X - (ViewportSize.X / m_XBoundary)))
{
MovementRight(-1.0f);
}
if (m_ScreenLocation.Y < (10 + (ViewportSize.Y / m_YBoundary)))
{
MovementForward(-1.0f);
}
if (m_ScreenLocation.Y >(ViewportSize.Y - (ViewportSize.Y / m_YBoundary)))
{
MovementForward(1.0f);
}
}
Alles anzeigen
Ich sitze schon ein Weilchen an diesem Problem und die Recherche in den offiziellen Unreal Bereichen blieb erfolglos.
Jeder Tipp ist hilfreich!
gruß Micha
#FirstPost