Modular 3D text
Legacy Documentation
Last updated
Legacy Documentation
Last updated
Right click in scene hierarchy, 3D Objects > Modular 3D Text > Anything
There is a asset window in Tools > Tiny Giant Studio where you can find a lot of useful tools and information.
Drag & Drop Modules make it easy to add effects/animation. Modules are tiny Scriptable objects primary used to animate, Add/remove components etc.
To create a module, create a script like the example below, create an item for that module and assign the module in text to use.
Here, obj
is the gameObject
of the character being typed and duration is the value passed from the individual text.
After creating the script, right click in the project window, click “Create > Modular 3d Text > Modules > Your effect name goes here”.
One object with MText_UI_RaycastSelector
script attached needs to be in the scene to select items with mouse/touch. You can disable it when not using a 3D UI. This is automatically added when you create a 3d UI item (except plain text).
If no camera is selected for MText_UI_RaycastSelector
, Camera.Main is used to assign camera in Start();
If not camera main is found and no camera is referenced in the inspector, the touch control/mouse control won't work.
✅ If UpdateOncePerFrame
setting is turned on, which is on by default, texts are updated at the end of the frame. This makes sure multiple calls/changes to the text doesn't unnecessarily update the text multiple times in a single frame. If you need the text to be updated instantly, call UpdateText();
(Video Tutorial: https://youtu.be/m9JwBc-0DUA)
[Supports only TTF file formats. Most fonts found online are in TTF format] Note: the asset doesn't support right to left/top to down languages yet
1. Go to Tools > Tiny Giant Studios > Modular 3D Text
2. Select Font Creation Tab and click Create Font
3. Select your font file from anywhere in the computer
4. Give a few seconds to process and then select location inside your project where your mesh/font will be saved.
5. Right click in the project window, Create > Modular 3d Text>New font.
6. Assign exported FBX file to the font. Click the create/recreate button.
Your font is ready to be used.
Remember, the ttf font must have the characters in the first place to create 3D version.
There is a limit of how many meshes unity can handle per asset. Although the limit is pretty high, it gets slow in editor when you select that object after about a thousand mesh. If you need more characters, I suggest separating them into smaller chunks and having them set as Fallback fonts.
(Video tutorial: https://youtu.be/JN_DSmdiRSI)
Before creating the font, Click the Get Character List Button which will take you to https://unicode-table.com/en/#control-character In character range, for your language, from the link , enter the first character and the last character. This will make the created font include every character inbetween them. Then, Click create font.
(Video tutorial : https://youtu.be/lbRe4-wlf74)
Install blender if you don’t have it already.
Open the font extractor folder inside the modular 3d text folder. (Unzip it)
Open the blender file.
Click run script.
Select extract font from the left toolbar
Select your font.
Do any changes you want in this step, like retopology, optimization (Check for optimization tips below) according to your needs. Or just skip this step if you want.
File>Export>Export as FBX to your project. Default export settings are fine.
In unity, right click in the project window, Create > Modular 3d Text>New font.
Assign exported FBX file to the font. Click the create/recreate button.
Font is ready to use.
Optimization:
(To people who are knowledgeable about optimization, do your own thing. This is just a fast and simple way to do things, not perfect.) The font created in blender is not optimized. Didn't include auto-optimization in blender script because some fonts have very different geometry than expected from an average font which would result in losing details or not enough optimization. To reduce vertices. A fast but not the best way to optimize it would be,
Select all objects (Press A in scene view).
Press Tab to enter edit mode. (If you can't enter edit, select and deselect an object by left clicking one and then, an empty area, Select everything again (Press A) then Press Tab to enter edit mode)
Go to the Mesh menu (on the top menus on view window)
Cleanup > Limited Dissolve.
Cleanup > Remove doubles.
This can reduce a lot of unnecessary vertex but sometimes result in few characters having strange geometry. You can Undo & deselect the objects with problematic geometry. If the font looks good enough, export and use.
In unity, right click in the project window, Create>Modular 3d Text>New Font.
In the list you see after selecting the font, add a new item. Assign any object you want to that item and type a character for it besides it. Now when you type the character in, that object is used.
Fix positioning + Rotation + scaling for the font. You can fix it for all the characters at once by specifying it in the font file and + or you can assign a parent to the object, add “MText_Character.cs” component to the parent and fix transform for each character individually. That script shows the default expected scale and size.
Speed and volume’s x and y value are the minimum and maximum value. Keep them the same if you don’t like them to fluctuate. A little randomization makes them feel natural.
StatusToolTip script: You can use one for the entire scene. The pool for it is separate from Text. Example usage: Status debuff/buff in RPG, damage UI Just call the method ShowToolTip()
If nothing is selected, the selectedItem int will return the size of the list or 0.
Turn on pooling if a lot of text is changed in play mode. This option is under advanced settings on texts. Check tool-tips
Effects will only apply in play mode & if the text object is active/enabled. Combined mesh can’t have effects. When pooling is turned on If you use “Add Gravity”/”Add rigidbody” in typing effects, use “Remove Gravity”/”Remove rigidbody” on deleting effects. This makes sure objects don’t have pre-added components when reusing them through the pool. There are more settings in the Modules itself. Check them out. Example: You can add a bouncy physics material in the rigid-body module, a curve to choose how the scale change will happen.
In play-mode/build, callUpdateList()
to update the list.
Don’t forget to turn on the keyboard control for that to work..
You can turn on/off each individual component like Selected style.
Remember, the size of the Box-collider on the component itself determines if you are hovering/clicking on it, not the background size.
Some usefule methods:
SelectButton()
, UnselectButton()
, PressButton()
, Uninteractable()
, Interactable()
Toggle relies on Button to call Toggle()
which is automatically added when creating toggle
Difference between Select() and Focus() is select checks if the input field is in a list then if it's in a list, selects it.
UpdateValue(int newValue)/ UpdateValue(float newValue) use these to update slider via code.