private void PlayNextGesture() { if (allGestures.Count > 0) { AvatarGesture gesture = allGestures.Dequeue(); Debug.Log("Playing gesture: " + gesture.Name); // Make pretty display name string gestureName = gesture.Name.ToLower(); gestureName = gestureName.Substring(gestureName.IndexOf('_') + 1); gestureName = gestureName.Replace('_', ' '); gestureName = new CultureInfo("en-US", false).TextInfo.ToTitleCase(gestureName); textDisplay.text = gestureName; // Check if Head IK needs to be disabled if (gesture.Name.ToLower().Contains("head")) { lookAtIk.solver.headWeight = 0.7f; } else { lookAtIk.solver.headWeight = 1; } // Perform the gesture gestureController.PerformGesture(gesture); } else { Debug.Log("Finished playing all gestures!"); } }
/// <summary> /// Makes the avatar perform the specified gesture. /// </summary> /// <param name="gesture">Name of the gesture to perform</param> /// <param name="callback">Function to call when the gesture completes</param> public void PerformGesture(string gesture, Action <AvatarGesture> callback = null) { // Lookup gesture by name if (!AvatarGesture.AllGestures.ContainsKey(gesture.ToLower())) { Debug.LogError("Gesture \"" + gesture + "\" not found!"); return; } AvatarGesture ag = AvatarGesture.AllGestures[gesture.ToLower()]; PerformGesture(ag, callback); }
/// <summary> /// Makes the avatar perform the specified gesture. /// </summary> /// <param name="gesture">A predefined AvatarGesture.</param> /// <param name="callback">Function to call when the gesture completes</param> public void PerformGesture(AvatarGesture gesture, Action <AvatarGesture> callback = null) { if (gesture == null) { Debug.LogError("No gesture specified!"); return; } ////////////////////////////////////////////// // Get trigger names based on handedness string anim_gestureid_name; string anim_trigger_name; if (gesture.BodyPart == AvatarGesture.Body.LeftArm) { anim_gestureid_name = ANIM_LARM_GESTUREID; anim_trigger_name = ANIM_LARM_TRIGGER; currentStateBehavior = larmStateBehavior; } else if (gesture.BodyPart == AvatarGesture.Body.RightArm) { anim_gestureid_name = ANIM_RARM_GESTUREID; anim_trigger_name = ANIM_RARM_TRIGGER; currentStateBehavior = rarmStateBehavior; } else { anim_gestureid_name = ANIM_HEAD_GESTUREID; anim_trigger_name = ANIM_HEAD_TRIGGER; currentStateBehavior = headStateBehavior; } ////////////////////////////////////////////// // Trigger the gesture animator.SetInteger(anim_gestureid_name, gesture.Id); animator.SetTrigger(anim_trigger_name); CurrentGesture = gesture; ////////////////////////////////////////////// // Callback upon completion if (callback != null) { // Cache currentStateBehavior AvatarGestureStateBehavior behavior = currentStateBehavior; // Create a one-shot event handler that calls the callback function AvatarGestureStateBehavior.StateMachineEventHandler eventHandler = null; eventHandler = delegate(object sender) { behavior.AnimationEnd -= eventHandler; // Unsubscribe; one-shot callback(gesture); }; behavior.AnimationEnd += eventHandler; // Subscribe } }
private static void AddGestureToList(AvatarGesture gesture) { AllGestures.Add(gesture.Name.ToLower(), gesture); }
private void GestureController_GestureEnd(object sender, AvatarGesture gesture) { Invoke("PlayNextGesture", 1); }
private void GestureController_GestureStart(object sender, AvatarGesture gesture) { }