Beispiel #1
0
        private void SendEvents(Animator animator, AnimEventType eventType)
        {
            var receiver = animator.GetComponent <AnimEventReceiver>();

            if (receiver != null)
            {
                var exitEvents = _animEvents.Where(e => e.eventType == eventType);
                foreach (var exitEvent in exitEvents)
                {
                    receiver.SendEvent(animator, exitEvent);
                }
            }
        }
    /// <summary>
    /// Gets all the anim event mappings for the given animator controller.
    /// </summary>
    private static CodeObjectCreateExpression CreateWithEventMappings(AnimatorController animatorController, CodeExpression layerDeclarations)
    {
        Dictionary <AnimatorState, AnimatorControllerLayer> layerMap          = new Dictionary <AnimatorState, AnimatorControllerLayer>();
        Dictionary <AnimEventType, List <AnimatorState> >   bindings          = new Dictionary <AnimEventType, List <AnimatorState> >();
        Func <StateMachineBehaviour[], AnimEventBinder>     containsBehaviour = (behaviourSet) =>
        {
            for (int i = 0; i < behaviourSet.Length; i++)
            {
                if (behaviourSet[i].GetType() == typeof(AnimEventBinder))
                {
                    return((AnimEventBinder)behaviourSet[i]);
                }
            }
            return(null);
        };
        Func <AnimatorControllerLayer, AnimatorState, int> getFullPathHash = (layer, state) =>
        {
            return(Animator.StringToHash(layer.name + "." + state.name));
        };

        for (int l = 0; l < animatorController.layers.Length; l++)
        {
            for (int s = 0; s < animatorController.layers[l].stateMachine.states.Length; s++)
            {
                AnimEventBinder binder = containsBehaviour(animatorController.layers[l].stateMachine.states[s].state.behaviours);
                if (binder != null)
                {
                    for (int a = 0; a < binder.animEventTypes.Length; a++)
                    {
                        if (!bindings.ContainsKey(binder.animEventTypes[a]))
                        {
                            bindings.Add(binder.animEventTypes[a], new List <AnimatorState>());
                        }
                        bindings[binder.animEventTypes[a]].Add(animatorController.layers[l].stateMachine.states[s].state);
                        layerMap.Add(animatorController.layers[l].stateMachine.states[s].state, animatorController.layers[l]);
                    }
                }
            }
        }
        AnimEventType[] boundAnimEvents           = new AnimEventType[bindings.Keys.Count];
        int[][]         hashSets                  = new int[boundAnimEvents.Length][];
        CodeFieldReferenceExpression[] eventsRefs = new CodeFieldReferenceExpression[boundAnimEvents.Length];
        CodePrimitiveExpression[][]    hashRefs   = new CodePrimitiveExpression[hashSets.Length][];
        CodeArrayCreateExpression[]    subarrays  = new CodeArrayCreateExpression[hashRefs.Length];
        bindings.Keys.CopyTo(boundAnimEvents, 0);
        for (int i = 0; i < boundAnimEvents.Length; i++)
        {
            hashSets[i] = new int[bindings[boundAnimEvents[i]].Count];
            for (int s = 0; s < hashSets[i].Length; s++)
            {
                hashSets[i][s] = getFullPathHash(layerMap[bindings[boundAnimEvents[i]][s]], bindings[boundAnimEvents[i]][s]);
            }
            eventsRefs[i] = new CodeFieldReferenceExpression(new CodeTypeReferenceExpression(typeof(AnimEventType)), boundAnimEvents[i].ToString());
            hashRefs[i]   = new CodePrimitiveExpression[hashSets[i].Length];
            for (int h = 0; h < hashSets[i].Length; i++)
            {
                hashRefs[i][h] = new CodePrimitiveExpression(hashSets[i][h]);
            }
            subarrays[i] = new CodeArrayCreateExpression(typeof(int[]), hashRefs[i]);
        }
        CodeExpression hashesMultiArrayDeclaration;

        // If subarrays.Length == 0, CodeDOM will "optimize" this argument straight into a type mismatch!
        // This is a hack that works around that by making sure we explicitly declare an empty array-of-arrays,
        // if need be.
        if (subarrays.Length > 0)
        {
            hashesMultiArrayDeclaration = new CodeArrayCreateExpression(typeof(int[][]), subarrays);
        }
        else
        {
            hashesMultiArrayDeclaration = new CodeSnippetExpression("new int[0][]");
        }
        return(new CodeObjectCreateExpression(typeof(AnimatorMetadata), new CodeExpression[] { layerDeclarations,
                                                                                               new CodeArrayCreateExpression(typeof(AnimEventType), eventsRefs), hashesMultiArrayDeclaration }));
    }
Beispiel #3
0
 public AnimEventResolver(AnimEventType _animEventType, int[] _hashes)
 {
     animEventType = _animEventType;
     animsHashes   = _hashes;
 }