Revision Difference
AnimEvents,_AnimGraph_Tags,_and_Attachments#548356
<title>AnimEvents, AnimGraph Tags, and Attachments</title>⤶
<cat>Model.Animation</cat>⤶
⤶
##What are AnimEvents?⤶
[AnimEvents](https://wiki.facepunch.com/sbox/AnimEvents,_AnimGraph_Tags,_and_Attachments#animevents) used in **ModelDoc** as a way to make something happen during a specific frame of a **Simple Animation**, most commonly used to:⤶
⤶
* [Play **Sounds**](https://wiki.facepunch.com/sbox/AnimEvents,_AnimGraph_Tags,_and_Attachments#soundevents)⤶
⤶
* [Create **Particles**](https://wiki.facepunch.com/sbox/AnimEvents,_AnimGraph_Tags,_and_Attachments#particleevents)⤶
⤶
* [Switch **Bodygroups**](https://wiki.facepunch.com/sbox/AnimEvents,_AnimGraph_Tags,_and_Attachments#bodygroupevents)⤶
⤶
* [Add dynamic **Foot Steps**](https://wiki.facepunch.com/sbox/AnimEvents,_AnimGraph_Tags,_and_Attachments#footstepevents)⤶
⤶
* [Run **Code** in your game](https://wiki.facepunch.com/sbox/AnimEvents,_AnimGraph_Tags,_and_Attachments#runcodewithgenericevents)⤶
⤶
##What are AnimGraph Tags?⤶
[Animgraph Tags](https://wiki.facepunch.com/sbox/AnimEvents,_AnimGraph_Tags,_and_Attachments#animgraphtags) are used inside an **AnimGraph** to communicate with itself.⤶
You can specify the *start* and *end* of when a Tag is active inside individual **Animation Clips**, most commonly used to:⤶
⤶
* [Be a **Condition** in State Machines](https://wiki.facepunch.com/sbox/AnimEvents,_AnimGraph_Tags,_and_Attachments#tagconditioninastatemachine)⤶
⤶
* [Run **Code** in your game](https://wiki.facepunch.com/sbox/AnimEvents,_AnimGraph_Tags,_and_Attachments#runcodewithtags)⤶
⤶
#Attachments⤶
An **Attachment** is a point, similar to bones, but created in ModelDoc, and is required for many functions that need a position, like most AnimEvents.⤶
⤶
###Creating Attachments in ModelDoc:⤶
⤶
1. Press <key>✙Add</key>, add an `Attachment` and name it.⤶
⤶
2. Select which **Bone** will be its parent, this is the bone it will follow.⤶
<note>You can select "*None*", this will instead use the origin of the model.</note>⤶
⤶
3. Position the attachment *(you can use the various gizmos in the top left to aid you).*⤶
<upload src="a4aaf/8dad9599234e029.png" size="5436" name="image.png" />⤶
This should be the final result *(**mouth** is the attachment)*:⤶
<upload src="a4aaf/8dad959bd99e5e1.png" size="393942" name="image.png" />⤶
<note>The `RED` arrow indicates forward, while the **BLUE** arrow is up, make sure they are correct by rotating the attachment in the node itself.</note>⤶
⤶
#AnimEvents⤶
To add an AnimEvent *Right Click* a **Simple Animation** node, and select `Add AnimEvent...`⤶
<upload src="a4aaf/8dad95ae2a41f94.png" size="10534" name="image.png" />⤶
Once you selected an AnimEvent, you can choose the frame it will activate either in the **Timeline**, by dragging the AnimEvent, or in the Event's node by typing the frame.⤶
<upload src="a4aaf/8dad95c17bb6b3d.png" size="10543" name="image.png" />⤶
⤶
##Sound Events⤶
To play a sound, select:⤶
⤶
* **AE_CL_PLAYSOUND**: Play a sound **Clientside** from the model's origin.⤶
* **AE_CL_PLAYSOUND_ATTACHMENT**: Play a sound *ClientSide* from an **Attachment**.⤶
* **AE_SV_PLAYSOUND**: Play a sound **Serverside** from the model's origin.⤶
⤶
Then select a sound, after compiling, you can preview the AnimEvent:⤶
<upload src="a4aaf/8dad95f1e288bae.mp4" size="455634" name="soundevent.mp4" />⤶
⤶
##Particle Events⤶
To create particles, select:⤶
⤶
* **AE_CL_PARTICLE_EFFECT**: Create a particle from an **Attachment**.⤶
* **AE_CL_ADD_PARTICLE_EFFECT_CP**: Add a **Control Point** for a *Particle* from an *Attachment*.⤶
⤶
Then select a particle, and leave the default attachment type as is, as it should be fine for most cases.⤶
After compiling, you can preview the AnimEvent:⤶
<upload src="a4aaf/8dad96310b58a8b.mp4" size="205392" name="Particles.mp4" />⤶
⤶
##BodyGroup Events⤶
To switch bodygroups, select:⤶
⤶
* **AE_CL_BODYGROUP_SET_VALUE**: Set the **Value** of a *bodygroup*, *clientside*.⤶
* **AE_SV_BODYGROUP_SET_VALUE**: Set the *Value* of a *bodygroup*, **Serverside**.⤶
* **AE_CL_ENABLE_BODYGROUP**: *Enable* a *bodygroup*⤶
* **AE_CL_DISABLE_BODYGROUP**: *Disable* a *bodygroup*⤶
⤶
Then Select a bodygroup, and the desired value *(equivalent to their "Choice" number, starting from 0)*.⤶
After compiling, you can preview the AnimEvent:⤶
<upload src="a4aaf/8dad9663b70d0fe.mp4" size="456501" name="bodygroups.mp4" />⤶
⤶
##FootStep Events⤶
To add dynamic footsteps, select:⤶
⤶
* **AE_FOOTSTEP**: Play a dynamic **Footstep** sound from an *Attachment*⤶
⤶
You may set the **Volume** of the footstep, and whether it's **LEFT** or **RIGHT** *(Even if your character has more than 2 feet)*.⤶
⤶
##Run code with Generic Events⤶
You may also add **Generic Events** that do nothing, but signal your game when the animation has an event.⤶
⤶
**AE_GENERIC_EVENT** can include:⤶
⤶
* **Integer** data⤶
* **Float** data⤶
* **Vector** data⤶
* **String** data⤶
* Type Name⤶
⤶
```csharp⤶
public override void OnAnimEventGeneric( string name, int intData, float floatData, Vector3 vectorData, string stringData )⤶
{⤶
if ( name == "punch_impact_R" )⤶
{⤶
var rightFist = GetAttachment( "hand_R" );⤶
if ( rightFist != null )⤶
{⤶
DebugOverlay.Sphere( rightFist.Value.Position, 20f, Color.Red, 1f );⤶
Sound.FromWorld( "sounds/impacts/impact-bullet-flesh.sound", rightFist.Value.Position );⤶
}⤶
}⤶
}⤶
```⤶
This example code will create a red sphere when the generic event **`punch_impact`** is activated, at the position of the **`hand_R`** attachment *(You do not have the option to use an Attachment in the AnimEvent itself)*.⤶
⤶
#AnimGraph Tags⤶
To add a Tag in your Animgraph:⤶
⤶
1. In the **Tags** widget, press <key>✙</key> and select `Internal Tag`, name it accordingly.⤶
⤶
Then, to set the Tag inside your Animation Clips:⤶
⤶
2. Double Click an **Animation Clip** to enter it.⤶
3. Press <key>✙</key> and select your **Tag**⤶
4. Slide the Tag's start and end for the desired duration⤶
<upload src="a4aaf/8dad9717d3aab38.png" size="477051" name="image.png" />⤶
`In this example, the "Invincibility Frames" tag lasts from 0.5s to 1.0s`⤶
⤶
##Tag Condition in a State Machine⤶
Inside a state machine, you can select **Internal Tags** as **Tag Condition**⤶
<upload src="a4aaf/8dad9726e8884fc.png" size="80857" name="image.png" />⤶
`In this example, the "Disable LookAt" tag is used to disable a LookAt chain at the start of either "Growl" or "Howl" animations, until they finish their respective action.`⤶
⤶
##Run Code with Tags⤶
You can also use Tags to run code:⤶
```csharp⤶
protected override void OnAnimGraphTag( string tag, AnimGraphTagEvent fireMode )⤶
{⤶
if ( tag == "Invincibility Frames" )⤶
{⤶
if ( fireMode == AnimGraphTagEvent.Start )⤶
{⤶
// Enable invincibility⤶
Log.Info( "I am now invincible!" );⤶
}⤶
else if ( fireMode == AnimGraphTagEvent.End )⤶
{⤶
// Disable invincibility⤶
Log.Info( "I am not invincible anymore..." );⤶
}⤶
}⤶
}⤶
```⤶
This example code will make a character invincible during the **`Invincibility Frames`** tag, useful for features such as a Dark Souls-Styled Roll mechanic.