Hello!
So, I have isometric 3D game with 2 players.
Something like this:
And I want to block players movement on the sides of the screen.
How would be better to do that?
Hello!
So, I have isometric 3D game with 2 players.
Something like this:
And I want to block players movement on the sides of the screen.
How would be better to do that?
I thought about few ways:
Any ideas? Maybe you know some very cheap and good way for this?
With the UDK I made a top down multiplayer shooter for the ios. I used 4 (moveable? dynamic?) blocking volumes that I arranged to make a square. I then moved them around with the camera. Worked well enough. I think had to work out the sliding plane for collision response and was a hacky mess. Hopefully you won’t need to do this.
I would see what I could do with the frustum first -
https://docs.unrealengine.com/latest/INT/API/Runtime/Engine/GetViewFrustumBounds/index.html
https://docs.unrealengine.com/latest/INT/API/Runtime/Engine/DrawFrustumWireframe/index.html
https://docs.unrealengine.com/latest/INT/API/Runtime/Engine/DrawDebugFrustum/index.html
I am assuming both the players have the same viewtarget set. To find if any of the player is at the screens edge you could try converting their world position into screen position using this code
//Code modified from function PlayerController::GetHitResultAtScreenPosition()
ULocalPlayer* LocalPlayer = Cast<ULocalPlayer>(m_playerControl->Player);
if (LocalPlayer != NULL && LocalPlayer->ViewportClient != NULL && LocalPlayer->ViewportClient->Viewport != NULL)
{
// Create a view family for the game viewport
FSceneViewFamilyContext ViewFamily(FSceneViewFamily::ConstructionValues(
LocalPlayer->ViewportClient->Viewport,
m_world->Scene,
LocalPlayer->ViewportClient->EngineShowFlags)
.SetRealtimeUpdate(true));
// Calculate a view where the player is to update the streaming from the players start location
FVector ViewLocation;
FRotator ViewRotation;
FSceneView* SceneView = LocalPlayer->CalcSceneView(&ViewFamily, ViewLocation, ViewRotation, LocalPlayer->ViewportClient->Viewport);
if (SceneView)
{
//Converts a world position to screen position
SceneView->WorldToScreen(FVector(0, 0, 0)).ToString();
}
}
Replace the zero vector with your player position.You can get the screen resolution from usergamesettings
UGameUserSettings* UserSettings = GEngine->GetGameUserSettings();
FIntPoint res = UserSettings->GetScreenResolution();
or from the player controller using GetViewportSize(x, y) , but I think this works only in the editor. With this you can try restricting the player movement or better yet add a collision filter for boxes placed appropriately and attached to the camera that only block your player.
https://www.unrealengine.com/blog/collision-filtering