S&box Wiki

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.