Common Creator FAQ - NotAKidoS/AASEmulator GitHub Wiki

This page is a compilation of commonly asked questions and answers relating to ChilloutVR avatar creation and AASEmulator.

What is AASEmulator?

AASEmulator is a tool to help test your ChilloutVR avatar within the Unity Editor. It allows you to "emulate" certain functionality that you'd only be able to test within the ChilloutVR client for convenience.

How do I use AASEmulator?

At the top of the Unity Editor, go to Tools > Enable AAS Emulator. This will create an AAS Emulator Control object within your scene that allows you to configure the tool. From here, you also have useful links and a version checker for convenience!

Then, once entering play mode an AASEmulatorRuntime component will be added to your ChilloutVR avatars within the scene. This is your primary control over your avatar while testing in-editor.

What are good things to know about making Avatars within ChilloutVR?

ChilloutVR's Advanced Avatars system is built on top of a Legacy avatar implementation, which means a lot of behavior is "bad" and not documented properly. There is a bunch of hardcoded behavior that you will have to learn to use.

Hardcoded layer names:

  • Locomotion/Emotes
    • Used to check for "Emote" in the name of playing animation clips. When an Emote is playing, all IK is disabled.
    • When in FBT (hips & both feet specifically), this layers weight is set to 0 unless emoting, only for the local client.
  • LeftHand & RightHand
    • Layer weight is disabled when an Emote is detected or Finger Tracking is being used.
  • Toggles
    • Layer is defined in the default CCK Animator Controller, but does not necessarily have a hardcoded purpose.
  • IKPose
    • Layer weight is expected to be 0f on upload. During VRIK calibration, layer weight is set to 1f and animator is force-updated to calibrate VRIKs rest pose to pose provided by this layer.

Hardcoded animation-clip names:

  • Emote in Animation-Clip name
    • When an animation is playing in the Locomotion/Emotes layer and has the string "Emote" in the name, all IK & Tracking will be disabled.
    • If overriding a built-in Emote clip in your Overrides controller, that specific clips name will also be checked for within the Locomotion/Emotes layer
  • LocSitting
    • When sitting in a chair with an override animation specified, your avatar will have the LocSitting animation clip replaced.
    • If you do not have the LocSitting animation clip in a state to replace you will not be affected by chairs with custom sitting animations defined.
  • Anything within the default CCK will have animations replaced with ones provided by the client.
    • This is to ensure older avatars use up-to-date animations for their locomotion, but also means you are unable to alter these animations included with the CCK, as the client will replace them.
    • To avoid this, make sure your animation clip name is unique to avoid the animation clip replacement.

Default Emote Behavior

  • When an Emote is detected to be playing, the following will be done:
    • Finger Tracking will be disabled
    • LeftHand & RightHand layers will have their weight set to 0
    • All IK (Desktop, HalfBody, FullBody, NetIK if on Remote) will be disabled
    • Avatar will no longer have its head bone centered above the avatar root

Animation Overrides:

You can use the Override Controller to quickly replace animation clips in the underlying controller without actually modifying that controller directly. It is not recommended to do this for face gestures though, as mentioned above, when an Emote is detected the LeftHand & RightHand layer weights are blended out. If you override the built-in gestures in the built-in controller, your face gestures will be reset to idle when emoting.

The Emotes & Toggles page in the Quick Menu will also use your override animation clips names instead of the defaults if you override the built-in Emote1-8 and ToggleState1-8 animation clips.

Core Parameters:

Core Parameters (not AAS) support parameter type-mismatching. This means no matter what you set the parameter type as in your controller, the game will cast to that type. If you want to use Emote as a float, GestureLeft as an int, or Grounded as a trigger, the game will set them just fine.

You can find the list of Core Parameters on the PlayerAPI docs.

