Search Unity

Modular 3D Text - Complete ingame ui sytem

Discussion in 'Assets and Asset Store' started by FerdowsurAsif, Feb 4, 2020.

  1. midwinter86

    midwinter86

    Joined:
    Mar 29, 2022
    Posts:
    4
    Ok, looks like I was missing a required reference to the Unity.InputSystem that was causing this.
    One thing that I noticed was that if a line string has a line that begins with a space, the first space it seems to get trimmed. I'm presenting content from an external api that expects a monospace font to be used for formatting, is this a known/intended behaviour?
     
  2. FerdowsurAsif

    FerdowsurAsif

    Joined:
    Feb 7, 2017
    Posts:
    287
    Edit 1: ops, I didn't see your last message on the next page. Looking into it.

    Edit 2: Found the culprit. It's the grid layout that is ignoring the space. Fixing it.
     
    Last edited: Jan 12, 2023
  3. FerdowsurAsif

    FerdowsurAsif

    Joined:
    Feb 7, 2017
    Posts:
    287
    Pushed an update(3.1.11) with the fix. Should be available soon.
     
  4. midwinter86

    midwinter86

    Joined:
    Mar 29, 2022
    Posts:
    4
    Awesome! Thanks @Ferdowsur! I'm working on a fly-in module and it works when I use it on enable but it's creating some unexpected behaviour when the text gets disabled even thought the module is only supposed to run on enable. Any ideas as to what could be causing it? here's a video of the behaviour:


    Module code (Sorry its a bit of a mess still):

    Code (CSharp):
    1. using System;
    2. using System.Collections;
    3. using System.Threading;
    4. using UnityEngine;
    5. using MText;
    6. using Random = UnityEngine.Random;
    7.  
    8. /// <summary>
    9. /// Variable holders:
    10. /// Index 0: DelayMin | float
    11. /// Index 0: DelayMax | float
    12. /// Index 1: DurationMin | float
    13. /// Index 1: DurationMax | float
    14. /// Index 2: Start position | Vector3
    15. /// Index 3: End position | Vector3
    16. /// Index 4: Move curve | Animation curve
    17. /// </summary>
    18. [CreateAssetMenu(menuName = "Modular 3d Text/Modules/Fly In")]
    19. public class MText_Module_FlyIn : MText_Module
    20. {
    21.    // enum for the different variable holder indexes
    22.     public enum VariableIndex
    23.     {
    24.         DelayMin,
    25.         DelayMax,
    26.         DurationMin,
    27.         DurationMax,
    28.         StartPosition,
    29.         EndPosition,
    30.         MoveCurve
    31.     }
    32.     public override IEnumerator ModuleRoutine(GameObject obj, VariableHolder[] variableHolders)
    33.     {
    34.         if (!obj || variableHolders == null)
    35.         {
    36.             yield break;
    37.         }
    38.  
    39.         if (variableHolders.Length < 7)
    40.         {
    41.             yield break;
    42.         }
    43.  
    44.      
    45.         // turn off mesh renderer
    46.         obj.GetComponent<MeshRenderer>().enabled = false;
    47.         //wait until obj.localposition is different from its parents localposition
    48.         yield return new WaitUntil(() => obj.transform.localPosition != obj.transform.parent.localPosition);
    49.  
    50.         // turn on mesh renderer
    51.         obj.GetComponent<MeshRenderer>().enabled = true;
    52.  
    53.         var startPosition = obj.transform.localPosition + (Vector3)variableHolders[(int)VariableIndex.StartPosition].vector3Value;
    54.         var endPosition = obj.transform.localPosition + (Vector3)variableHolders[(int)VariableIndex.EndPosition].vector3Value;
    55.  
    56.         float timer = 0;
    57.         //duration is a random value between the min and max values
    58.         float duration = Random.Range(variableHolders[(int)VariableIndex.DurationMin].floatValue, variableHolders[(int)VariableIndex.DurationMax].floatValue);
    59.         //delay is a random value between the min and max values
    60.         float delay = Random.Range(variableHolders[(int)VariableIndex.DelayMin].floatValue, variableHolders[(int)VariableIndex.DelayMax].floatValue);
    61.         //wait for the delay
    62.         yield return new WaitForSeconds(delay);
    63.      
    64.         AnimationCurve animationCurve = variableHolders[(int)VariableIndex.MoveCurve].animationCurve; // Move curve
    65.         while (timer < duration)
    66.         {
    67.             UpdatePosition(obj.transform, endPosition, startPosition, timer, duration, animationCurve);
    68.  
    69.             timer += Time.deltaTime;
    70.             yield return null;
    71.         }
    72.  
    73.         obj.transform.localPosition = endPosition;
    74.         delay = 0;
    75.      
    76.     }
    77.  
    78.     private void UpdatePosition(Transform transform, Vector3 endPosition, Vector3 startPosition, float timer,
    79.         float duration, AnimationCurve animationCurve)
    80.     {
    81.         //set the local position of the child to the lerped position using the animation curve
    82.         transform.localPosition = Vector3.Lerp(startPosition, endPosition,
    83.             animationCurve.Evaluate(timer / duration));
    84.     }
    85.  
    86.     public override string VariableWarnings(VariableHolder[] variableHolders)
    87.     {
    88.         string warning = string.Empty;
    89.         if (variableHolders == null)
    90.         {
    91.             return warning;
    92.         }
    93.  
    94.         if (variableHolders.Length <= 1)
    95.         {
    96.             return warning;
    97.         }
    98.  
    99.         try
    100.         {
    101.             //if the delay or duration values are unset or negative return a warning
    102.             if (variableHolders[(int)VariableIndex.DelayMin].floatValue < 0 ||
    103.                 variableHolders[(int)VariableIndex.DelayMax].floatValue < 0 ||
    104.                 variableHolders[(int)VariableIndex.DurationMin].floatValue <= 0 ||
    105.                 variableHolders[(int)VariableIndex.DurationMax].floatValue < 0)
    106.             {
    107.                 warning += "Delay and duration values must be positive";
    108.             }
    109.          
    110.             // if the start and end positions are the same return a warning
    111.             if (variableHolders[(int)VariableIndex.StartPosition].vector3Value ==
    112.                 variableHolders[(int)VariableIndex.EndPosition].vector3Value)
    113.             {
    114.                 warning += "Start and end positions are the same";
    115.             }
    116.         }
    117.         catch
    118.         {
    119.         }
    120.  
    121.         return warning;
    122.     }
    123. }
     
  5. FerdowsurAsif

    FerdowsurAsif

    Joined:
    Feb 7, 2017
    Posts:
    287
    Happy to help!

    About the code, looks like you are accidentally turning on the mesh renderer too early. So, the characters that has a delay on it, stays there.

    To avoid this behavior, move the
    obj.GetComponent<MeshRenderer>().enabled = true;

    to the line after
    yield return new WaitForSeconds(delay);


    Also, before obj.GetComponent<MeshRenderer>().enabled = false;
    Add a break for checking meshrender
    Code (CSharp):
    1. if(obj.GetComponent<MeshRenderer>())
    2.    yield break;
    To save resources on moving the gameobjects for spaces and avoid errors for missing component.

    Replace yield return new WaitUntil(() => obj.transform.localPosition != obj.transform.parent.localPosition);
    with this,
    yield return null;
    Otherwise in the offchance that there is a character exactly at the same position as the parent, the module wouldnt work.

    I found the issue why this line was needed. Sorry :(
    The modules get called before the layout system. So, the characters aren't moved yet to the correct position. I am looking into a fix.

    I hope that fixed your issue. Let me know if I missed anything.
     
  6. FerdowsurAsif

    FerdowsurAsif

    Joined:
    Feb 7, 2017
    Posts:
    287
    Code (CSharp):
    1. using System;
    2. using System.Collections;
    3. using System.Threading;
    4. using UnityEngine;
    5. using MText;
    6. using Random = UnityEngine.Random;
    7.  
    8. /// <summary>
    9. /// Variable holders:
    10. /// Index 0: DelayMin | float
    11. /// Index 0: DelayMax | float
    12. /// Index 1: DurationMin | float
    13. /// Index 1: DurationMax | float
    14. /// Index 2: Start position | Vector3
    15. /// Index 3: End position | Vector3
    16. /// Index 4: Move curve | Animation curve
    17. /// </summary>
    18. [CreateAssetMenu(menuName = "Modular 3d Text/Modules/Fly In")]
    19. public class MText_Module_FlyIn : MText_Module
    20. {
    21.     // enum for the different variable holder indexes
    22.     public enum VariableIndex
    23.     {
    24.         DelayMin,
    25.         DelayMax,
    26.         DurationMin,
    27.         DurationMax,
    28.         StartPosition,
    29.         EndPosition,
    30.         MoveCurve
    31.     }
    32.     public override IEnumerator ModuleRoutine(GameObject obj, VariableHolder[] variableHolders)
    33.     {
    34.         if (!obj || variableHolders == null)
    35.         {
    36.             yield break;
    37.         }
    38.  
    39.         if (variableHolders.Length < 7)
    40.         {
    41.             yield break;
    42.         }
    43.  
    44.         //--------------Added if has meshrender here
    45.         if (!obj.GetComponent<MeshRenderer>())
    46.             yield break;
    47.  
    48.         // turn off mesh renderer
    49.         obj.GetComponent<MeshRenderer>().enabled = false;
    50.         //yield return new WaitUntil(() => obj.transform.localPosition != obj.transform.parent.localPosition);
    51.         //--------------Changed the wait
    52.         yield return null;
    53.  
    54.         var startPosition = obj.transform.localPosition + (Vector3)variableHolders[(int)VariableIndex.StartPosition].vector3Value;
    55.         var endPosition = obj.transform.localPosition + (Vector3)variableHolders[(int)VariableIndex.EndPosition].vector3Value;
    56.  
    57.         float timer = 0;
    58.         //duration is a random value between the min and max values
    59.         float duration = Random.Range(variableHolders[(int)VariableIndex.DurationMin].floatValue, variableHolders[(int)VariableIndex.DurationMax].floatValue);
    60.         //delay is a random value between the min and max values
    61.         float delay = Random.Range(variableHolders[(int)VariableIndex.DelayMin].floatValue, variableHolders[(int)VariableIndex.DelayMax].floatValue);
    62.         //wait for the delay
    63.         yield return new WaitForSeconds(delay);
    64.  
    65.         //--------------Moved this
    66.         // turn on mesh renderer
    67.         obj.GetComponent<MeshRenderer>().enabled = true;
    68.  
    69.         AnimationCurve animationCurve = variableHolders[(int)VariableIndex.MoveCurve].animationCurve; // Move curve
    70.         while (timer < duration)
    71.         {
    72.             UpdatePosition(obj.transform, endPosition, startPosition, timer, duration, animationCurve);
    73.  
    74.             timer += Time.deltaTime;
    75.             yield return null;
    76.         }
    77.  
    78.         obj.transform.localPosition = endPosition;
    79.         delay = 0;
    80.  
    81.     }
    82.  
    83.     private void UpdatePosition(Transform transform, Vector3 endPosition, Vector3 startPosition, float timer,
    84.         float duration, AnimationCurve animationCurve)
    85.     {
    86.         //set the local position of the child to the lerped position using the animation curve
    87.         transform.localPosition = Vector3.Lerp(startPosition, endPosition,
    88.             animationCurve.Evaluate(timer / duration));
    89.     }
    90.  
    91.     public override string VariableWarnings(VariableHolder[] variableHolders)
    92.     {
    93.         string warning = string.Empty;
    94.         if (variableHolders == null)
    95.         {
    96.             return warning;
    97.         }
    98.  
    99.         if (variableHolders.Length <= 1)
    100.         {
    101.             return warning;
    102.         }
    103.  
    104.         try
    105.         {
    106.             //if the delay or duration values are unset or negative return a warning
    107.             if (variableHolders[(int)VariableIndex.DelayMin].floatValue < 0 ||
    108.                 variableHolders[(int)VariableIndex.DelayMax].floatValue < 0 ||
    109.                 variableHolders[(int)VariableIndex.DurationMin].floatValue <= 0 ||
    110.                 variableHolders[(int)VariableIndex.DurationMax].floatValue < 0)
    111.             {
    112.                 warning += "Delay and duration values must be positive";
    113.             }
    114.  
    115.             // if the start and end positions are the same return a warning
    116.             if (variableHolders[(int)VariableIndex.StartPosition].vector3Value ==
    117.                 variableHolders[(int)VariableIndex.EndPosition].vector3Value)
    118.             {
    119.                 warning += "Start and end positions are the same";
    120.             }
    121.         }
    122.         catch
    123.         {
    124.         }
    125.  
    126.         return warning;
    127.     }
    128. }
    129.  
     
  7. JussiDynamint

    JussiDynamint

    Joined:
    Aug 6, 2021
    Posts:
    3
    Hi! Is there a way to create the 3D-font asset runtime (using for example "string localPath" as input)? Great asset btw!
     
  8. FerdowsurAsif

    FerdowsurAsif

    Joined:
    Feb 7, 2017
    Posts:
    287
    Hi,
    Unfortunately, there is no direct approach to create the 3d font asset runtime.
    An approach could be just changing the TTF file data of an existing 3d font

    Add this method to the Font script and pass the TTF file as byte[] array.

    public void RecreateFontFromTTFFile(byte[] rfontBytes)
    {
    characters.Clear();
    kernTable.Clear();

    SetFontBytes(rfontBytes);


    var fontCreator = new FontCreation.MText_CharacterGenerator();
    fontCreator.GetTypeFaceInformation(ref lineHeight, ref unitPerEM, ref emptySpaceSpacing);

    }

    / //You don't need to call characters.clear() and kerntable.clear() everytime if the lists are empty from start. They won't be recreated runtime.

    Note:

    You need to read the TTF file on the local path as a byte array and pass that. Can't pass just the path.
    I myself use File.ReadAllBytes(path) to read the byte[].
     
    JussiDynamint likes this.
  9. FerdowsurAsif

    FerdowsurAsif

    Joined:
    Feb 7, 2017
    Posts:
    287
    Version 3.2.0
    • Added ability to create fonts runtime.
    Documentation
     
  10. yyycct02

    yyycct02

    Joined:
    Apr 4, 2021
    Posts:
    3
    Hello I received this error when using the version 3.2.1

    Assets\Plugins\Tiny Giant Studio\Modular 3D Text\Scripts\MText_GetCharacterObject.cs(147,35): error CS0012: The type 'Mesh' is defined in an assembly that is not referenced. You must add a reference to assembly 'UnityEngine, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'.



    Assets\Plugins\Tiny Giant Studio\Modular 3D Text\Scripts\MText_GetCharacterObject.cs(216,29): error CS0012: The type 'Mesh' is defined in an assembly that is not referenced. You must add a reference to assembly 'UnityEngine, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'.



    Assets\Plugins\Tiny Giant Studio\Modular 3D Text\Scripts\MText_GetCharacterObject.cs(284,29): error CS0012: The type 'Mesh' is defined in an assembly that is not referenced. You must add a reference to assembly 'UnityEngine, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'.

    please help and thanks!
     
  11. FerdowsurAsif

    FerdowsurAsif

    Joined:
    Feb 7, 2017
    Posts:
    287
    Hi,
    Sorry that you are facing issues.
    Can you share how the assembly definition file looks, please? Is No Engine Reference set to true?
    There should be a lot more errors if it was turned on by accident.

    upload_2023-2-16_13-41-4.png
     
  12. yyycct02

    yyycct02

    Joined:
    Apr 4, 2021
    Posts:
    3
    Hi Thank you for the quick reply, I was able to figure out why this happened, our project's complier are set to il2cpp, the error are gone after switching compiler to mono. We still prefer the il2cpp complier, would you have any idea on how to fix this?

    Thanks
     
  13. FerdowsurAsif

    FerdowsurAsif

    Joined:
    Feb 7, 2017
    Posts:
    287
    Hi,
    The type 'Mesh' is part of UnityEngine and shouldn't be bound to any scripting backend. I myself also use it as a backend for my projects without any issue. Do you get any other errors? If it can't find UnityEngine.Mesh, it should pop up more errors, since it is used in a lot of scripts.

    If you create a new script outside the Modular3dtext folder, can you create a variable:
    Mesh mesh = new Mesh();
    in that script.

    Maybe the il2cp backend got corrupted for some reason. Can you clear the cache please? (instruction)
     
  14. yyycct02

    yyycct02

    Joined:
    Apr 4, 2021
    Posts:
    3
    I tried creating a script and added Mesh mesh = new Mesh(), and it did not create any error
     
  15. FerdowsurAsif

    FerdowsurAsif

    Joined:
    Feb 7, 2017
    Posts:
    287
    It's pretty weird that only one single script can't find anything called Mesh.

    Did you try removing the asset completely and downlading a fresh new copy? And were you able clear il2cpp cache?


    And does it have similar error if you download the asset in a blank project with il2cpp backend. If it doesn't happen in other projects, it might give a clue about what's wrong.
     
  16. rongxike

    rongxike

    Joined:
    Nov 26, 2015
    Posts:
    4
    hi bro, much appreciate if you can provide a password input text box.
     
  17. FerdowsurAsif

    FerdowsurAsif

    Joined:
    Feb 7, 2017
    Posts:
    287
    That sounds good.
    I will add it and push an update after I am done eating.
     
  18. FerdowsurAsif

    FerdowsurAsif

    Joined:
    Feb 7, 2017
    Posts:
    287
    Done.


    Version 3.3.0
    • Password mode for input field
     
  19. rongxike

    rongxike

    Joined:
    Nov 26, 2015
    Posts:
    4
    I love you, muak!
     
    FerdowsurAsif likes this.
  20. rongxike

    rongxike

    Joined:
    Nov 26, 2015
    Posts:
    4


    Btw, I've chosen the Auto Letter Size, however the line is still breaks down by 2 instead of auto-resize the letters to make it fit to one line. Do you have any settings to fix this issue?
     
  21. FerdowsurAsif

    FerdowsurAsif

    Joined:
    Feb 7, 2017
    Posts:
    287
    Hi,
    Unfortunately, auto letter doesn't serve this purpose. If turned on, instead of using predetermined size of each letter by font, their size is taken from the size they take in render view.
     

    Attached Files:

  22. JussiDynamint

    JussiDynamint

    Joined:
    Aug 6, 2021
    Posts:
    3
    Hi! :)

    Is there a way to increase mesh resolution (add more vertices to round sections). I tried setting the "vertex count" in Font Creation to 1, 10, 500, 5000 with no effect.

    In the picture below, the "jagged" edges are most noticeable in the char "0".

    vertex_count.PNG
     
  23. briandcruz67

    briandcruz67

    Joined:
    Mar 12, 2012
    Posts:
    27
    Hi I got this compile error on the console after buying and importing the asset from the Unity store

    Assets\Tiny Giant Studio\Modular 3D Text\Scripts\Sample Scene\AutoUpdateInputSystemToSampleScene.cs(53,56): error CS1061: 'PlayerInput' does not contain a definition for 'actions' and no accessible extension method 'actions' accepting a first argument of type 'PlayerInput' could be found (are you missing a using directive or an assembly reference?)
     
  24. briandcruz67

    briandcruz67

    Joined:
    Mar 12, 2012
    Posts:
    27
    im using 2021.3.16f1 ver
     
  25. briandcruz67

    briandcruz67

    Joined:
    Mar 12, 2012
    Posts:
    27
    Ok now it's working..simple IDE suggestion itself :))


    gameObject.GetComponent<PlayerInput>().actions = settings.inputActionAsset;
     
  26. FerdowsurAsif

    FerdowsurAsif

    Joined:
    Feb 7, 2017
    Posts:
    287
    Apologies for the delayed response. My laptop died :(

    I think it would be better if you increased the smoothing angle. That would give a better look without adding vertices.
     
  27. FerdowsurAsif

    FerdowsurAsif

    Joined:
    Feb 7, 2017
    Posts:
    287
    Glad to hear you were able to resolve the issue!
     
  28. JussiDynamint

    JussiDynamint

    Joined:
    Aug 6, 2021
    Posts:
    3
    Hi! I mean is there a way to increase the roundness of the 3D-meshes? :)
     
  29. FerdowsurAsif

    FerdowsurAsif

    Joined:
    Feb 7, 2017
    Posts:
    287
    The roundness is controlled by the smoothing angle.

    It works similarly to the auto-smooth angle of software like Blender.
    upload_2023-3-31_14-23-59.png
     
  30. shion_oka

    shion_oka

    Joined:
    Apr 18, 2023
    Posts:
    1
    【Environment】
    ・Modular 3D Text Version 3.3.1
    ・Unity 2021.3.11

    【Question】
    入力したテキストにコライダーを追加して、重力で床に落ちるようにしたいと思います。床に落ちたテキストを残しながら、新しいテキストをアニメーション化したいと思います。
    AdvancedSettings で「モジュールの再適用」を false に設定する必要があると思いますが、機能していないようです。
    また、「modular3DText.UpdateText(message);」でメッセージに文字列を追加しても、前のフレームでアニメーション化されたテキストは、内部で差異をチェックしているため、再び表示されないという記事を読みました。これは正しいです?
     
  31. FerdowsurAsif

    FerdowsurAsif

    Joined:
    Feb 7, 2017
    Posts:
    287
    I am not sure why but seems like my replies to this thread are some reason waiting approval by mods before being posted. First time this is happening after creating the thread back in February 2020. So, my replies might seem late.
    Please email me if you need something urgent until this issue is resolved.

    Edit: I think I figured out a bit about the issue. I can't reply here with phone without being flagged by spam(?) filter and getting stuck awaiting approval. Posting by computer seems to be fine. idk why.
     
    Last edited: Apr 23, 2023
  32. FerdowsurAsif

    FerdowsurAsif

    Joined:
    Feb 7, 2017
    Posts:
    287
    I have replied to the email. The issue seems to be a bug. My sincerest apologies.
    I have fixed it and provided an update in the mail. I will update the asset store version soon as well.
    Sorry for the delayed response here.
     
  33. MelvMay

    MelvMay

    Unity Technologies

    Joined:
    May 24, 2013
    Posts:
    11,456
    FYI: Any post with the above language characters are held by the moderation filter due to the sheer amount of spam containing them. Best not to reply with those characters and/or posts be translated to English first.
     
    FerdowsurAsif likes this.
  34. FerdowsurAsif

    FerdowsurAsif

    Joined:
    Feb 7, 2017
    Posts:
    287
    Got it. I will avoid doing that. Thanks! a lot for clearing things up.
     
    MelvMay likes this.
  35. Pospischil

    Pospischil

    Joined:
    Sep 11, 2018
    Posts:
    5
    Hey everyone,

    we have migrated to 3.3.1 and the methods ModularText3D.typingEffects.Add() and ModularText3D.ClearAllEffects() are not available anymore. Any new methods to replace these two?

    Best regards
     
  36. FerdowsurAsif

    FerdowsurAsif

    Joined:
    Feb 7, 2017
    Posts:
    287
    Hi,
    To add new typing effect, you can use the NewEffect method. Because of the way Modules are structured, it's much easier to use that instead of .Add(). I will update the doc to reflect that.
    Use
    Code (CSharp):
    1. modular3DText.NewEffect(modular3DText.addingModules,  yourModule);
    This will setup everything needed.



    ModularText3D.ClearAllEffects() doesn't exist anymore. Please use
    Code (CSharp):
    1. modular3DText.addingModules.Clear();
    2. modular3DText.deletingModules.Clear();
     
  37. FerdowsurAsif

    FerdowsurAsif

    Joined:
    Feb 7, 2017
    Posts:
    287
    After first being released in January 2020, a Major upgrade for the asset is here for the first time.
    Anyone who bought it recently will receive an automatic free upgrade. Other customers can purchase the upgrade for a reduced price. If you do not wish to upgrade, don't worry, I will continue to provide 100% support for anything you need. Always happy to help.
     
  38. FerdowsurAsif

    FerdowsurAsif

    Joined:
    Feb 7, 2017
    Posts:
    287
    Modular 3D Text version 4.0

    Cover for upgrade.png


    A significant overhaul of the asset. Please remove the old version of the asset if you are updating it and do it when you have time.


    • Inspector updates of all the UI elements that improved readability and efficiency.
    • Avoid pink materials by automatically importing the right materials for your pipeline using an in-house importer tool.
    • Better undo/redo support.
    • Namespace modification for clarity and extendability. (Link)
    • More detailed documentation to modify or add functions to the asset.
    • Vertical wrap/overflow modes for Grid Layout and more spacing styles.
    • Better controls for Circular layouts.
    • Optional setting to always update layouts in play mode.
    • Separate input processors for default and new input systems making it easier to debug/modify/build new systems.
    • More background types for the slider.
    • Input field content types support.
    • Ability to set up 'Assembly Definition' files with a click of a button.
    • Major refactoring to the naming schema of scripts to match other standard assets.
    • Reorganize folder structures as a method to future-proof.
    • Layouts now work in Canvas
    • UV remapping option added.
    • It is easier now to find the right section of documentation using help URLs and custom buttons right in the inspector.
    • and much more minor improvements.
     
    Last edited: May 4, 2023
    shyamarama and Syrsly like this.
  39. Syrsly

    Syrsly

    Joined:
    Mar 2, 2013
    Posts:
    11
    Is the new release going to be a free upgrade for existing users?
     
    Ony likes this.
  40. FerdowsurAsif

    FerdowsurAsif

    Joined:
    Feb 7, 2017
    Posts:
    287
    If you purchased the asset within the last two months, it will be free.
     
    Syrsly likes this.
  41. JuniorLongfellow

    JuniorLongfellow

    Joined:
    Feb 27, 2013
    Posts:
    19
    I literally started integrating this yesterday into production.
    For how long will this purchase cover updates?
     
    Last edited: May 4, 2023
    Ony likes this.
  42. FerdowsurAsif

    FerdowsurAsif

    Joined:
    Feb 7, 2017
    Posts:
    287
    I have already specified my stance on this. Link . Please check the link

    You are welcome not to upgrade if you don't need it, you don't always have to upgrade just because something new comes up. I will provide support 100% with any version.

    I know it's a sarcastic question but I will still answer.
    I have no plan. The last version started on January 2020, it's May 2023 and I am not sure but I think on average I pushed an update every 30-40 days for more than 3 years. You can expect something like that in the future too.
     
  43. JuniorLongfellow

    JuniorLongfellow

    Joined:
    Feb 27, 2013
    Posts:
    19
    It wasn't sarcasm. I think it's a reasonable question. Long time asset devs usually set expectations as to how/when they charge for updates. Like for example how Kronnect or Jason Booth do it. From their releases you can tell that they charge between SRP versions. The decision to use this asset (and purchase) happened long before I got around to integrating it. Kronnects Volumetric Lights 2 also did this but I upgraded without hesitation because it'd be updated at least throughout URP14.
     
    martinscott and Ony like this.
  44. FerdowsurAsif

    FerdowsurAsif

    Joined:
    Feb 7, 2017
    Posts:
    287
    My sincerest apologies for the misunderstanding. My pet has an upset stomach and I am still in the process of cleaning up. Still, I should have answered it better. Sorry again. I am not the smartest person but I try to be friendly at least.

    I don't plan on making any more paid upgrades, major or minor.
    The asset doesn't need enough changes between Unity versions to justify any paid updates for different pipelines or Unity versions. If anything breaks between pipeline versions for sample scenes, I made a tool inside the asset to handle packages between them.

    upload_2023-5-4_20-39-20.png
    upload_2023-5-4_20-42-6.png

    I will however still continue to push free updates every month-ish as I have been doing before.
     
    JuniorLongfellow likes this.
  45. Frostinemolv

    Frostinemolv

    Joined:
    Jan 5, 2023
    Posts:
    5
    Can I use this product on WebGL ?
     
  46. FerdowsurAsif

    FerdowsurAsif

    Joined:
    Feb 7, 2017
    Posts:
    287
    Hi,
    Yes, there is no known limitation with any platform or pipeline.
    WebGL is tested and working.
     
  47. FerdowsurAsif

    FerdowsurAsif

    Joined:
    Feb 7, 2017
    Posts:
    287
    Modular 3D Text - Version 4.0.1
    Minor inspector improvement and small editor-only inspector bug fix.

    If you run into any error while updating from 4.0.0, please remove the scripts folder from Plugins/Tiny Giant Studio/Modular 3D Text/Scripts and re-import. There won't be any more errors.

    • Custom inspector for layout elements added.
    • Fixed a bug where user-created modules weren't loading default values when getting added for the first time.
     
  48. FerdowsurAsif

    FerdowsurAsif

    Joined:
    Feb 7, 2017
    Posts:
    287
    Modular 3D Text - Version 4.0.1a
    • Fixed a bug where the 'repositioning old characters' setting was not being applied correctly.
     
  49. stefanbraeu

    stefanbraeu

    Joined:
    Jan 1, 2022
    Posts:
    3
    Hi! Looks like a very useful asset. I have just one question before buying it:
    Does it support special characters (ä, ö, ñ, etc.) out of the box? can they easyly converted from ttfs? If not: is it possible to add this manually and how?

    Thanks!
    Stefan
     
  50. FerdowsurAsif

    FerdowsurAsif

    Joined:
    Feb 7, 2017
    Posts:
    287
    Hi,
    Thanks for the compliment. It supports special characters like these ones (ä, ö, ñ, etc.) without any extra work.
    If you add them in when converting from TTF files (same system as Textmesh Pro), you will have them as prebuilt. Otherwise, the 3d font will create them at runtime from the original TTF data which is autosaved.

    The asset doesn't work with some languages/fonts like Arabic, and Bangla that has connected characters because of how the layout system is handled.