Overview for CrazyMinnow.SALSA.Eyes.cs

The Eyes module inspector is similar in design to SALSA and EmoteR, but is template-driven to help ensure a valid design-time configuration is achieved. However, you may still want programmatic run-time control to make settings changes. Eyes has an underlying API that provides this functionality, allowing developers to programmatically configure and control your workflow. SALSA LipSync Suite, which includes the Eyes module, is a complete re-write of the original v1 code, and Eyes was pulled out of RandomEyes into its own module, therefore the previous RandomEyes API is not valid for SALSA LipSync Suite.

Namespace: CrazyMinnow.SALSA

All of the main Suite modules reside in the CrazyMinnow.SALSA namespace. If your custom code cannot find Eyes ensure you have included a reference to the appropriate namespace. Please ensure you understand C# namespaces and their usage. There are a myriad of references available on the Internet discussing the subject. If you fail to reference the appropriate SALSA Suite namespaces, you will not be able to use the SALSA Suite API.

The following properties and methods are available for: CrazyMinnow.SALSA.Eyes.cs

Properties (for CrazyMinnow.SALSA.Eyes configuration)

There are many public fields available in the Eyes library. Most of these are implemented for Eyes runtime configuration and control.

System Properties

Character Root Transform characterRoot

This provides Eyes with a character forward direction reference.

QueueProcessor QueueProcessor queueProcessor

A QueueProcessor is a required reference link needed to initiate priority-based animations. If setting SALSA up in a runtime environment, a QueueProcessor must be instantiated and SALSA must know where it is.

Look Target Transform lookTarget

When configured, Setting the look target activates head, eye, and eyelid tracking on that target.


Affinity bool useAffinity

Affinity towards a tracked target, similar to attention span.

Percentage [Range(0f, 1f)] float affinityPercentage = 0.75f

Specify the percentage of time the character should stay focused on the target. Drops into random mode when random head or eyes are enabled.

Timer Vector2 affinityTimerRange = Vector2(2f, 5f)

Min/Max timer range for affinity updates.

Has Affinity bool hasAffinity

Tracks the affinity state.


Update Delay [Range(0f, 1f)] float updateDelay = 0.07

The delay in seconds between analysis updates. The default is typically fine.


Sprite Flipping bool useSpriteFlipping

Select this to automatically flip tracking calculations with scale or sprite axis.

Flip Type enum FlipType flipType

Do you flip your 2D characters direction using Transform scale or SpriteRenderer axis?

Flip Type = Transform_X

  • If using an 2D puppet rig, link the rig root to the Flip Reference and flip the character using root scale.X = 1 and -1. This will flip the tracking calculations automatically.

Flip Type = SpriteRenderer_X

  • If using a sprite character, link the SpriteRenderer to the Flip Reference and flip the character using SpriteRenderer.Flip.X = true or false. This will flip the tracking calculations automatically.

FlipType

  • FlipType.Transform_X
  • FlipType.Transform_Y
  • FlipType.SpriteRenderer_X
  • FlipType.SpriteRenderer_Y

Flip Reference

Transform flipScale
Link to the Transform used to flip scale on the X or Y axis.
SpriteRenderer flipSprite
Link to the SpriteRenderer used to flip a Sprite the X or Y axis.
bool flipState
Tracks the flip state. (true = flipped left, false = right)


Parent Random Targets

When enabled, the random head and eye targets will be parented to the character root.
void ParentRandomTargets(bool status)

Show Scene Gizmos bool showSceneGizmos

Scene gizmos help to demonstrate the effects of changing properties.

Warn on Null-Refs bool warnOnNullRefs

Disable this option to suppress warning when linked references are missing.


Cancel Animation List<AnimCancel> animCancel

Link any bones here when you want their mecanim animation to be canceled out.

Head Configuration

Some properties are only visible in certain templates

Enable Processing

Enable/disable head processing.
void EnableHead(bool status)

Head Templates enum HeadTemplates

When setting the head template from code, use the following method:
void BuildHeadTemplate(HeadTemplates headTemplate)

  • HeadTemplates.None (No head configured)
  • HeadTemplates.Bone_Rotation_XY (Rotation on the X and Y axis. Typical of a 3D character)
    Defaults to one head expression with one Transform component.
  • HeadTemplates.Bone_Rotation_Z (Rotation on the Z axis. Typical of a 2D character)
    Defaults to one head expression with one Transform component.

Target Offset Vector3 headTargetOffset