Synced Core Parameters:

  • GestureLeft & GestureRight (Float)
    • -1f to 6f
    • Can be set with SHFIT + number keys
    • Mapping can be found on the PlayerAPI docs
  • Grounded (Bool)
  • Crouching (Bool)
  • Prone (Bool)
  • Flying (Bool)
  • Sitting (Bool)
  • Swimming (Bool) <-- THIS IS AN AAS PARAMETER AS OF RIGHT NOW AND AS SUCH EATS 1 BIT
  • MovementX & MovementY (Float)
    • -1f to 1f each axis
  • Emote (Int)
    • 0 to 8, when set returns to 0 after 0.1s
    • Can be triggered with number keys
  • Toggle (Int)
    • 0 to 8
    • Can be set with CTRL + number keys
  • CancelEmote (Trigger)
    • Set when moving, otherwise is unset, so basically treated as a bool.

Local Core Parameters:

  • IsLocal (Bool)
  • GestureLeftIdx & GestureRightIdx (Int)
  • Floored int representation of GestureLeft/GestureRight
  • DistanceTo (Float)
  • VisemeLoudness (Float)
    • 0f to 1f
  • VisemeIdx (Int)
    • 0 to 14
    • When using Visemes mode for Lipsync, maps to Oculus Lipsync, otherwise is scrubbed from 0-14 based on VisemeLoudness
    • Mapping can be found on the PlayerAPI docs

Hand Gesture Order:

  • HandOpen, (-1f)
  • Neutral, (0f)
  • Fist, (0.01f to 1f, weighted by Controller Grip)
  • ThumbsUp, (2f)
  • HandGun, (3f)
  • Fingerpoint, (4f)
  • Victory, (5f)
  • RockNRoll (6f)

Total of 3200 Synced Bits for Avatar Advanced Settings (AAS)

  • Float - Syncs as 32-bit
  • Int - Syncs as 32-bit
  • Bool - Packed into one byte (8-bits)
    • Using 1 to 8 bools only takes up one byte, any more and it'll take up another byte.

Available Shader Globals

CVRTime (vec4)

x: System Time Seconds y: UTC Seconds z: DayOfYear w: Isleapyear (0,1)

CVRGlobalParams1 (vec4)

x: Ping y: Players in instance z: LeftControllerBattery w: RightControllerBattery

CVRGlobalParams2 (vec4)

x: FullbodyActive (0,1) y: LeftFootBattery z: RightFootBattery w: HipBattery

CVRRenderingCam (float)

0: Normal Camera 1: Portable Camera 2: CVRMirror Camera

Below are undocumented in any changelogs, so assume may change at any time:

Nameplates:

  • CVRIsUsingVr (0,1)
  • CVRPlayerUpVector (vec3)
  • CVRQuickMenuOpen (0,1)
  • CVRMainMenuOpen (0,1)

World Transition System:

  • _CVR_Transition_Color_1 (rgb01 as vec3)
  • _CVR_Transition_Color_2 (rgb01 as vec3)
  • _CVR_Transition_Color_3 (rgb01 as vec3)
  • _CVR_Transition_Progress_1 (float)
  • _CVR_Transition_Progress_2 (float)
  • _CVR_Transition_Progress_3 (float)
  • _CVR_Transition_Progress_4 (float)

None: 0 steps Fade to Black: 1 step Classic: 3 steps Digitize: 2 steps

How does ChilloutVR determine what parameters are Synced and what is Local?

ChilloutVR will parse your animation controller parameters specified in the Animation Overrides field of the CVRAvatar component.

Anything with a # or animated by your Animator (AAP) is considered a Local Parameter and will not sync/take up bit usage. Everything else will automatically be synced at a rate of 50hz when constantly changing, with a forced sync every 2.1s to ensure everything is proper across clients.

How do I use Advanced Tagging? What is Advanced Tagging?

Advanced Tagging is a feature allowing you to use content tags on specific GameObjects on your avatar. Utilizing this feature means you do not need to tag your entire avatar with a tag when uploading, as long as all affected GameObjects are properly tagged and set up to fallback where necessary.

