'After Effects Expressions - controling comps from main comp using an "Expressions Layer"

THE GOAL I WANT TO ACHEIVE:

Control AE timelines using ONE EXPRESSION LAYER (much like using Actionscript) to trigger frequently used comps such as blinking, walking, flying etc... for cartoon animation.

Beau Bird - The Character I want to blink.

I want animate a the blinking of a cartoon character. (and other actions, explained below) Rather than "re posting" the comp or key frames movements every time I want a blink or a particular action, I want to create a script where I can trigger the Blink comp to play. Is this possible? (Sidenote: A random blink through entire movie would be nice) but I still want to know how to do this for the reasons below.

Ideally: I would like to create an "Expressions layer" in the main comp to TRIGGER other comps to play. At certain points I would like to add triggers to call frequently used comps that contain actions like.. Blinking, Walking, Flying, Look Left and Right etc...

IT WOULD BE AMAZING IF somehow we could trigger other comps to begin, repeat, stop, maybe reverse, and do this all from one Main Comp using an expression layer.

WHY DO IT THIS WAY? Why not just paste a comp in the spot you want it to play every time you want such action? Well in after effects if you wanted a "blink comp" to play 40 times in two minutes you would have to create 40 layers, or pate the key frames on that comp 40 times. Wouldn't it be awesome to trigger or call it from one one layer when you wanted it from one expressions layer?

We do something like this in Flash using Actionscript all the time. It would be awesome if there was a method out there to achieve this effect. This would be an OUTSTANDING tutorial and I believe it would be very popular if someone did it. It could be used for a MULTITUDE of amazing effects and could save a ton of time for everyone. Heck, help me figure this out and perhaps I will make a tutorial.

Thank you all ye "overflowing Stackers" who contribute! :)



Solution 1:[1]

I found the answer and that is...

IT'S NOT POSSIBLE.

After Effects expressions can not control other timelines. Unfortunately you have to put an expression on each layer you want to affect.

The next best solution, and to achieve something close to what I was asking can be found on this link: motionscript.com/design-guide/marker-sync.html

We can only hope that Adobe will someday give the power to expressions like they did with action-script.

HOPEFULLY SOON! Anyone reading this who works for Adobe please plead our case. Thanks

Solution 2:[2]

Part 1: Reference other layers in pre-Comps

Simply replace "thisComp" with "comp("ComName")"

To reference Effect-Controllers between compositions, follow the below formula:

comp("ComName").layer("LayerWithExpression").effect("EffectControlerName")("EffectControllerType")
    

More In-depth Answer: Adobe's Docs - Skip to the Layer Sub-objects part

As I understand the Adobe documentation, only Layers can be accessed, not footage. What this means is that you will need to create your expression link utilizing a pre-Comp. Footage can not access this so that also means no nulls, adjustment layers, etc.

As an added bonus, if you use the essential graphics panel, you can put all the controllers in one pre-comp, but have the controls available no matter which comp you are in. Just select it in the Essential-Graphics dropdown.

Part 2: Start/End based on other layers within pre-comps:

Regarding the next part where you want the expressions to activate based on other compositions, I recommend using the in-out Point expression.

inPoint | Return type: Number. Returns the In point of the layer, in seconds. outPoint | Return type: Number. Returns the Out point of the layer, in seconds.

If you utilize the start time overrides you can pull this from:

startTime | Return type: Number. Returns the start time of the layer, in seconds.

Alternate Option: I would recommend avoiding this as the keyframes are basically referenced as an index, so things can get messed up if you add one ahead of a keyframe you were already using - def incorporate some error handling.

Refer to the Key attributes and methods (expression reference) Here

Part 3: Interpolation & Time Reversal You can time reverse the layer in the rightclick->time, otherwise this is all interpolation expressions like loop out etc - you can loopOut("FOO") a pre-comp if you not only cut it correctly, but also enable time remapping.

then use this to loop those keyframes;

try{ timeStart = thisProperty.key(1).time; duration = thisProperty.key(thisProperty.numKeys).time-timeStart; pingPong =
false; //change to true value if you want to loop animationn back &
forth  quant=Math.floor((time-timeStart)/duration);

if(quant<0) quant = 0
    

if(quant%2 == 1 && pingPong == true){   
t = 2*timeStart+ (quant+1)*duration - time;
}
else{
  t = time-quant*duration;
}
}
catch(err){
  t = time;
}


thisProperty.valueAtTime(t)

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Papa De Beau
Solution 2 Dharman