Problem with Hierarchical Instanced Static Mesh Component (HISM) in Multiplayer Game

Hi, I’m developing a multiplayer game where I’m using HierarchicalInstancedStaticMeshComponent (HISM) to represent large numbers of static meshes for efficiency (about 5000 platforms sized 1500x1500). Specifically, I’m using HISM to generate the platforms (and potentially other decorative objects like trees and stones) across my game world. The meshes are primarily decorative and are supposed to block player movement but do not need to handle complex interactions, physics, or destruction.

However, I’m encountering persistent warnings related to network replication and physics interactions. These warnings occur when my replicated player interacts with the HISM-generated floor or platforms. Here’s the warning I’m seeing:

Warning      LogNetPackageMap          FNetGUIDCache::SupportsObject: HierarchicalInstancedStaticMeshComponent /Game/Maps/(...).HierarchicalInstancedStaticMeshComponent_0 NOT Supported.

Context:

  • I’m using HISM to efficiently render thousands of instances (around 5000 meshes which I can group in about 350 HISM) of platform meshes and much more if we add trees, rocks and other decoratives. These surfaces block player movement but have no other interactions.
  • The error occurs when the player steps on or interacts with the surfaces.
  • I know that HISM does not support replication, but I’m confused as to why Unreal Engine is trying to involve network-related interactions for the floor, which should be non-interactive other than blocking movement.

Here’s how I’m currently handling collision and interaction for the HISM components:

void MyPlatformGroup::ActivateGroupCollisions()
{
    if (HasAuthority())
    {
        HISM_Asset->SetCollisionEnabled(ECollisionEnabled::QueryAndPhysics);  
        HISM_Asset->SetCollisionResponseToAllChannels(ECR_Block);
        HISM_Asset->SetCollisionResponseToChannel(ECC_Pawn, ECR_Block);
    }
    else
    {
        HISM_Asset->SetCollisionEnabled(ECollisionEnabled::QueryOnly);  
        HISM_Asset->SetCollisionResponseToChannel(ECC_Pawn, ECR_Block);
    }
    HISM_Asset->SetSimulatePhysics(false);
    HISM_Asset->SetIsReplicated(false);
}

The Problem:

Even though I have disabled physics and replication for the HISM component, I still receive the error whenever my player steps on the HISM-generated floor or platform. It appears that Unreal Engine is attempting to resolve some network interaction between the replicated player character and the non-replicated HISM.

Questions:

  1. Is it inherently problematic to use HISM for surfaces that interact with players in a multiplayer context? I thought that since the floor is mostly decorative (just blocking movement), HISM would be fine, but it seems like the engine still attempts to involve network logic.
  2. Should I consider using UStaticMeshComponent for the floor/platforms instead of HISM? My understanding is that UStaticMeshComponent handles network replication better, but I have around 5,000 instances of these meshes (it looks awesome). This would be a performance issue, right?
  3. Is using a separate invisible proxy component for collisions in addition to the HISM a good approach in a multiplayer game, or does it introduce unnecessary complexity and overhead? Is there a better way to handle this where I can still use HISM for efficient rendering without duplicating components for collisions?

If the server is generating the tiles…Adding instances, then for the client to see them, they have to be replicated down to the client.

Instead of making the HISM component replicated. You can have the server add the instance locally (server-side), then use a MultiCast to call a function on “clients only” to add the new instances.

This is going to eat a lot of bandwidth. The MC’s or any other RPC’s for the HISM’s have to set to Reliable.

1 Like

@Rev0verDrive Thank you for your answer! :slightly_smiling_face: I’m new to Unreal Engine but not new to programming, so your insights are very helpful.

From what I understand, it’s possible to handle everything with HISM by using Multicast calls, but this would consume a lot of network resources due to the data load from reliably multicasting each instance’s transform.

Given this, I’d prefer an approach where I prepare and draw the HISM instances separately on both the server and client, while keeping only the positions (or necessary transforms) replicated. My idea is to use invisible colliders that spawn and activate as clients enter each tile area, ensuring they have collision and blocking without high network traffic.

Is this a good approach for efficiency in multiplayer, or would you suggest any improvements?