Since there is typically a vertical gap between the head bone and eye bones, you may want a vertical offset of the head target to ensure random position generation and tracking keep the head and eyes aligned in a natural way.

Rotation Clamp Vector3 headClamp

Head maximum horizontal(Y), vertical(X), or rotational(Z) degrees of movement before clamping.

Facing Camera bool headFacingCamera

If your 2D character faces the camera, use this to flip the head tracking calculations automatically when a tracked target moves from left to right.

Update Fwd/Center Refs bool updateHeadFwdCenterRefs

Continuously update the headFwdRefs and headRefCenter gizmos rotation to match the characterRoot


Random bool headRandom

Generate random head movement when no target is linked or affinity is enabled and the character currently has no affinity.

FoV Degrees Vector3 headRandomFov

Head random movement field of view in degrees: Vertical(X), horizontal(Y), or rotational(Z).

Timer Vector2 headRandTimerRange

Min/Max timer range for random head movement.

Distance Vector2 headRandDistRange

Min/Max random head position range. When using Bone_Rotation_Z and facing camera, random amounts will be generated from the extents of min/max instead of a range.


Target Gizmo float headTargetRadius

Scene target gizmo radius (the green sphere).

Fix Axis / Restore Axis - DEPRECATED - This feature was replaced with a rotation offset that is calculated automatically. The old method will remain in place for one update, giving you time to use the Restore Axis option to remove any corrective hierarchy.

Unity uses a left handed coordinate system. If your characters head bone is not aligned to this system, you must use this option to automatically apply corrective hierarchy. X positive (Right) Y positive (up) * Z positive (forward)

Fix: void FixAllTransformAxes(ref eyes.heads, true)
Restore: void FixAllTransformAxes(ref eyes.heads, false)


Head Expression

Name String

Access the expression name field using an Eyes reference:
eyes.heads[expressionIndex].expData.name


Head Component

Name String

Access the component name field using an Eyes reference:
eyes.heads[expressionIndex].expData.components[componentIndex].name

Animation Timings (On) bool

Access the animation On timing using an Eyes reference:
eyes.heads[expressionIndex].expData.components[componentIndex].durationOn

Disable Smoothly bool

Access smooth disable using an Eyes reference:
eyes.heads[expressionIndex].expData.components[componentIndex].isSmoothDisable

Use Animator Controlled MergeBack bool

It is recommended to use the global QueueProcessor.useMergeWithInfluencer option. However, it is possible to control this at the controller level:
eyes.heads[expressionIndex].expData.components[componentIndex].isAnimatorControlled

Easing enum LerpEasings.EasingType

Access animation easing types using an Eyes reference:
eyes.heads[expressionIndex].expData.components[componentIndex].easing

Bone/Transform Transform

Access the bone slot using an Eyes reference:
eyes.heads[expressionIndex].expData.controllerVars[componentIndex].bone


Eye Configuration

Some properties are only visible in certain templates

Enable Processing

Enable/disable eye processing.
void EnableEye(bool status)

Eye Templates enum EyeTemplates

When setting the eye template from code, use the following method:
void BuildEyeTemplate(EyeTemplates eyeTemplate)

  • EyeTemplates.None (No eyes configured)
  • EyeTemplates.Bone_Rotation (Rotation on the X and Y axis. Typical of a 3D character)
    Defaults to two eye expressions with one Transform component on each.
  • EyeTemplates.Bone_Position (Position on the X and Y axis. Typical of a 2D character)
    Defaults to two eye expressions with two Transform components each. One component uses the Direction Type Upper, and the other component uses the Direction Type Right, each should be linked to the same eye. When setting up a Bone_Position template you must capture the maximum upper and maximum right positions, the system will use these to calculate the maximum lower and maximum left extents for your total eye range of motion.
  • EyeTemplates.BlendShapes
    Defaults to two eye expressions with four SkinnedMeshRenderer components on each (upper, right, lower, left).
  • EyeTemplates.Sprite_Sectors
    Defaults to one eye expression with one Sprite component per sector.
  • EyeTemplates.Texture_Sectors
    Defaults to one eye expression with one Texture component per sector.
  • EyeTemplates.Material_Sectors
    Defaults to one eye expression with one Material component per sector.

Sector Count enum SectorCount sectorCount

When using a sector template, set the sectorCount, then pass it to the BuildEyeSectorTemplate method:
sectorCount = SectorCount.Nine

  • SectorCount.Two (Left, Right)
  • SectorCount.Three (Left, Center, Right)
  • SectorCount.Five (Center, Upper, Right, Lower, Left)
  • SectorCount.Nine (Center, Upper, UpperRight, Right, LowerRight, Lower, LowerLeft, Left, UpperLeft)

