<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Liquefier</title>
    <description>The latest articles on DEV Community by Liquefier (@liquefier).</description>
    <link>https://dev.to/liquefier</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4134447%2F250c61b1-4728-4910-8d9e-423f06a42b1f.png</url>
      <title>DEV Community: Liquefier</title>
      <link>https://dev.to/liquefier</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/liquefier"/>
    <language>en</language>
    <item>
      <title>Unreal C++ Course Chapter 114 - 115.</title>
      <dc:creator>Liquefier</dc:creator>
      <pubDate>Fri, 25 Sep 2026 21:13:09 +0000</pubDate>
      <link>https://dev.to/liquefier/unreal-c-course-chapter-114-115-4a1b</link>
      <guid>https://dev.to/liquefier/unreal-c-course-chapter-114-115-4a1b</guid>
      <description>&lt;p&gt;Very straight forward blueprint and C++ use of attack montages, I also included a check to see if the character state was unequipped, which looks like it will be the next lesson. (I tend to get ahead of myself) &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fg6l8v88qhkdx0sd5n1tc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fg6l8v88qhkdx0sd5n1tc.png" alt=" " width="800" height="295"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;AEchoCharacter&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;EchoAttack&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;UAnimInstance&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;AnimInstance&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;GetMesh&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;GetAnimInstance&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;AnimInstance&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;AttackMontage&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;CurrentEquipState&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="n"&gt;ECharacterEquipState&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;ECS_UnEquipped&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;AnimInstance&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;Montage_Play&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;AttackMontage&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;int32&lt;/span&gt; &lt;span class="n"&gt;selection&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;FMath&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;RandRange&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="k"&gt;switch&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;selection&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;AnimInstance&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;Montage_JumpToSection&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Attack1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;AttackMontage&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;AnimInstance&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;Montage_JumpToSection&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Attack2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;AttackMontage&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>coding</category>
      <category>cpp</category>
      <category>gamedev</category>
      <category>programming</category>
    </item>
    <item>
      <title>Unreal Course Chapter 11 Challenge.</title>
      <dc:creator>Liquefier</dc:creator>
      <pubDate>Fri, 25 Sep 2026 20:02:06 +0000</pubDate>
      <link>https://dev.to/liquefier/unreal-course-chapter-11-challenge-e5f</link>
      <guid>https://dev.to/liquefier/unreal-course-chapter-11-challenge-e5f</guid>
      <description>&lt;p&gt;The challenge for this end of chapter was to get a 2 handed weapon and attach it to your mesh with an appropriate animation sequence.&lt;br&gt;&lt;br&gt;
Decided rather than using a new weapon for the time being I'd add different styles since I am using a katana.  Lots of fun figuring out that my weapon pointer wasn't getting de-referenced, but that pressing a button to fire events goes faster than the engine can handle, and you need to add Pressed to your Input Action Trigger.  Echo now can swap between Equipped, 1 Handed, or Two handed styles, but I need to fix the hand placement since the animation didn't quite line up. &lt;/p&gt;

&lt;p&gt;I added additional styles to the state enumeration and bound a key to cycle through them.  You absolutely cannot use digital bool as the input. There is likely a way to make sure you don't overload the engine with spam pointer dereference calls but the simplest path forward was to set it to respond in the "Pressed" state, not a continuous call to the Input Mapping Context.  &lt;/p&gt;

&lt;p&gt;My header file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;UENUM(BlueprintType)
enum class ECharacterEquipState : uint8
{
    ECS_Sheathed UMETA(DisplayName = "Sheathed"),
    ECS_Equipped1H UMETA(DisplayName = "Equipped One Hand"),
    ECS_Equipped2H UMETA(DisplayName = "Equipped Two Hand"),
    ECS_EquippedAkimbo UMETA(DisplayName = "Equipped Dual Weild"),
    ECS_UnEquipped UMETA(DisplayName = "Uequipped"),
    ECS_Count UMETA(Hidden),
};

ECharacterEquipState NextState(ECharacterEquipState State);

/*The NextState function:  */

ECharacterEquipState NextState(ECharacterEquipState State)
{
    const int count = static_cast&amp;lt;int&amp;gt;(ECharacterEquipState::ECS_Count);
    const int next = ((static_cast&amp;lt;int&amp;gt;(State)) + 1) % count;
    return static_cast&amp;lt;ECharacterEquipState&amp;gt;(next);

}

/*And the call to swap weapon style: ( I was reticent to use a while loop, but decided it was the most efficient solution, I was originally recursively calling the function, but moved away from that during debugging. ) */

