The latest Entities Graphics package should work with Android. Can you see any error messages either when making the build, or in Android Logcat when running the build?
Hi @JussiKnuuttila , sorry for the delay. I can confirm, it works on mobile, no errors.
The issue was something with my code logic itself and mainly related to the order of things: for example a system for instantiating things was disabled before it got to instantiate them. However, in the editor the logic was different.
Would also like to know this.
Hey @JussiKnuuttila ,
Are there any plans to add static batching support to Entities Graphics?
It’s still the only easiest and cheapest way to bring draw calls down when rendering large static objects made up of different meshes that share the same material.
Any chance for it to be added for Unity 2022?
Thank you!
I have upgraded Editor from 2021.1.27.f1 to 2022.3.41f1, Entities from 0.0.1 to 1.3.2 and Hybrid Renderer 0.0.1 to Entities Graphics 1.3.2. I managed to fix most of the compilation errors, but figuring out how to replace RenderMesh
would solve the majority of my remaining errors.
Assets\Experior\Rendering\MeshObjectRenderer.cs(240,24): error CS1061: ‘RenderMesh’ does not contain a definition for ‘layer’ and no accessible extension method ‘layer’ accepting a first argument of type ‘RenderMesh’ could be found (are you missing a using directive or an assembly reference?)
Besides layer
, the problem is also with castShadows
and receiveShadows
.
Here is an example of how are they used in my code.
private void CreateEntityECS(IMeshObject meshObject)
{
// other code
Mesh mesh = CreateMeshECS(meshObject);
Material mat = GetMaterialECS(meshObject);
var renderMesh = entityManager.GetSharedComponentManaged<RenderMesh>(entity);
renderMesh.material = mat;
renderMesh.mesh = mesh;
renderMesh.layer = 9;
renderMesh.castShadows = ShadowCastingMode.On;
renderMesh.receiveShadows = true;
// other code
}
RenderMesh itself is no longer used for entity creation at runtime.
Refer to this page for info on setup.
@Spy-Master thank you
After reviewing the page you provided I modified the code like this:
Entity entity = entityManager.CreateEntity(entityArchetype);
SetSceneLayer(entity, meshObject.SceneLayer);
Mesh mesh = CreateMeshECS(meshObject);
Material mat = GetMaterialECS(meshObject);
// before
var renderMesh = entityManager.GetSharedComponentManaged<RenderMesh>(entity);
renderMesh.material = mat;
renderMesh.mesh = mesh;
renderMesh.layer = 9;
renderMesh.castShadows = ShadowCastingMode.On;
renderMesh.receiveShadows = true;
entityManager.SetSharedComponentManaged(entity, renderMesh);
entities[meshObject.Id] = entity;
entityManager.SetComponentData(entity, new EntityData { id = meshObject.Id });
var maxBound = renderMesh.mesh.bounds.size.x;
if (maxBound < renderMesh.mesh.bounds.size.y)
{
maxBound = renderMesh.mesh.bounds.size.y;
}
if (maxBound < renderMesh.mesh.bounds.size.z)
{
maxBound = renderMesh.mesh.bounds.size.z;
}
// after
var renderMeshDescription = new RenderMeshDescription(
layer: 9,
shadowCastingMode: ShadowCastingMode.On,
receiveShadows: true);
var renderMeshArray = new RenderMeshArray(new Material[] { mat }, new Mesh[] { mesh });
RenderMeshUtility.AddComponents(
entity,
entityManager,
renderMeshDescription,
renderMeshArray,
MaterialMeshInfo.FromRenderMeshArrayIndices(0, 0));
entityManager.AddComponentData(entity, new LocalToWorld());
entities[meshObject.Id] = entity;
entityManager.SetComponentData(entity, new EntityData { id = meshObject.Id });
var maxBound = renderMeshArray.MeshReferences[0].Value.bounds.size.x;
if (maxBound < renderMeshArray.MeshReferences[0].Value.bounds.size.y)
{
maxBound = renderMeshArray.MeshReferences[0].Value.bounds.size.y;
}
if (maxBound < renderMeshArray.MeshReferences[0].Value.bounds.size.z)
{
maxBound = renderMeshArray.MeshReferences[0].Value.bounds.size.z;
}
One more place where the problem with RenderMesh occurs is when changing the color of the entity:
private void ColorChangedECS(IMeshObject meshObject)
{
if (!entities.TryGetValue(meshObject.Id, out var entity))
return;
Material mat = GetMaterialECS(meshObject);
var temp = entityManager.GetSharedComponentManaged<RenderMesh>(entity);
entityManager.SetSharedComponentManaged(entity, new RenderMesh()
{
layer = temp.layer,
material = mat,
mesh = temp.mesh,
castShadows = temp.castShadows,
receiveShadows = temp.receiveShadows
});
}