void BuildEyeSectorTemplate(SectorCount, ExpressionComponent.ControlType, bool);
Passing true will clear the eyes expression list before building the template.

Forward Sector Radius float forwardSectorRadius

Tracked targets inside this radius will trigger the forward sector.


Clamp Degrees Vector3 eyeClamp = Vector3(25f, 45f, 0f)

Clamps eye rotation on the vertical(X) and horizontal(Y) axes.


Random bool eyeRandom

Enable random eye movement.

FoV Degrees Vector3 eyeRandomFov = Vector3(2.5f, 5f, 10f)

Eye random movement field of view in degrees: vertical(X), horizontal(Y), or rotational(Z). Used when there is no look target or randomly generated head target.

FoV Offset Vector2 eyeRandTrackFov = Vector2(0.1f, 0.05f)

Eye random movement maximum horizontal and vertical offset from a target. This could be the look target in System Properties or a random generated head target position (saccadic movement).

FoV Offset Affinity Vector2 eyeRandTrackFovAffinity = Vector2(0.2f, 0.1f)

Eye random movement maximum horizontal and vertical offset from a target when using Affinity and hasAffinity equals false. This could be the look target in System Properties or a random generated target position (saccadic movement).

Timer Vector2 eyeRandTimerRange = Vector2(0.25f, 1f)

Min/Max timer range for random eye movement.

Distance Vector2 eyeRandDistRange = Vector2(1f, 1f)

Min/Max random eye position distance.


Target Gizmo float eyeTargetRadius

Scene target gizmo radius (the yellow sphere).


Fix Axis / Restore Axis - DEPRECATED - This feature was replaced with a rotation offset that is calculated automatically. The old method will remain in place for one update, giving you time to use the Restore Axis option to remove any corrective hierarchy.

Unity uses a left handed coordinate system. If your characters eye bones are not aligned to this system, you must use this option to automatically apply corrective hierarchy. X positive (Right) Y positive (up) * Z positive (forward)

Fix: void FixAllTransformAxes(ref eyes.eyes, true)
Restore: void FixAllTransformAxes(ref eyes.eyes, false)


Eye Expression

Create Gizmo

Blendshape eyes need at least one manually created eye gizmo. Since Eyes does not know where a blendshape-based eye is, the gizmo serves as our point of reference for tracking calculations. Each independently blendshape controlled eye should have it's own gizmo. The gizmo need to be parented to the characters head, and positioned where the eye is (or between the eyes for multiple eyes controlled with one set of blendshapes). Use the method below to create a gizmo and use it's returned reference to position and parent it correctly.
EyeGizmo CreateEyeGizmo(string name, Transform parent)

Name String

Access the expression name field using an Eyes reference:
eyes.eyes[expressionIndex].expData.name


Eye Component

Name String

Access the component name field using an Eyes reference. eyes.eyes[expressionIndex].expData.components[componentIndex].name

Direction Type ExpressionComponent.DirectionType

Access the component name field using an Eyes reference. eyes[expressionIndex].expData.components[componentIndex].directionType

Animation Timings (On) bool

Access the animation On timing using an Eyes reference:
eyes.eyes[expressionIndex].expData.components[componentIndex].durationOn

Disable Smoothly bool

Access smooth disable using an Eyes reference:
eyes.eyes[expressionIndex].expData.components[componentIndex].isSmoothDisable

Use Animator Controlled MergeBack

It is recommended to use the global QueueProcessor.useMergeWithInfluencer option. However, it is possible to control this at the controller level:
eyes.eyes[expressionIndex].expData.components[componentIndex].isAnimatorControlled

Easing enum LerpEasings.EasingType

Access animation easing types using an Eyes reference:
eyes.eyes[expressionIndex].expData.components[componentIndex].easing

Component Dynamics float

Adjusts the range of overall expression component movement. eyes.eyes[expressionIndex].expData.components[componentIndex].frac

Controller Type enum ControlType

Don't use this, use the BuildEyeTemplate method instead.

Controller

Access the controller slot using an Eyes reference:

  • Shape SkinnedMeshRenderer

    eyes.eyes[expressionIndex].expData.controllerVars[componentIndex].smr

  • Bone Transform

    eyes.eyes[expressionIndex].expData.controllerVars[componentIndex].bone

  • Sprite SpriteRenderer

    eyes.eyes[expressionIndex].expData.controllerVars[componentIndex].sprites

  • Texture Renderer

    eyes.eyes[expressionIndex].expData.controllerVars[componentIndex].textures

  • Material Renderer

    eyes.eyes[expressionIndex].expData.controllerVars[componentIndex].materials

  • UMA UmaUepProxy

    eyes.eyes[expressionIndex].expData.controllerVars[componentIndex].umaUepProxy


