Course contentsShow
← Unreal Engine Game Development
Lesson 743 of 88010. Networking and ReplicationFree lesson

Transferring Actor Ownership During Gameplay

Execute dynamic ownership changes to pass control of interactable objects, such as vehicles or items, between different player controllers.

In this lesson, you will learn how to dynamically reassign an AActor’s network owner to grant different player controllers authority over interactable objects like vehicles or inventory items.

The Role of Ownership

As you learned in lesson 22, ownership defines the hierarchy for network connections. When an actor’s Owner property is set to a APlayerController, the engine treats the connection associated with that controller as the "owning client." This is critical because Owner is the primary factor in determining which clients receive relevant updates and which can execute Client and Server RPCs on that specific actor.

Changing Ownership Dynamically

To transfer ownership—such as when a player enters a vehicle—you must invoke SetOwner() on the actor. This function is defined in AActor and updates the internal Owner pointer. Because ownership is a replicated property, calling this on the server will automatically propagate the change to all clients.

When you transition ownership, remember that the previous owner loses the ability to execute RPCs on that actor, and the new owner gains it.

void AInteractableVehicle::PossessVehicle(APlayerController* NewDriver)
{
    if (HasAuthority())
    {
        // SetOwner automatically handles replication and network role updates
        SetOwner(NewDriver);
        
        // Notify the new owner via a client RPC if specific UI/input setup is needed
        Client_OnVehicleAssigned(NewDriver);
    }
}

Critical Considerations

When swapping ownership, be mindful of race conditions. If you are handling complex state changes, ensure the server completes the SetOwner call before the new controller attempts to perform actions on the object. Furthermore, always verify that your GetOwner() logic is robust enough to handle the transition phase; an actor might briefly have no owner or a "stale" owner if the transition logic is triggered mid-frame or during an interrupted state.

By strategically reassigning the Owner pointer, you ensure that network traffic and RPC permissions follow the player, keeping the simulation consistent and responsive for the client currently interacting with the object.

Key Takeaway: Use SetOwner() on the server to dynamically reassign an actor's network controller, which instantly updates the RPC hierarchy and replication focus for that object.