A Unity ID allows you to buy and/or subscribe to Unity products and services, shop in the Asset Store and participate
in the Unity community.
Separate names with a comma.
Discussion in 'Assets and Asset Store' started by FernandoRibeiro, Dec 24, 2013.
i donload from this branch right
That is the latest
can i use unitys animation rigging package with UMA?, if not is other IK assets work or not
How will it work with animations? Will I need to add IK to make feet movement look realistic?
Both should work fine. But you usually do have to IK feet anyway, if you want higher realism.
I'm using second method but after I change DNA position and rotation values they do not immediately apply, but instead I randomly find them applied after I return to Unity editor. Entering and exiting play mode or re-equipping heels do not apply values either.
Hi, first of all, thank you for what you did, this package is amazing, I created a really cool customization system for my game (Tricking 0), using a custom rig for my fuse character, and following you great tutorials on Youtube, I'm very gratefull
My game is on steam and Xbox and although it's working for almost everyone, a few players complained about a bug playing on PC, when their character is supposed to spawn, the character is invisible. I asked some of them to send me their logs and they are filled with this error :
Exception in UMAAssetIndexer.AddAssetItem: System.ArgumentNullException: Value cannot be null.
Parameter name: key
at System.Collections.Generic.Dictionary`2[TKey,TValue].FindEntry (TKey key) [0x00000] in <00000000000000000000000000000000>:0
at System.Collections.Generic.Dictionary`2[TKey,TValue].ContainsKey (TKey key) [0x00000] in <00000000000000000000000000000000>:0
at UMA.UMAAssetIndexer.AddAssetItem (UMA.AssetItem ai, System.Boolean SkipBundleCheck) [0x00000] in <00000000000000000000000000000000>:0
at UMA.UMAAssetIndexer.UpdateSerializedDictionaryItems () [0x00000] in <00000000000000000000000000000000>:0
at UMA.UMAAssetIndexer.get_Instance () [0x00000] in <00000000000000000000000000000000>:0
at UMA.UMAGlobalContext.GetRecipes (System.String raceName) [0x00000] in <00000000000000000000000000000000>:0
at UMA.CharacterSystem.DynamicCharacterAvatar.FindSlotRecipe (System.String Slotname, System.String Recipename) [0x00000] in <00000000000000000000000000000000>:0
at UMA.CharacterSystem.DynamicCharacterAvatar.SetSlot (System.String Slotname, System.String Recipename) [0x00000] in <00000000000000000000000000000000>:0
at Controller.OnEnable () [0x00000] in <00000000000000000000000000000000>:0
at UnityEngine.Object.Instantiate[T] (T original) [0x00000] in <00000000000000000000000000000000>:0
at UnityEngine.InputSystem.PlayerInput.DoInstantiate (UnityEngine.GameObject prefab) [0x00000] in <00000000000000000000000000000000>:0
at UnityEngine.InputSystem.PlayerInputManager.JoinPlayer (System.Int32 playerIndex, System.Int32 splitScreenIndex, System.String controlScheme, UnityEngine.InputSystem.InputDevice pairWithDevice) [0x00000] in <00000000000000000000000000000000>:0
at UnityEngine.InputSystem.PlayerInputManager.JoinPlayerFromActionIfNotAlreadyJoined (UnityEngine.InputSystem.InputAction+CallbackContext context) [0x00000] in <00000000000000000000000000000000>:0
at System.Action`1[T].Invoke (T obj) [0x00000] in <00000000000000000000000000000000>:0
at UnityEngine.InputSystem.Utilities.DelegateHelpers.InvokeCallbacksSafe[TValue] (UnityEngine.InputSystem.Utilities.CallbackArray`1[System.Action`1[TValue]]& callbacks, TValue argument, System.String callbackName, System.Object context) [0x00000] in <00000000000000000000000000000000>:0
at UnityEngine.InputSystem.InputActionState.CallActionListeners (System.Int32 actionIndex, UnityEngine.InputSystem.InputActionMap actionMap, UnityEngine.InputSystem.InputActionPhase phase, UnityEngine.InputSystem.Utilities.CallbackArray`1[System.Action`1[UnityEngine.InputSystem.InputAction+CallbackContext]]& listeners, System.String callbackName) [0x00000] in <00000000000000000000000000000000>:0
at UnityEngine.InputSystem.InputActionState.ChangePhaseOfActionInternal (System.Int32 actionIndex, UnityEngine.InputSystem.InputActionState+TriggerState* actionState, UnityEngine.InputSystem.InputActionPhase newPhase, UnityEngine.InputSystem.InputActionState+TriggerState& trigger) [0x00000] in <00000000000000000000000000000000>:0
at UnityEngine.InputSystem.InputActionState.ChangePhaseOfAction (UnityEngine.InputSystem.InputActionPhase newPhase, UnityEngine.InputSystem.InputActionState+TriggerState& trigger, UnityEngine.InputSystem.InputActionPhase phaseAfterPerformedOrCanceled) [0x00000] in <00000000000000000000000000000000>:0
at UnityEngine.InputSystem.InputActionState.ProcessDefaultInteraction (UnityEngine.InputSystem.InputActionState+TriggerState& trigger, System.Int32 actionIndex) [0x00000] in <00000000000000000000000000000000>:0
at UnityEngine.InputSystem.InputActionState.ProcessControlStateChange (System.Int32 mapIndex, System.Int32 controlIndex, System.Int32 bindingIndex, System.Double time, UnityEngine.InputSystem.LowLevel.InputEventPtr eventPtr) [0x00000] in <00000000000000000000000000000000>:0
at UnityEngine.InputSystem.InputActionState.UnityEngine.InputSystem.LowLevel.IInputStateChangeMonitor.NotifyControlStateChanged (UnityEngine.InputSystem.InputControl control, System.Double time, UnityEngine.InputSystem.LowLevel.InputEventPtr eventPtr, System.Int64 mapControlAndBindingIndex) [0x00000] in <00000000000000000000000000000000>:0
at UnityEngine.InputSystem.InputManager.FireStateChangeNotifications (System.Int32 deviceIndex, System.Double internalTime, UnityEngine.InputSystem.LowLevel.InputEvent* eventPtr) [0x00000] in <00000000000000000000000000000000>:0
at UnityEngine.InputSystem.InputManager.UpdateState (UnityEngine.InputSystem.InputDevice device, UnityEngine.InputSystem.LowLevel.InputUpdateType updateType, System.Void* statePtr, System.UInt32 stateOffsetInDevice, System.UInt32 stateSize, System.Double internalTime, UnityEngine.InputSystem.LowLevel.InputEventPtr eventPtr) [0x00000] in <00000000000000000000000000000000>:0
at UnityEngine.InputSystem.InputManager.UpdateState (UnityEngine.InputSystem.InputDevice device, UnityEngine.InputSystem.LowLevel.InputEvent* eventPtr, UnityEngine.InputSystem.LowLevel.InputUpdateType updateType) [0x00000] in <00000000000000000000000000000000>:0
at UnityEngine.InputSystem.InputManager.OnUpdate (UnityEngine.InputSystem.LowLevel.InputUpdateType updateType, UnityEngine.InputSystem.LowLevel.InputEventBuffer& eventBuffer) [0x00000] in <00000000000000000000000000000000>:0
at UnityEngine.InputSystem.LowLevel.NativeInputRuntime+<>c__DisplayClass7_0.<set_onUpdate>b__0 (UnityEngineInternal.Input.NativeInputUpdateType updateType, UnityEngineInternal.Input.NativeInputEventBuffer* eventBufferPtr) [0x00000] in <00000000000000000000000000000000>:0
at UnityEngineInternal.Input.NativeInputSystem.NotifyUpdate (UnityEngineInternal.Input.NativeInputUpdateType updateType, System.IntPtr eventBuffer) [0x00000] in <00000000000000000000000000000000>:0
UnityEngine.InputSystem.PlayerInputManager:JoinPlayer(Int32, Int32, String, InputDevice)
UnityEngine.InputSystem.Utilities.DelegateHelpers:InvokeCallbacksSafe(CallbackArray`1&, TValue, String, Object)
UnityEngine.InputSystem.InputActionState:CallActionListeners(Int32, InputActionMap, InputActionPhase, CallbackArray`1&, String)
UnityEngine.InputSystem.InputActionState:ChangePhaseOfActionInternal(Int32, TriggerState*, InputActionPhase, TriggerState&)
UnityEngine.InputSystem.InputActionState:ChangePhaseOfAction(InputActionPhase, TriggerState&, InputActionPhase)
UnityEngine.InputSystem.InputActionState:ProcessControlStateChange(Int32, Int32, Int32, Double, InputEventPtr)
UnityEngine.InputSystem.InputActionState:UnityEngine.InputSystem.LowLevel.IInputStateChangeMonitor.NotifyControlStateChanged(InputControl, Double, InputEventPtr, Int64)
UnityEngine.InputSystem.InputManager:FireStateChangeNotifications(Int32, Double, InputEvent*)
UnityEngine.InputSystem.InputManager:UpdateState(InputDevice, InputUpdateType, Void*, UInt32, UInt32, Double, InputEventPtr)
UnityEngine.InputSystem.InputManager:UpdateState(InputDevice, InputEvent*, InputUpdateType)
And ending with this message :
Building DynamicCharacterAvatar: Tricker 0
UMA.CharacterSystem.DynamicCharacterAvatar:BuildCharacter(Boolean, Boolean, Boolean)
Uploading Crash Report
FormatException: Input string was not in a correct format.
at System.Number.ThrowOverflowOrFormatException (System.Boolean overflow, System.String overflowResourceKey) [0x00000] in <00000000000000000000000000000000>:0
at System.Number.ParseSingle (System.ReadOnlySpan`1[T] value, System.Globalization.NumberStyles styles, System.Globalization.NumberFormatInfo info) [0x00000] in <00000000000000000000000000000000>:0
at System.Single.Parse (System.String s, System.IFormatProvider provider) [0x00000] in <00000000000000000000000000000000>:0
at UMA.UMAProperty.FromString (System.String serializedString) [0x00000] in <00000000000000000000000000000000>:0
at UMA.UMAPackedRecipeBase+PackedOverlayColorDataV3.SetOverlayColorData (UMA.OverlayColorData overlayColorData) [0x00000] in <00000000000000000000000000000000>:0
at UMA.UMAPackedRecipeBase.UnpackColors (UMA.UMAPackedRecipeBase+UMAPackRecipe umaPackRecipe) [0x00000] in <00000000000000000000000000000000>:0
at UMA.UMAPackedRecipeBase.UnpackRecipeVersion3 (UMA.UMAData+UMARecipe umaRecipe, UMA.UMAPackedRecipeBase+UMAPackRecipe umaPackRecipe, UMA.UMAContextBase context) [0x00000] in <00000000000000000000000000000000>:0
at UMA.UMAPackedRecipeBase.Load (UMA.UMAData+UMARecipe umaRecipe, UMA.UMAContextBase context) [0x00000] in <00000000000000000000000000000000>:0
at UMA.UMATextRecipe.Load (UMA.UMAData+UMARecipe umaRecipe, UMA.UMAContextBase context) [0x00000] in <00000000000000000000000000000000>:0
at UMA.CharacterSystem.DynamicCharacterAvatar.LoadCharacter (UMA.UMARecipeBase umaRecipe, System.Collections.Generic.List`1[T] Replaces, System.Collections.Generic.List`1[T] umaAdditionalSerializedRecipes, UMA.UMARecipeBase AdditionalRecipes, System.Collections.Generic.Dictionary`2[TKey,TValue] MeshHideDictionary, System.Collections.Generic.List`1[T] hiddenSlots, System.Collections.Generic.List`1[T] HideTags, UMA.UMADnaBase CurrentDNA, System.Boolean restoreDNA, System.Boolean skipBundleCheck) [0x00000] in <00000000000000000000000000000000>:0
at UMA.CharacterSystem.DynamicCharacterAvatar.BuildCharacter (System.Boolean RestoreDNA, System.Boolean skipBundleCheck, System.Boolean useBundleParameter) [0x00000] in <00000000000000000000000000000000>:0
at UMA.CharacterSystem.DynamicCharacterAvatar.BuildFromComponentSettings () [0x00000] in <00000000000000000000000000000000>:0
I have absolutely no idea what could explain that it works for most people and not those guys, I'm a bit lost so I really need some help
There's some sort of data issue going on here. It's trying to load the library.
The library has a list of items in the library that is serialized and deserialized. It's serialized when you compile, by Unity. It's deserialized when the prefab is loaded by the Unity runtime.
That list is then processed. Every item in the list is an "AssetItem". The AssetItem has an "_Type" field and an "_Name" field. The type field contains the type (each item is indexed by type, and then by name within type).
I can't tell which dictionary is complaining - but it's complaining that the key is null. This will either be the _Type of the AssetItem, or the _Name of the AssetItem.
But not having either of them is completely invalid. If it were data on the item, I would expect that they would be empty strings, not null. So my first guess is that Unity had an error loading the data - maybe not enough memory, or some antivirus messed up the file load, or something similar.
The second one is saying that the player string is invalid. If you can capture the string used it could be helpful. But it's likely related - bad data. Maybe the resources file didn't make it down, or another file didn't download or decompress, or something.
Wow, I have no idea what happened there. First thing I suggest is get the latest alpha version (alpha 4) and work from there, there's been a LOT of changes.
@Jaimi, I modified v28 significantly, addressing the serialization/deserialization issues you mentioned. I posted about it a couple of years ago under the handle @Tarball, but I lost that account while trying to sue some people in the non-game/unrelated software world. In any case, I plan on releasing an early access title on Steam in early October 2023, and if the game sells, I'll fork off of UMA v28 on GitHub.
Basically, I deleted about 1500 lines of code and fixed the serialization issues you mentioned. The problem was that the json data was being stored within another json, so it was nearly impossible to serialize to binary. In my version, it is much easier to dump the single stored json into lists immediately prior to creating a binary save file. It is simple enough to where it could be applied to an MMO. In fact, that may be the direction this project winds up going, if early access sales go as expected.
If you can acquire some new updated textures/artwork/faces/etc, and my early access title sells as planned, I would be willing to contribute my updated code for a revamped updated version of UMA. Then, perhaps I could make use of if myself in a finished release. Check out my version in action here:
There's a 10 minute gameplay trailer on the main page, and I have a few more videos on the news tab. Check back in a week or so, and I plan on making a webplayable browser demo, after I have obfuscated the code sufficiently. If you want, I can upload a quick video on the news tab showcasing the binary serialization save/load features I added.
Hi, we are getting an error on making slot data for one of our models' attires ,we are able to create slots data for 4 of our player attires , facing a null reference error in one ,specifically leg part of it . Not sure what's causing the error as the rig also is similar to other attires rigs .
Is there an updated Discord invite? The one someone posted here is expired, and the documentation won't load. Github works fine, but the documentation link on the Github site does not. It just goes to a blank screen. Someone posted an issue on it three weeks ago on Github, so apparently I'm not the only one.
Is the uma project dead? I don't see any progress sinds alpha 4, should I use it in new projects or it will be deprecated soon?
Since it began in 2013, ten years ago, and has had many updates and features added, I think it's more appropriate to refer to it as "mature" rather than dead.
Yeah, I don't think it's dead, because the discord is reportedly very active, and they're always pretty quick to fix any compatibility issues when a new Unity version comes out. I do think the documentation link needs to be fixed, though. I wanted to get on the discord because I use UMA a lot.
Here's a temporary link. https://discord.gg/HKyWVcz6
Let me know if it works or not. I'm not a big Discord user.
Thank you for the link, it's very helpfull
materials are broken in HDRP
any way to fix it?
HDRP pink model i was able to fix it thanks to this comment: https://forum.unity.com/threads/uma...-the-asset-store.219175/page-221#post-6694642
But hair is still pink, any ideas how to fix?
thanks to this comment hair is displayed correctly in HDRP (at least it is not pink anymore)
@hopeful @Jaimi I just made a radically different fork (codewise -- not artwork) on github, which I called 4.1.1. It is a major rewrite of v28.
Basically, I have fixed the json serialization problems, such that data can be serialized into binary. The problem with the old version was that it put a json into a json, so binary serialization was impossible. In my rewrite, I deleted about 2000 lines of code, so deserialization of json files at runtime into a struct occurs which can be saved/loaded into/from a binary save file.
Thank you! It's always great to get contributions from the UMA community. That's how we get by!
Hi, all. I've been following the tutorial video of secret anorak on building uma race from Daz3d studio g8. Everything works fine except that the final character has weird twist arms. I guess this problem has something to do with the daz arm skeleton, since each arm has four bones. The exported fbx file works fine, this problem only occurs in uma characters. Could anyone give advice on this? much appreciated.
How to delete? package manager is not showing Remove btn
hi, when i do this
using a slider the game framerate geos from 200+ to 10, the player loop in the function (UMAGeneratorBuiltin.Update) takes 70+ms to complete with 1.4MB of GC Alloc, im using the latest version in Github, is there a solution to this?
i keep getting this error
A Native Collection has not been disposed, resulting in a memory leak. Allocated from:
UMA.SubMeshTriangles:GetTriangles() (at Assets\UMA\Core\StandardAssets\UMA\Scripts\UMAMeshData.cs:45)
UMA.SkinnedMeshCombiner:AnalyzeSources(CombineInstance, Int32, Int32&, Int32&, Int32&, Int32&, MeshComponents&) (at Assets\UMA\Core\StandardAssets\UMA\Scripts\SkinnedMeshCombiner.cs:818)
UMA.SkinnedMeshCombiner:CombineMeshes(UMAMeshData, CombineInstance, BlendShapeSettings, UMARecipe, Int32) (at Assets\UMA\Core\StandardAssets\UMA\Scripts\SkinnedMeshCombiner.cs:119)
UMA.UMADefaultMeshCombiner:UpdateUMAMesh(Boolean, UMAData, Int32) (at Assets\UMA\Core\StandardAssets\UMA\Scripts\UMADefaultMeshCombiner.cs:187)
UMA.UMAGeneratorBuiltin:UpdateUMAMesh(Boolean) (at Assets\UMA\Core\StandardAssets\UMA\Scripts\UMAGeneratorBuiltin.cs:650)
UMA.UMAGeneratorBuiltin:GenerateSingleUMA(UMAData, Boolean) (at Assets\UMA\Core\StandardAssets\UMA\Scripts\UMAGeneratorBuiltin.cs:389)
UMA.UMAGeneratorBuiltin:OnDirtyUpdate() (at Assets\UMA\Core\StandardAssets\UMA\Scripts\UMAGeneratorBuiltin.cs:610)
UMA.UMAGeneratorBuiltin:Work() (at Assets\UMA\Core\StandardAssets\UMA\Scripts\UMAGeneratorBuiltin.cs:182)
UMA.UMAGeneratorBuiltin:Update() (at Assets\UMA\Core\StandardAssets\UMA\Scripts\UMAGeneratorBuiltin.cs:116)
it only happens when the value is changed using script, changing values in inspector is smooth
two questions maybe someone can help:
I am using the latest UMA version from UMA-Feature-13 and Unity 2023.1.16.
I am working on a ski Jump game.
- How can I attach ski to the feet? Maybe just instantiate as a child to the LeftFoot and RightFoot transform childs?
- I am using UMAPhysics and I love it! Works perfect and looks for failed landings, just setting ragdolled to true. But if I destroy the player and initiate it again, it shakes / trembles all the time although it should be a complete new instance, do I need to reset something "ragdolled"?
Thanks and have a nice weekend
I got both problems solved/working. Thanks for your interest ;-)
If you want to check it out, Later versions of the code abandoned the character string (the JSON on JSON), and moved to a struct called an "AvatarDefinition", that is then serialized/deserialized directly to JSON, and can be generated/used on a server without UMA installed.
Just delete the UMA folder
Are you on the latest code? I think that is fixed on GIT.
Sorry I didn't see this, and glad you got it going. Notifications got lost for this thread somehow.
UMA 2.13b1 Released
You can now enable/disable default wardrobe recipes without removing them from the list in the customization section.
The currently equipped wardrobe recipe is marked with a * in the list.
Enabled recipes are marked with a plus sign.
Disabled recipes are marked with a minus sign.
The Hair Smoosher has been updated and bugs fixed.
Clipping Plane offset - It will now allow you to tune the plane points on the clipping plane slot.
You can now scale and offset the smooshed hair to help adjust for different polygon densities on the hair slot.
Overlays can now have Photoshop-style blend modes applied to them. This allows for more control over how the overlay is blended with the underlying texture.
Blends are specified on the individual texture channel on the overlay.
Supported blend modes are: Normal, Multiply, Screen, Overlay, Darken, Lighten, Color Dodge, Color Burn, Hard Light, Soft Light, and Subtract.
Drag and drop support for merging recipes into other recipes, with slots/overlays/colors/options.
Mesh Hide asset editor can now export occlusion data to a texture, and load and apply occlusion data from a texture.
Fixed bug in Addressable preloader where it would not ask to load additive recipes, causing those not to work at all when using addressables.
Added new compositing shader for Diffuse/Normal/Metallic workflow, so you can drop it in most recipes.
Added favorites window so you can add whatever favorites you want
Colors can now be marked as "base colors" in the customization window, and filtered to those colors.
Added option to "average normals" on the slot welder.
Added ability on DCA to "force suppress" slots or overlays based on tag. For example, if you want to remove an eyebrow overlay off the face if you have used replacement texture for the face that already contains them.
Added preference to use the Burst Compiler to speed up mesh generation. Requires the burst compiler to be installed.
Added option to tile overlays when using the Keep Textures mode.
Added additional sanity checking in various functions for those times when things are going so well.
Disabled index healing (even when enabled in preferences) when playing in the editor
Added option to trigger various rebuild types in the editor, not just a full rebuild.
Added "Second pass" material to UMAMaterial. When present, will duplicate the submesh, and draw the submesh a second time with the second material. This is useful for simulating multi-pass in URP.
Added option to UMAMaterial to specify alternate materials for different SRP pipelines.
ConvertRenderTexture is now off by default on mobile.
Fixed various leaks/bugs in MeshHideAsset Inspector.
How should Hair Smoosher be used? Should I add this component to the character game object with DynamicCharacterAvatar? Is it supposed to be used before building, or is it to be executed at runtime after hair change?
It happens dynamically when the hat+clipping plane are equipped at runtime. Once you have everything setup, it's all automatic. Ignore the component, it will be removed from later versions. It's now integrated into the DynamicCharacterAvatar.
I've attached a PDF with the documentation.
After a few attempts, I finally find a method to fix my daz3d character arms. So I would just post it here for those might encounter the same problem. First of all, set the right scale in unity fbx import settings, the bound extend values of the unified mesh skinmeshrender component should be around 0.5. Then before extract uma avatar asset, make sure that the humanoid avatar of fbx is selected. The extracted uma avatar asset should have some non-zero value in its configuration, in my case those are 0.5.
Hey Jaimi, I'm curious if there's a possibility for deferred character building in UMA? I want to change wardrobe items quickly on the customization screen and only build the character when leaving.
Yes, you call SetSlot to set the wardrobe item on the character, it does not automatically build. Then when you want to build the character, call BuildCharacter. Note that building a character is pretty quick except in some special cases, typically people set the slot, and build right away.
Was wondering if you could provide some insight on how geometry order works in UMA.
I've encountered the regular alpha sorting issue with our characters, where I have several slots with transparency to them, namely the hair which is made via alpha planes and glasses, which have transparency to lenses. On a singular object basis what is being done to remedy transparency issues is manually sorting the transparent layers within an object (face indices belonging to the planes closest to the head are lower and increase as the planes get layered on top). Logically, adding glasses would have to make the new indices for glasses ordered after the face indices for the last hair plane, however in the final assembled UMA character this does not seem to be the case, and neither is it affected by the order in which the items are added onto the character. I've attached the screenshot illustrating the alpha issues I'm referring to. So my question is how exactly does UMA assemble the final face index list for the merged character, and if there's any way to directly influence the face order to force the "proper" alpha sorting.
Items are merged together in this order:
1. base race recipe - all the base slots are merged in order they are in the recipe.
2. wardrobe recipes - recipes are sorted in order that the wardrobe slots are listed on the race. Then slots within recipe are ordered by position they are in the recipe.
3. additional recipes - merged in order they are on the character. Any slots inside the recipe are merged in the order they exist in the recipe.
So whatever slot your glasses are in, should go after the hair slot on your race, then the glasses faces would be placed after the hair texture in the mesh. I think there are cases where Unity can reorder things. If you find this doesn't fix it, Another fix would be to break out your glasses into a separate umamaterial/material, with a higher sort order.
I have done every step but it does not work and the clipping plane is visible. What am I doing wrong?
If the clipping plane is visible, then it is being rendered and merged. That should not happen. Most likely, the slot is not marked as a clipping plane.
Is it possible to make the wardrobe item visible immediately after calling 'SetSlot' without waiting for the 'BuildCharacter' step? I understand that it may not be optimized for rendering, but in a character customization screen, reducing the lag when changing items is more important to me.
No - building is what causes it to be visible. If you are just adjusting colors or DNA, then it can be a lot faster to just update those using ForceUpdate, but if you are setting slots, then you must call BuildCharacter. What is causing lag when building? UMA is used on mobile devices, and builds pretty fast. Are you using your own races with tons of Blendshapes? (those are slow).
Thanks for the info, Jaimi. I'm already using 'ForceUpdate' for colors and DNA, and yes, I'm using my own race with 52 blendshapes for facial animations. To prevent clipping issues, I've divided the character's body and clothing into many parts. I'm also using many accessories like hats, piercings, tattoos, handbags, etc. As a result, when many items are set, especially on older mid-range devices like the Samsung A40, noticeable lag occurs when I change wardrobe items and rebuild.
Thank you so much for the help, it works well after reorganizing the slots
There are several things you can do to speed up the building process.
1. Are you on the latest beta release? If not, upgrade. It's faster in most cases.
2. In your prefab, just in the customization screen, Turn OFF "Load Blendshapes" on the DynamicCharacterAvatar. The face animations will be gone, but should be a speedy build.
3. If you can't turn off blendshapes, you might need to just manage them. There's some complicated to explain functions that let you apply on certain blendshapes. This involves
4. Turn OFF "Copy render texture" on your UMAGenerator in your uma_glib prefab. This disables a step that copies the texture from VRAM to RAM in Unity. However, this is not really needed on mobile in most cases and causes a stall.
5. Use the compositing materials in the latest beta. This skips the texture atlas building, lowers RAM usage, and skips an entire step. It does increase drawcalls though, but in many cases this is preferable to uses more RAM.
6. Implement lower poly count slots for low power devices, and dynamically load the correct ones using addressables or asset bundles (the slots can have the same "slot name", so only the loading system needs to be aware of them). This is a more complicated discussion also, and is art intensive. However, you can also save memory on lower end devices, and speed up the building quite a bit.
Those are just some things off the top of my head.
I'll definitely try these suggestions. Thanks again for your help!
Hello, I know this is probably a stupid question but I can't seem to find an answer. Most guides seem to suggest changing the "Shared Color" should update the color... I've tried this:
With " sharedColorName='Eyes' "
It correctly changes the shared color (assuming the color multiplier is the correct thing):
But this fails to actually change anything even though the eyes are set to "Use Shared Color: Eyes":
What's the proper way to change eye/skin/other colors through a script?