Some properties are only visible in certain templates

Enable Processing

Enable/disable eyelid processing.
void EnableEyelidBlink(bool status)

Eyelid Templates enum EyeTemplates

When setting the eyelid template from code, use the following method:
void BuildEyelidTemplate(EyelidTemplates eyelidTemplate)

Defaults to both upper and lower lids

void BuildEyelidTemplate(EyelidTemplates eyelidTemplate, EyelidSelection eyelidSelection)

Specify Both, Upper, or Lower lids

  • EyelidTemplates.None
    No eye configured
  • EyelidTemplates.Bone_Rotation (Rotation on the X and Y axis.)
    Defaults to two eyelid expressions with two Transform components on each (upper, lower).
  • EyelidTemplates.Bone_Position (Position on the X and Y axis.)
    Defaults to two eyelid expressions with two Transform components on each (upper, lower).
  • EyelidTemplates.BlendShapes
    Defaults to two eyelid expressions with the number of SkinnedMeshRenderer components matching the Eyelid Selection option in properties (both=2, upper=1, lower=1).
  • EyelidTemplates.Sprite_Swap
    Defaults to two eyelid expressions with one Sprite component on each.
  • EyelidTemplates.Texture_Swap
    Defaults to two eyelid expressions with one Material component on each.
  • EyelidTemplates.Material_Swap
    Defaults to two eyelid expressions with one Texture component on each.
  • EyelidTemplates.UMA
    Defaults to two eyelid expressions with the number of UMA components matching the Eyelid Selection option in properties (both=2, upper=1, lower=1).

Random bool blinkRandom

Enable random blinking.

Timer Vector2 blinkRandTimerRange = Vector2(0.5f, 5f)

Min/Max timer range for random blinking.


Eyelid Blink Expression

Name String

Access the expression name field using an Eyes reference:
eyes.blinklids[expressionIndex].expData.name


Eyelid Blink Component

Name String

Access the component name field using an Eyes reference. eyes.blinklids[expressionIndex].expData.components[componentIndex].name

Direction Type ExpressionComponent.DirectionType

Access the component name field using an Eyes reference. blinklids[expressionIndex].expData.components[componentIndex].directionType

Animation Timings (On) bool

Access the animation On timing using an Eyes reference:
eyes.blinklids[expressionIndex].expData.components[componentIndex].durationOn

Animation Timings (Hold) bool

Access the animation Hold timing using an Eyes reference:
eyes.blinklids[expressionIndex].expData.components[componentIndex].durationHold

Animation Timings (Off) bool

Access the animation Off timing using an Eyes reference:
eyes.blinklids[expressionIndex].expData.components[componentIndex].durationOff

Disable Smoothly bool

Access smooth disable using an Eyes reference:
eyes.blinklids[expressionIndex].expData.components[componentIndex].isSmoothDisable

Use Animator Controlled MergeBack bool

It is recommended to use the global QueueProcessor.useMergeWithInfluencer option. However, it is possible to control this at the controller level: eyes.blinklids[expressionIndex].expData.components[componentIndex].isAnimatorControlled

Easing enum LerpEasings.EasingType

Access animation easing types using an Eyes reference:
eyes.blinklids[expressionIndex].expData.components[componentIndex].easing

Component Dynamics float

Adjusts the range of overall expression component movement. eyes.blinklids[expressionIndex].expData.components[componentIndex].frac

Controller Type enum ControlType

Don't use this, use the BuildEyeTemplate method instead.

Controller

Access the controller slot using an Eyes reference:

  • Shape SkinnedMeshRenderer

    eyes.blinklids[expressionIndex].expData.controllerVars[componentIndex].smr

  • Bone Transform

    eyes.blinklids[expressionIndex].expData.controllerVars[componentIndex].bone

  • Sprite SpriteRenderer

    eyes.blinklids[expressionIndex].expData.controllerVars[componentIndex].sprites

  • Texture Renderer

    eyes.blinklids[expressionIndex].expData.controllerVars[componentIndex].textures

  • Material Renderer

    eyes.blinklids[expressionIndex].expData.controllerVars[componentIndex].materials

  • UMA UmaUepProxy

    eyes.blinklids[expressionIndex].expData.controllerVars[componentIndex].umaUepProxy


