protected override void OnUpdate() { Entities.ForEach((Entity entity, ref Text3D text3D, ref SetText3DCmd setTextCmd) => { var text = text3D.Text; var newText = setTextCmd.Text; EntityManager.RemoveComponent <SetText3DCmd>(entity); if (text.Equals(newText)) { return; } text3D.Text = newText; //textComp.IsNeedUpdate = true; if (EntityManager.HasComponent <UpdatedState>(entity)) { EntityManager.RemoveComponent <UpdatedState>(entity); } }); Entities .WithNone <UpdatedState>() .ForEach((Entity entity, ref Text3D text3D) => { if (!gameDataManagerSystem.GetGameData <Font3DData>(text3D.FontId, out var font3DData)) { return; } Font3DUtil.UpdateText3D(EntityManager, entity, font3DData); EntityManager.AddComponent <UpdatedState>(entity); }); Entities .WithNone <Parent>() .ForEach((Entity entity, ref Char3D char3D) => { EntityManager.DestroyEntity(entity); }); }
public static bool UpdateText3D(EntityManager entityManager, Entity textEntity, Font3DData fontData) { var text3D = entityManager.GetComponentData <Text3D>(textEntity); var text = text3D.Text; var fontSize = text3D.FontSize; //var HAlignType = text3D.HAlignType; //var VAlignType = text3D.VAlignType; //var HSpacing = text3D.HSpacing; //var VSpacing = text3D.VSpacing; var buffer = entityManager.GetBuffer <Char3DElement>(textEntity); //remove all char elements foreach (var element in buffer) { if (element.CharEntity != Entity.Null) { DestroyChar3DEntity(entityManager, element.CharEntity, element.Char); } } //add new char elements var len = text.LengthInBytes; if (len > 0) { var fontEntity = fontData.Prefab; var font3D = entityManager.GetComponentData <Font3D>(fontEntity); var fontCharElementBuffer = entityManager.GetBuffer <FontChar3DElement>(fontEntity); //var fontCharElementArray = fontCharElementBuffer.ToNativeArray(Allocator.Temp); var charWidth = font3D.CharWidth; var charHeight = font3D.CharHeight; //var buf = new NativeArray<Char3DElement>(len, Allocator.Temp); //var aa = fontCharElementArray.ToArray(); //var ll = fontCharElementBuffer.Length; //var aa = new FontChar3DElement[ll]; for (int i = 0; i < Font3DData.CharNum; i++) { fontChar3DElementBuf[i] = fontCharElementBuffer[i]; } var buf = new NativeList <Char3DElement>(Allocator.Temp); Font3DUtil.ProcessText3D <FontChar3DElement>(text3D, fontChar3DElementBuf, charWidth, charHeight, (fontChar3D, x, y) => { var prefab = fontChar3D.Prefab; var textChar = fontChar3D.Char; var charEntity = CreateChar3DEntity(entityManager, prefab, textChar); entityManager.AddComponentData(charEntity, new Char3D { Char = textChar }); entityManager.SetOrAddComponentData(charEntity, new NonUniformScale { Value = new float3(fontSize) }); EntityUtil.SetParent(entityManager, charEntity, textEntity); //var charEntity = CreateCharEntity(entityManager, textEntity, textChar); buf.Add(new Char3DElement { Char = textChar, CharEntity = charEntity }); var pos = entityManager.GetComponentData <Translation>(charEntity); pos.Value = new float3(x, y, 0f); entityManager.SetComponentData(charEntity, pos); }); buffer = entityManager.GetBuffer <Char3DElement>(textEntity); buffer.Clear(); buffer.AddRange(buf.AsArray()); buf.Dispose(); //fontCharElementArray.Dispose(); //unsafe //{ // byte* b = &text.buffer.byte0000; // //calculate x, y // var minX = 0f; // var minY = 0f; // var textWidth = 0f;// = len * charWidth; // var textHeight = charHeight; // for (int i = 0; i < len; i++) // { // var textChar = (char)b[i]; // if (i > 0) // textWidth += HSpacing; // var charCode = (int)textChar; // var index = charCode - Font3DData.MinCharCode; // if (index < 0 || index >= Font3DData.CharNum) // { // textWidth += charWidth; // continue; // } // var fontCharElement = fontCharElementArray[index]; // var prefab = fontCharElement.Prefab; // if (prefab == Entity.Null) // { // textWidth += charWidth; // continue; // } // textWidth += fontCharElement.Size.x; // } // if (HAlignType == EHAlignType.Middle) // { // minX = -(textWidth) * 0.5f; // } // else if (HAlignType == EHAlignType.Right) // { // minX = -(textWidth); // } // if (VAlignType == EVAlignType.Middle) // { // minY = -(textHeight) * 0.5f; // } // else if (VAlignType == EVAlignType.Top) // { // minY = -(textHeight); // } // var buf = new NativeArray<Char3DElement>(len, Allocator.Temp); // float textOffsetX = 0f; // for (int i = 0; i < len; i++) // { // var textChar = (char)b[i]; // //if (!IsSupportLowerCase) // //{ // // if (cc >= 97 && cc <= 122) // // cc = (char)(cc - 32); // //} // if (i > 0) // textOffsetX += HSpacing; // var charCode = (int)textChar; // var index = charCode - Font3DData.MinCharCode; // if (index < 0 || index >= Font3DData.CharNum) // { // textOffsetX += charWidth; // continue; // } // var fontCharElement = fontCharElementArray[index]; // var prefab = fontCharElement.Prefab; // if (prefab == Entity.Null) // { // textOffsetX += charWidth; // continue; // } // var charEntity = CreateChar3DEntity(entityManager, prefab, textChar); // entityManager.AddComponentData(charEntity, new Char3D { Char = textChar }); // EntityUtil.SetParent(entityManager, charEntity, textEntity); // //var charEntity = CreateCharEntity(entityManager, textEntity, textChar); // buf[i] = (new Char3DElement { Char = textChar, CharEntity = charEntity }); // textOffsetX += fontCharElement.Size.x; // var x = minX + textOffsetX + fontCharElement.Min.x; // var y = minY; // var pos = entityManager.GetComponentData<Translation>(charEntity); // pos.Value = new float3(x, y, 0f); // entityManager.SetComponentData(charEntity, pos); // } // buffer = entityManager.GetBuffer<Char3DElement>(textEntity); // buffer.Clear(); // buffer.AddRange(buf); // buf.Dispose(); //} } return(true); }