Archive 17/01/2023.

Replication of custom Urho3D::Component

z80

Hello!

I’m trying to make a derivative object based on Urho3D::Component to be replicated over network.

How I do that is the following:

class RefFrame:  public Urho3D::Component
{
    URHO3D_OBJECT( RefFrame, Component )
public:
    /// Register object factory.
    static void RegisterObject( Context * context);

    RefFrame( Context * ctx, const String & name=String() );
    virtual ~RefFrame();

    void setName( const String & name );
    ...


void RefFrame::RegisterObject( Context * context )
{
    context->RegisterFactory<RefFrame>();
    URHO3D_COPY_BASE_ATTRIBUTES( Component );
    URHO3D_ATTRIBUTE( "Name", String, name_, "", AM_DEFAULT );
}

And when I create the “RefFrame” component as either Scene::CreateComponent<RefFrame>( REPLICATED ) or Node::CreateComponent<RefFrame>( REPLICATED ) it is created. But there is no reaction on component attributes change.

Even when I explicitly call “MarkNetworkUpdate()” nothing happens. Inside “MarkNetworkUpdate()” the “networkUpdate_” field is always “true”.

And Component::PrepareNetworkUpdate() for this component is called only once and exits because of “networkState_->attributes_” is NULL.

What do I miss here?

Modanung

Is the Node itself a replicated one?

Note that a replicated component created into a local node will not be replicated, as the node’s locality is checked first.

Modanung

Does setName call SetAttribute?
It would in turn call OnSetAttribute, which contains a call to MarkNetworkUpdate().

z80

Yes. It is replicated. I also tried to create component directly by Scene.

No I didn’t try calling SetAttribute(). What it does is

void setName( const String & name )
{
    name_ = name;
    MarkNetworkUpdate();
}

I’ll try calling “SetAttribute()”.

BTW, does it matter when exactly replicated components are created before/after connection?

Thank you!

Modanung

This should not make any difference, as long as they are created by the server.