Eyelid Tracking Configuration

Some properties are only visible in certain templates

Enable Processing

Enable/disable eyelid processing.
void EnableEyelidTrack(bool status)


Copy Blink Controllers

Configure blink controllers, then copy the settings to the tracking controllers. Remember to specify the eye to track. void CopyBlinkToTrack()

Percent of Eyes [Range(0f, 1f)] float eyelidPercentEyes = 0.5f

Eyelids will follow a percentage of the eye movement.


Eyelid Tracking Expression

Name String

Access the expression name field using an Eyes reference:
eyes.tracklids[expressionIndex].expData.name

Track Eye int referenceIdx

The expression index of the eye you want this eyelid to track. eyes.tracklids[expressionIndex].referenceIdx


Eyelid Tracking Component

Name String

Access the component name field using an Eyes reference. The blendshape template uses a special component naming convention that must remain unmodified.
eyes.tracklids[expressionIndex].expData.components[componentIndex].name

Direction Type ExpressionComponent.DirectionType

Access the component name field using an Eyes reference. tracklids[expressionIndex].expData.components[componentIndex].directionType

Animation Timings (On) bool

Access the animation On timing using an Eyes reference:
eyes.tracklids[expressionIndex].expData.components[componentIndex].durationOn

Animation Timings (Hold) bool

Access the animation Hold timing using an Eyes reference:
eyes.tracklids[expressionIndex].expData.components[componentIndex].durationHold

Animation Timings (Off) bool

Access the animation Off timing using an Eyes reference:
eyes.tracklids[expressionIndex].expData.components[componentIndex].durationOff

Disable Smoothly bool

Access smooth disable using an Eyes reference:
eyes.tracklids[expressionIndex].expData.components[componentIndex].isSmoothDisable

Use Animator Controlled MergeBack bool

It is recommended to use the global QueueProcessor.useMergeWithInfluencer option. However, it is possible to control this at the controller level: eyes.tracklids[expressionIndex].expData.components[componentIndex].isAnimatorControlled

Easing enum LerpEasings.EasingType

Access animation easing types using an Eyes reference:
eyes.tracklids[expressionIndex].expData.components[componentIndex].easing

Component Dynamics float

Adjusts the range of overall expression component movement. eyes.tracklids[expressionIndex].expData.components[componentIndex].frac

Controller Type enum ControlType

Don't use this, use the BuildEyeTemplate method instead.

Controller

Access the controller slot using an Eyes reference:

  • Shape SkinnedMeshRenderer

    eyes.tracklids[expressionIndex].expData.controllerVars[componentIndex].smr

  • Bone Transform

    eyes.tracklids[expressionIndex].expData.controllerVars[componentIndex].bone

  • Sprite SpriteRenderer

    eyes.tracklids[expressionIndex].expData.controllerVars[componentIndex].sprites

  • Texture Renderer

    eyes.tracklids[expressionIndex].expData.controllerVars[componentIndex].textures

  • Material Renderer

    eyes.tracklids[expressionIndex].expData.controllerVars[componentIndex].materials

  • UMA UmaUepProxy

    eyes.tracklids[expressionIndex].expData.controllerVars[componentIndex].umaUepProxy

Methods

void ParentRandomTargets(bool status)

Set random head and eye targets to be parented to the characterRoot or the scene root.

AxisFixed FixTransformAxis(ref List<EyesExpression> expressions, int expIdx, int comIdx, bool fix)

Fix a transform axis for a specific expression component.

DEPRECATED - This feature was replaced with a rotation offset that is calculated automatically. The old method will remain in place for one update, giving you time to use the Restore Axis option to remove any corrective hierarchy.

void FixAllTransformAxes(ref List<EyesExpression> expressions, bool fix)

Fix all transform axes in the heads, eyes, or eyelids lists.
FixAllTransformAxes(ref eyes.heads, 0, 0, true)
FixAllTransformAxes(ref eyes.eyes, 0, 0, true)
FixAllTransformAxes(ref eyes.blinklids, 0, 0, true)
FixAllTransformAxes(ref eyes.tracklids, 0, 0, true)

DEPRECATED - This feature was replaced with a rotation offset that is calculated automatically. The old method will remain in place for one update, giving you time to use the Restore Axis option to remove any corrective hierarchy.

Transform AddParent(Transform child)

Add and return a parent to Transform parameter.

Enable Processing void EnableAll(bool status)