void AEchoCharacter::EchoSwapStyle()
{

    const UEnum* Enum = StaticEnum&amp;lt;ECharacterEquipState&amp;gt;();
    const FText Display = Enum-&amp;gt;GetDisplayNameTextByValue(static_cast&amp;lt;int64&amp;gt;(CurrentEquipState));
    if (GEngine) GEngine-&amp;gt;AddOnScreenDebugMessage(2, 30.f, FColor::Blue, Display.ToString());

    ECharacterEquipState DesiredState;
    DesiredState = NextState(CurrentEquipState);
    while (!(EquippedWeapon-&amp;gt;CanUseStyle(DesiredState)))
        DesiredState = NextState(DesiredState);
    CurrentEquipState = DesiredState;

    const FText Display2 = Enum-&amp;gt;GetDisplayNameTextByValue(static_cast&amp;lt;int64&amp;gt;(CurrentEquipState));
    if (GEngine) GEngine-&amp;gt;AddOnScreenDebugMessage(3, 30.f, FColor::Blue, Display2.ToString());
}```

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

</description>
      <category>coding</category>
      <category>gamedev</category>
      <category>programming</category>
    </item>
    <item>
      <title>Unreal C++ Course - Chapter 111</title>
      <dc:creator>Liquefier</dc:creator>
      <pubDate>Mon, 21 Sep 2026 01:26:23 +0000</pubDate>
      <link>https://dev.to/liquefier/unreal-c-course-chapter-111-3joi</link>
      <guid>https://dev.to/liquefier/unreal-c-course-chapter-111-3joi</guid>
      <description>&lt;p&gt;The only real hang-up I had with this chapter is that you must loop the animation when u add it to your blueprint graph, otherwise it only plays it once then your character will just slide.  &lt;/p&gt;

</description>
    </item>
    <item>
      <title>Unreal C++ Course Chapter 109</title>
      <dc:creator>Liquefier</dc:creator>
      <pubDate>Mon, 21 Sep 2026 00:02:37 +0000</pubDate>
      <link>https://dev.to/liquefier/unreal-c-course-chapter-109-81g</link>
      <guid>https://dev.to/liquefier/unreal-c-course-chapter-109-81g</guid>
      <description>&lt;p&gt;In this chapter we set up the enumerations for the player character's equip state, in my case AEchoCharacter.  I declared my enumerations in a separate header file CharacterState.h which can also be used for other states besides equipping items:  Alive/Dead, Climbing/Swimming etc.  I decided to specify my enum encapsulation as ECharacterEquipState.&lt;/p&gt;

&lt;p&gt;Although I didn't fully agree with making the character variable private, I went along and will do all my state logic under the AEchoCharacter hood, using a const GetCharacterEquipState() getter.&lt;/p&gt;

&lt;p&gt;I ran into an issue when adding it to the Animation Instance, as it had been written using the parent class's pointer ACharacter, casting an  to it, I had to update the header pointer to AEchoCharacter so that I could call EchoCharacter-&amp;gt;GetCharacterEquipState().&lt;/p&gt;

</description>
      <category>gamedev</category>
      <category>programming</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Unreal C++ Course Chapter 107</title>
      <dc:creator>Liquefier</dc:creator>
      <pubDate>Sun, 20 Sep 2026 18:03:56 +0000</pubDate>
      <link>https://dev.to/liquefier/unreal-57ish-c-open-world-course-454o</link>
      <guid>https://dev.to/liquefier/unreal-57ish-c-open-world-course-454o</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fyo5ap2qx60uaygr5of9x.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fyo5ap2qx60uaygr5of9x.png" alt=" " width="800" height="503"&gt;&lt;/a&gt;On doing Chapter 107.  Attaching the Sword, I had some interesting bugs/hangups.  I was using a different weapon asset which had it's own issues but the first thing that was happening is that when I picked up the katana, my character would just get ejected from the level.  I had to turn off collision detection before I did the attachment.  I included the adjustments I made in blueprint for reference to fix it.  I also had an issue with my katana mesh, I had resized it to be appropriate for the character and when I would pick it up, it would revert to it's larger size.  I had to switch "Scale Rule" to "Keep World" to avoid that, pic included for laughs.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fk2irmta41mxsip0ikv6v.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fk2irmta41mxsip0ikv6v.png" alt=" " width="800" height="498"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>gamedev</category>
      <category>programming</category>
      <category>software</category>
    </item>
  </channel>
</rss>