Advanced Tagging is defined within the CVRAvatar component under the Advanced Tagging foldout. You can target a specific GameObject to remove when the tag is blocked, and optionally a fallback GameObject to enable when the GameObject is destroyed.

To use AASEmulator to debug Advanced Tagging, you can configure the allowed tags within the AASEmulatorCore component (AAS Emulator Control). Then once entering play mode and the avatar initializes, the advanced tagging will run.

How do I use a custom animation controller on my avatar?

To use a custom animation controller on your avatar, you must specify it within the Animation Overrides field on the CVRAvatar component under the Avatar Customization foldout. It must be an Override Controller that references your desired Controller.

What about the Advanced Settings base/override controller fields?

Those fields are editor-only, meaning they are not used in-game. They exist purely for the Autogeneration functionality of the Avatar Advanced Settings GUI, and will be used as the base when hitting the Create Controller button. (The Attach Overrides button just places the generated override controller in the Animation Overrides field mentioned above.)

You are not required to use the Autogeneration functionality of the CVRAvatar component. If your workflow avoids the use of the autogen, look into SimpleAAS, a tool to merge multiple controllers into one on upload.

Why won't my Emote work properly? What is considered an Emote?

An emote is a special state in which your avatar will have all IK disabled, (Desktop/HalfBody/FullBody/Finger Tracking), to solely play an animation. This is most commonly used for making your avatar do dances or other animations that should take priority over your normal tracking.

ChilloutVR will automatically detect any animation clip playing in the Locomotion/Emotes layer with the string Emote in the name somewhere as an emote state. For more control, you may also use the new BodyControl state behaviour to configure tracked limbs when entering/exiting your emote state.

A common reason for an emote to not play properly is because the state is in the wrong layer and/or the animation clip is missing "Emote" in the name. Within the AASEmulatorRuntime GUI, under Avatar Info, the Emote Status field will let you know if the emulator detects an emote playing.

My changes revert when entering Play Mode!

This has been a common issue when using the ChilloutVR CCK. The custom editor GUIs built for all the components don't properly mark themselves dirty when changes are made, so Unity does not save them when entering Play Mode.

More recent versions of the ChilloutVR CCK have solved this issue for most commonly used components, so if you happen to get this issue regularly, make sure your CCK is up to date. To work around this issue, you can also make a change elsewhere in-scene, (easiest to just toggle the GameObject off/on), then force a save with CTRL+S.

The issues are tracked in the following feedback posts:

Why is there annoying CVR logos plastered on my Scene View?

When associating an icon to a MonoBehaviour script; Unity will also use that icon to display a scene gizmo. All CCK components have the CVR logo associated with them for the perpose of providing an icon when drawn in the Inspector tab, with the side effect Unity will also automatically draw big scene gizmos with them.

It is recommended you either disable 3D gizmos in the Scene View tab, or alternatively disable all CVR gizmo icons from the scene view at once using the provided CCK utility.

At the top of the Unity window, find the Alpha Blend Interactive submenu. From there go to Utilities -> Gizmo Icons -> Hide All to disable or enable all CVR gizmo icons at once.

My avatar is stuck in a T-Pose!

Ensure your avatar:

  • Rig is set to Humanoid.
  • Has a valid Avatar definition within the Animator component on the root of the avatar.
  • Has a valid override controller specified in the Animation Overrides field of the CVRAvatar component under the Avatar Customization foldout.
    • If you just want to use the CCK default controller, it's fine to leave this blank.
    • If you do specify a custom override controller, ensure that the override controller also links to your desired animator controller.
  • Has animations within the playing controller states.
  • Has the Animator component actually enabled prior to upload.

I've got a question not answered here!

Feel free to join the Alpha Blend Interactive Discord Server to get help from other community members!

The #-general-avatars & #-advanced-settings channels would be most appropriate for Avatar-related questions.