Enable/disable all Eyes component sections (head, eye, blink, track).
Calls the following methods:
void EnableHead(bool status)
void EnableEye(bool status)
void EnableEyelidBlink(bool status)
void EnableEyelidTrack(bool status)

void BuildHeadTemplate(HeadTemplates headTemplate)

Build a head template.

void BuildEyeTemplate(EyeTemplates eyeTemplate)

Build an eye template.

void BuildEyelidTemplate(EyelidTemplates eyelidTemplate)

Build an eyelid template.

void AddBoneExpression(ref List<EyesExpression> expressions, ExpressionComponent.ExpressionType expressionType)

Add a new bone expression.
AddBoneExpression(ref eyes.heads, ExpressionComponent.ExpressionType.Head)
AddBoneExpression(ref eyes.eyes, ExpressionComponent.ExpressionType.Eye)
AddBoneExpression(ref eyes.blinklids, ExpressionComponent.ExpressionType.Blink)
AddBoneExpression(ref eyes.tracklids, ExpressionComponent.ExpressionType.Eyelid)

void AddBoneComponent(ref List<EyesExpression> expressions, int expIdx, ExpressionComponent.ExpressionType expressionType)

Add a new bone component to a bone expression.
AddBoneComponent(ref eyes.heads, 0, ExpressionComponent.ExpressionType.Head)
AddBoneComponent(ref eyes.eyes, 0, ExpressionComponent.ExpressionType.Eye)
AddBoneComponent(ref eyes.blinklids, 0, ExpressionComponent.ExpressionType.Blink)
AddBoneComponent(ref eyes.tracklids, 0, ExpressionComponent.ExpressionType.Eyelid)

void AddEyeShapeExpression()

Add a new eye shape expression.

void AddEyeSectorExpression()

Add a new eye sector expression.

void AddEyelidShapeExpression(ref List<EyeExpression> expressions)

Add a new blink or eyelid tracking shape expression.

void AddEyelidSwapExpression(ExpressionComponent.ControlType controlType)

Add a new eyelid swap expression.

void AddEyelidSwapComponent(int expIdx, ExpressionComponent.ControlType controlType)

Add a new eyelid swap component.

void AddEyelidUMAExpression()

Add a new eyelid UMA expression.

bool RemoveExpression(ref List<EyesExpression> expressions, int expIdx)

Remove any expression.
RemoveExpression(ref eyes.heads, 0)
RemoveExpression(ref eyes.eyes, 0)
RemoveExpression(ref eyes.blinklids, 0)
RemoveExpression(ref eyes.tracklids, 0)

bool RemoveComponent(ref List<EyesExpression> expressions, int expIdx, int comIdx)

Remove any component.
RemoveComponent(ref eyes.heads, 0, 0)
RemoveComponent(ref eyes.eyes, 0, 0)
RemoveComponent(ref eyes.blinklids, 0, 0)
RemoveComponent(ref eyes.tracklids, 0, 0)

void CaptureMin(ref List<EyesExpression> expressions)

Capture the min bone pos,rot,scl for all controllers in this expression list.

void CaptureMax(ref List<EyesExpression> expressions)

Capture the max bone pos,rot,scl for all controllers in this expressions list.

void ReturnMin(ref List<EyesExpression> expressions)

Return the bone pos,rot,scl to the min for all controllers in this expressions list.

void LookForward()

Set all look targets to the forward position

void NewRandomHeadTarget()

Generate a new random head target position.

void NewRandomEyeTarget()

Generate a new random eye target position.

void NewBlink()

Perform a blink using the inspector On, Hold, and Off timings.

void NewBlink(float on, float hold, float off)

Perform a blink using custom one-time timings for On, Hold, and Off.

static void FindTransform(Transform characterRoot, string regexSearch)

Use this to search the characters hierarchy using a regular expression search string.

static void FindBlendIndex(SkinnedMeshRenderer smr, string regexSearch)

Use this to search a SkinnedMeshRenderer for a blendshape name using regular expression.

void UpdateRuntimeExpressionControllers(ref List<EyesExpression> expressions)

When setup up a character at runtime, call this for each Eyes module being used. This is the last step before calling Initialize().
UpdateRuntimeExpressionControllers(ref eyes.heads)
UpdateRuntimeExpressionControllers(ref eyes.eyes)
UpdateRuntimeExpressionControllers(ref eyes.blinklids)
UpdateRuntimeExpressionControllers(ref eyes.tracklids)

void Initialize()

When setting up a character at runtime, call this last after everything else is setup.