<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Karanveer's Blog]]></title><description><![CDATA[I'm writing to share my opinion with the 3 awesome friends I have.]]></description><link>https://www.karanveer.blog</link><generator>RSS for Node</generator><lastBuildDate>Sun, 12 Apr 2026 15:51:32 GMT</lastBuildDate><atom:link href="https://www.karanveer.blog/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[How to Increase My Typing Speed?]]></title><description><![CDATA[Great Question!
To quickly answer:⭐40–60 WPM is good.⭐⭐70–90 is better.⭐⭐⭐If you’re above 100, then you are considered a professional and can enter in the field of a stenographer or a transcriptionist for govt services to begin with, although a steno...]]></description><link>https://www.karanveer.blog/how-to-increase-my-typing-speed</link><guid isPermaLink="true">https://www.karanveer.blog/how-to-increase-my-typing-speed</guid><category><![CDATA[increase typing speed]]></category><category><![CDATA[typing]]></category><category><![CDATA[typing speed]]></category><category><![CDATA[how-to]]></category><dc:creator><![CDATA[karanveer]]></dc:creator><pubDate>Tue, 20 May 2025 06:54:49 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/jLwVAUtLOAQ/upload/ca46399dce804eed5f7d4360971deb4b.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Great Question!</p>
<p>To quickly answer:<br />⭐40–60 WPM is good.<br />⭐⭐70–90 is better.<br />⭐⭐⭐If you’re above 100, then you are considered a professional and can enter in the field of a stenographer or a transcriptionist for govt services to begin with, although a stenographer is slightly different than a QWERTY keyboard.</p>
<p>But wait!<br />Is WPM alone a factor? NOPE.❌</p>
<p>If you have a minute allow me to answer this question based on real-life research, this might just help you get some real results by yourself.<br />—<br />The Research Paper: <a target="_blank" href="https://cognitiveresearchjournal.springeropen.com/articles/10.1186/s41235-022-00424-3">Typing expertise in a large student population - Cognitive Research: Principles and Implications</a><br />—<br />It’s lengthy, so <strong>to save you some time,</strong> one of the 2 major things it emphasizes is the result that <strong>practicing</strong> can have. I’m going to focus on the practicing aspect because that is more in our control.</p>
<p>When it comes to typing speed you need to understand 2 major metrics:<br />1. <strong>WPM</strong> -&gt; Words per Minute.<br />2. <strong>Accuracy</strong> -&gt; If you intended to type a specific button on the keyboard, how accurate were you at clicking it?</p>
<p>Naturally, a person exposed to a computer would have a higher WPM with a decent accuracy of &gt; 90% than someone who isn’t, just because they <strong>practiced</strong> more.</p>
<p>You need a minimum 90% accuracy, &gt; 95% is ideal.</p>
<p><strong>So these are all well and good, but how do I set a number to reach my wpm?</strong></p>
<h2 id="heading-self-evaluation">👉 SELF EVALUATION</h2>
<p>Take a quick test, many platforms offer that, but one of the fastest ones is <a target="_blank" href="http://speedtesttyping.net">speedtesttyping.net</a>,</p>
<p><img src="https://qph.cf2.quoracdn.net/main-qimg-c6b3bfe79a3e65c1f08fceef0679330d" alt /></p>
<p><a target="_blank" href="https://www.speedtesttyping.net/">  
</a>I like it’s browser <a target="_blank" href="https://chromewebstore.google.com/detail/speed-test-your-typing-sp/jcaljndpimijemjaajnopmaogncojajo">extension</a> as a quick start button, and fewer obstacles to practice, but you can choose whatever platform you want.</p>
<p>DISCLAIMER: I am the creator of this mini productivity tool <a target="_blank" href="https://www.speedtesttyping.net/">speedtesttyping.net</a>, I felt obligated to notify you that you should know this. Any platform works, the main core is the <strong>practicing</strong> bit. ☺️</p>
<p>Take a test, and check your WPM.</p>
<p>For Example:<br />If you get 20 WPM, your next target should be 40 WPM within 3 months, with 95% accuracy.<br />If you get 40 WPM, your next target should be 60 WPM within 6 months with 95% accuracy.</p>
<p>You get the gist. Once you have set a reference, take a pen and paper, and note down the date, your wpm, and your accuracy.</p>
<h2 id="heading-now-practice">👉 <strong>NOW, PRACTICE!</strong></h2>
<p>Now, it’s time to cook!</p>
<p><strong>Some Pointers to keep in mind:</strong></p>
<p>1. Use all hands, with your left forefinger on <strong>F</strong> and the right on <strong>J</strong>, there's a bump on your keyboard's keycap for that. <em>did you notice?</em><br />2. Choose Accuracy over Speed. ALWAYS! TYPE SLOW BUT ACCURATE! I cannot emphasize this enough.<br />3. Posture matters, so make sure you're well-sit, and your arms are well rested on the same level as your keyboard with wrist support. I just used a new sponge from my mom's kitchen back in the days.<br />4. Dedicate to a platform, because after 10 days, it'll be easier to get back to than seeing something new and burdening yourself with overthinking, its called <em>Analysis Paralysis</em>.</p>
<p>Now,<br />Take your calendar out, gcal or ical, whatever you use, dedicate at least <strong>3 days a week to practice for 3 minutes</strong>, and note down your progress on pen and paper, set a reminder if you have to.</p>
<p><em>I have worked on Notion to Onenote to Apple notes to Samsung notes to Google Keep, and somehow I think pen and paper are the best ones, but you can also choose to note it in your favorite note taking app.</em></p>
<p>Do this for a month, and log. After a month, I guarantee you, if you’ve done this wholeheartedly, your typing speed along with accuracy, would improve.</p>
<p>That’s it.</p>
<p>Thank you for reading.<br />KV<br />—<br /><em>Initially Answered by me on Quora:</em> <a target="_blank" href="https://qr.ae/pAWdx4"><em>https://qr.ae/pAWdx4</em></a> <em>, modified for this Blog.</em><br />—</p>
]]></content:encoded></item><item><title><![CDATA[Is the Insta360 X5 Truly Worth the Excitement?]]></title><description><![CDATA[Hi Friends
Let’s be honest, we all love watching reviewers review the latest and greatest products, even if we know it’s of no use to us, we may buy it and store it away, and even more so it’s a particular niche, like the 360 cameras, which are still...]]></description><link>https://www.karanveer.blog/is-the-insta360-x5-truly-worth-the-excitement</link><guid isPermaLink="true">https://www.karanveer.blog/is-the-insta360-x5-truly-worth-the-excitement</guid><category><![CDATA[insta360]]></category><category><![CDATA[insta360 x5]]></category><dc:creator><![CDATA[karanveer]]></dc:creator><pubDate>Fri, 25 Apr 2025 07:35:54 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1745566454890/e0033d73-70de-4f72-a0d8-2a1accf1a1da.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Hi Friends</p>
<p>Let’s be honest, we all love watching reviewers review the latest and greatest products, even if we know it’s of no use to us, we may buy it and store it away, and even more so it’s a particular niche, like the 360 cameras, which are still in their infancy stage.</p>
<p>When the Insta360 launched, my homepage was filled with most of the reviewers having it as a sponsored product. Well, that felt a bit biased.</p>
<p>A review cannot be paid for, otherwise, it’s not a review, just a sponsored one speaking about how good something is. Insta360 X5 is good, but there are some drawbacks I found.</p>
<p>So, I am going to skip the super technical bits, let’s address the issues in pros and cons relative to how it matters for most of the users:</p>
<ul>
<li><p><strong>PROS</strong></p>
<ul>
<li><p><strong>Replaceable Lens</strong>, this one is the most important in my opinion. An additional lens kit would cost you $30 though.</p>
</li>
<li><p><strong>InstaFrame</strong>, this is for people who hate the post composition mode. Although this one is available on X4 too with software upgrade I believe.</p>
</li>
<li><p><strong>PureVideo</strong>, for low light performance, but this one has a caveat, enlisted in the cons.</p>
</li>
<li><p><strong>Increased Processing Power</strong>, the X5 has 2 Pro Imaging chips and an extra 5nm AI Chip whereas the X4 had only one 5nm AI Chip.</p>
</li>
<li><p>Fast Charging, as it now charges to 80% within 20 mins.</p>
</li>
<li><p>All Angles are recorded simultaneously, no more worrying if the camera was composed the right way, you can do this in post-processing.</p>
</li>
<li><p>Increases Waterproof capability, from 10m(33ft) underwater of the X4, to 15m(49ft) of the X5.</p>
</li>
<li><p>Bigger Sensor compared to its predecessor, the Insta360 X5 has dual 1/1.28” size sensors, whereas Insta360 X4 has dual 1/2” sized sensors, leading to better low-light shots, but dont expect professional levels like the Sony Alphas (of course) and the footage feels slighlty creamy for my taste to be honest.</p>
</li>
<li><p>In terms of Audio, it is improvised and has the Windguard as first introduced in the Insta360 Ace Pro 2.</p>
</li>
</ul>
</li>
<li><p><strong>CONS</strong></p>
<ul>
<li><p>Low light is improvised compared to X4 but it does feel like it smoothens the footage more than required, doesn’t yet feel natural to the eye. This is improvised in the next PureVideo update.</p>
</li>
<li><p>It claims to have longer battery life, but that is when it’s under specific settings, otherwise it’s comparable to X4. A marketing gimmick from Insta360.</p>
</li>
<li><p>Form Factor, the elongated shape feels a bit off for me, a bit too extruded, I’d prefer a more equalized shape.</p>
</li>
</ul>
</li>
</ul>
<p>BONUS: For Underwater recording, I would recommend getting a proper diving case to be used with it.</p>
<p>Should you get it?</p>
<p>If you have the X4, maybe wait for it unless you find yourself in high-adrenaline situations where the lens can be exposed to various impacts, then go for the X5.</p>
<p>If you have the predecessors of the same company and like the company’s products, then go for it.</p>
<p>If you are in the market for your first 360 camera and it’s not really urgent to get one, then I’d suggest waiting for a bit, as the DJI’s 360 camera release is teased and should be launched within a few weeks.</p>
<p>One of the reasons for me to wait for DJI’s is because of its ecosystem, DJI is scooping market share from not only drones but also ground gear like the “DJI Osmo Pocket 3“ or the “DJI Osmo Action 5 Pro” that blows the GoPros out of the water, plus their integration with each other is super snappy, especially with DJI Mic’s, as its mostly going to be used among creators, with its easy connect and go.</p>
<p>In the end, the products will keep on improvising every few months, but you need to truly ask yourself, do I really need it?.. or is it just the <strong>Gear Acquisition Syndrome</strong> that kicks in whenever I see something new?</p>
<p>If you want more details, you can check out the Insta360 X5’s product page directly <a target="_blank" href="https://www.insta360.com/product/insta360-x5">here</a>.</p>
<p>Not affiliated or associated or anything.</p>
<p>Use your money wisely.</p>
<p>KV</p>
]]></content:encoded></item><item><title><![CDATA[How to Sign Up and Use Linkspace.bio for first timers. [Failed Project, no more active]]]></title><description><![CDATA[Not everyone might feel the need to have links that explain themselves, each link having its description, but if you are looking to try out your links with a description, you've come to the right place.
Hi, I am Karanveer, founder of linkspace.bio, a...]]></description><link>https://www.karanveer.blog/how-to-sign-up-and-use-linkspacebio-for-first-timers</link><guid isPermaLink="true">https://www.karanveer.blog/how-to-sign-up-and-use-linkspacebio-for-first-timers</guid><category><![CDATA[linkspace]]></category><category><![CDATA[linkspacebio]]></category><category><![CDATA[SaaS]]></category><category><![CDATA[getting started]]></category><category><![CDATA[Next.js]]></category><category><![CDATA[TypeScript]]></category><dc:creator><![CDATA[karanveer]]></dc:creator><pubDate>Thu, 30 May 2024 07:14:03 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1716972321348/9609fd9c-5b9b-4eda-967b-84d3d781446c.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Not everyone might feel the need to have links that explain themselves, each link having its description, but if you are looking to try out your links with a description, you've come to the right place.</p>
<p>Hi, I am Karanveer, founder of linkspace.bio, and below are the steps on how to sign up on linkspace.bio and use it for first-timers.</p>
<h3 id="heading-step-1">⭐Step 1:</h3>
<h3 id="heading-go-to-linkspacebio-and-click-the-sign-up-button-in-the-top-right-corner">Go to linkspace.bio and click the Sign-Up button in the top right corner.</h3>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1716968168479/6c5d5a69-231f-44fc-8e2c-206c3a124a1b.png" alt class="image--center mx-auto" /></p>
<p>If you're on a mobile device:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1717658624657/085a3ae4-d2d7-4220-b401-54ef1105ce3e.png" alt class="image--center mx-auto" /></p>
<h3 id="heading-step-2-enter-the-details-new-credentials-you-want-to-use-during-sign-up">⭐Step 2: Enter the details/ new credentials you want to use during Sign-Up.</h3>
<p>NOTE: your password is not recoverable, because it is encrypted and inaccessible by anyone, including me, the founder. So please use a complex password and store it somewhere safe to remember, however, if you forget it, you can reset the password later.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1716968735978/ee4260b8-f4f5-484b-8a69-94004ecd0ca5.png" alt class="image--center mx-auto" /></p>
<h3 id="heading-step-3-check-your-emails-inbox-or-spam-folder">⭐Step 3: Check your email's 'inbox' or 'spam' folder.</h3>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1716969044794/15af72f2-0c6e-47eb-abf9-b9cdeba275c7.png" alt class="image--center mx-auto" /></p>
<h3 id="heading-step-4-you-should-see-something-like-the-below-image">⭐Step 4: You should see something like the below image</h3>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1716969957735/c055a2e4-13dc-4070-a922-abc9b408b4de.png" alt class="image--center mx-auto" /></p>
<h3 id="heading-step-5-click-the-blue-button-and-youll-be-verified">⭐Step 5: Click the blue button and you'll be verified.</h3>
<p>If you click the button and are not directed to your new logged-in dashboard, just sign in using your credentials.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1716969942897/53dbaeea-4adc-4d16-9b06-2548d1c901b4.png" alt class="image--center mx-auto" /></p>
<h3 id="heading-step-6-once-you-sign-in-your-linkspacebiohttplinkspacebio-dashboard-should-look-like-this">⭐Step 6: Once you sign-in, your <a target="_blank" href="http://linkspace.bio">linkspace.bio</a> dashboard should look like this.</h3>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1716969972819/df32314c-2b9b-42df-8ccd-4c5008162c6b.png" alt class="image--center mx-auto" /></p>
<h3 id="heading-step-7-upload-your-profile-picture-of-your-linkspace">⭐Step 7: Upload your profile picture of your linkspace..</h3>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1716969980500/c442acf2-8523-4f47-b78b-27dd0eb3adfb.png" alt class="image--center mx-auto" /></p>
<h3 id="heading-step-8-once-you-successfully-upload-your-profile-picture-it-should-look-something-like-this">⭐Step 8: Once you successfully upload your profile picture, it should look something like this.</h3>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1716970024801/35fd9be0-b2ba-4d1d-8f84-1cbb0c9d9b0a.png" alt class="image--center mx-auto" /></p>
<h3 id="heading-step-9-weve-added-1-link-along-with-a-quirky-description-you-can-sort-and-delete-your-links-too-if-needed">⭐Step 9: We've added 1 link along with a quirky description, you can sort and delete your links too if needed.</h3>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1716970030983/4eeba812-d724-4191-b395-34265cec6d33.png" alt class="image--center mx-auto" /></p>
<h3 id="heading-step-10-thats-it-this-is-also-how-your-followers-will-see-your-linkspace">⭐Step 10: That's it, this is also how your followers will see your linkspace.</h3>
<p>NOTE: If you're logged in, open your <a target="_blank" href="http://linkspace.bio/%5Busername%5D">linkspace.bio/[username]</a> in incognito/private mode and it should be like this. This is also how your followers will see your linkspace. For any doubts or complaints, please message me on X or Discord.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1716970038528/aefa27e9-8ad1-41f5-a2ce-e04261c96943.png" alt class="image--center mx-auto" /></p>
<p>⭐That's it for signing up and getting started with linkspace.bio ⭐</p>
<hr />
<p><strong>GOAL</strong><br />We're hoping to get 100 people by the end of 2024 who can benefit and use this software service.</p>
<p><strong>ABOUT</strong><br />All in all, it's a service that lets you sort and host your links, each with a description, so your audience is guided better.<br />No Ads, No Injected Tracking SDKs. No Forced Paywall. Pay what you can.</p>
<p><strong>DISCORD</strong><br />Consider joining linkspace.bio's <a target="_blank" href="https://discord.gg/E8r6DQt2su">discord</a> for joining a community of other linkspace people and seeing how creative they get with their links and descriptions.<br />Also, it's a chill place to hang out and make friends.</p>
<p><strong>PRICING</strong><br />We're only on the ko-fi platform. Become a <a target="_blank" href="https://ko-fi.com/linkspacebio/tiers">Plus Member</a> for $1, voluntarily.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1716971528052/8ef19a9f-062e-4bbe-b451-75626c11ef81.png" alt class="image--center mx-auto" /></p>
]]></content:encoded></item><item><title><![CDATA[What do you get for $1 these days?]]></title><description><![CDATA[If you live in New York, you might get a Cookie.If you live in Dubai, you get a Karak (Local Tea)
If you live in India or Indonesia, you get a plate of noodles from roadside food stalls.  
What can you buy for $1 where you live?Location - $1 Item.]]></description><link>https://www.karanveer.blog/what-do-you-get-for-1-these-days</link><guid isPermaLink="true">https://www.karanveer.blog/what-do-you-get-for-1-these-days</guid><category><![CDATA[money]]></category><category><![CDATA[money management]]></category><category><![CDATA[finance]]></category><dc:creator><![CDATA[karanveer]]></dc:creator><pubDate>Mon, 20 May 2024 11:10:36 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/8fDhgAN5zG0/upload/e1f9bfed70430a461e796e2f48a69f24.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>If you live in New York, you might get a Cookie.<br />If you live in Dubai, you get a Karak (Local Tea)</p>
<p>If you live in India or Indonesia, you get a plate of noodles from roadside food stalls.  </p>
<p>What can you buy for $1 where you live?<br />Location - $1 Item.</p>
]]></content:encoded></item><item><title><![CDATA[How AAA Studios create solid foundations from scratch in their RPGs Character DNA]]></title><description><![CDATA[If you're a fellow developer in AAA Studios or well organized Game Studio team, you are probably familiar with what I'm about to share, nevertheless, I'm sharing it here to help anyone pursuing a career in game development understand why it is crucia...]]></description><link>https://www.karanveer.blog/how-aaa-studios-create-solid-foundations-from-scratch-in-their-rpgs-character-dna</link><guid isPermaLink="true">https://www.karanveer.blog/how-aaa-studios-create-solid-foundations-from-scratch-in-their-rpgs-character-dna</guid><category><![CDATA[Game Development]]></category><category><![CDATA[Games]]></category><dc:creator><![CDATA[karanveer]]></dc:creator><pubDate>Wed, 06 Mar 2024 10:28:22 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/F4SxJ7ZtiRM/upload/a54f8d3995b6ec12eeb53332b45939d2.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>If you're a fellow developer in AAA Studios or well organized Game Studio team, you are probably familiar with what I'm about to share, nevertheless, I'm sharing it here to help anyone pursuing a career in game development understand why it is crucial to use architected solutions, especially for games you plan to make to sell commercially, or even just have your code scalable, without breaking things every time you add a new feature.<br />I'm going to demonstrate in super simple layman's terms with 3 different code styles, to move our protagonist.</p>
<ol>
<li><p><strong>PlayerMovement.cs</strong></p>
</li>
<li><p><strong>PlayerController.cs</strong></p>
</li>
<li><p><strong>PlayerController_FSM.cs</strong></p>
</li>
</ol>
<p>To help in visualizing the above 3 code styles, I've created this barebone infographic below:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1709714772575/1a40170b-6570-4a60-ac63-c1f7c8fdbdd2.png" alt class="image--center mx-auto" /></p>
<p>Before proceeding, I want to let you know that I've used Unity Engine with C# in Visual Code for this, so it is targeted towards people who use Unity or have used Unity in the past. However, since it is more of a design logic that I'm trying to portray and explain here, it is transferable to other Game Engines like Unreal Engine, Godot, etc.</p>
<ol>
<li><h2 id="heading-playermovementcs">PlayerMovement.cs</h2>
</li>
</ol>
<pre><code class="lang-plaintext">using UnityEngine;

public class PlayerMovement : MonoBehaviour
{
    public float speed = 5f;

    void Update()
    {
        // Get input axes
        float horizontalInput = Input.GetAxis("Horizontal"); //A &amp; D key input
        float verticalInput = Input.GetAxis("Vertical"); // W &amp;S key input

        // Calculate movement direction
        Vector3 movement = new Vector3(horizontalInput, 0f, verticalInput).normalized;

        // Move the player
        MovePlayer(movement);
    }

    void MovePlayer(Vector3 direction)
    {
        // Calculate the movement amount
        Vector3 movementAmount = direction * speed * Time.deltaTime;

        // Move the player
        transform.Translate(movementAmount, Space.World);
    }
}
</code></pre>
<p>If you are new to Gamedev, you might be familiar with PlayerMovement.cs . where you attach the PlayerMovement.cs script to your protagonist, and use Translate() to move your player (even though there are other methods as well to move a game object, but here we will use Translate() for simplicity), along with a rigid body component attached to the Protagonist. You can move around using WASD Keys.</p>
<p>Assuming you already have a simple GameObject model (as simple as a Cube),</p>
<p>The Steps to move your Protagonist using Translate():</p>
<ul>
<li><p>Step 1: Attach the above PlayerMovement.cs script to your GameObject.</p>
</li>
<li><p>Step 2: Add a Rigidbody component.</p>
</li>
<li><p>Step 3: Press Play, and move using WASD.</p>
</li>
</ul>
<p>If you're quickly prototyping a small game for game jam or just for fun, where your protagonist just needs to move as told, this is well and good to use.</p>
<ol start="2">
<li><h2 id="heading-playercontrollercs-character-controller-component">PlayerController.cs [ + Character Controller Component]</h2>
<pre><code class="lang-plaintext"> using UnityEngine;

 public class PlayerController : MonoBehaviour
 {
     public float speed = 5f;
     private CharacterController controller;

     void Start()
     {
         // Get the CharacterController component on the same GameObject
         controller = GetComponent&lt;CharacterController&gt;();
     }

     void Update()
     {
         // Get input axes
         float horizontalInput = Input.GetAxis("Horizontal");
         float verticalInput = Input.GetAxis("Vertical");

         // Calculate movement direction
         Vector3 movement = new Vector3(horizontalInput, 0f, verticalInput).normalized;

         // Move the player
         MovePlayer(movement);
     }

     void MovePlayer(Vector3 direction)
     {
         // Calculate the movement amount
         Vector3 movementAmount = direction * speed * Time.deltaTime;

         // Move the player using CharacterController
         controller.Move(movementAmount);
     }
 }
</code></pre>
<p> If you have been around the game dev scene then you probably are aware of Character Controllers and the benefits of using them for complete character control and implementing your custom physics, from custom gravity to levitating powers to superhuman strength.</p>
<p> The beauty of CC is that whether your protagonist is an old man or programming a Superhero, character controllers are so versatile that they are used in basically almost all RPGs because of their ability to DIY your character from scratch. Now, it does take more time to code your little custom "physics" systems around the character controller, but if you are looking for extreme control then this is the one for you.</p>
<p> Assuming you already have a simple GameObject model (as simple as a Cube), The Steps to move your Protagonist using A Character Controller:</p>
<ul>
<li><p>Step 1: Attach the above PlayerController.cs script to your GameObject.</p>
</li>
<li><p>Step 2: Add a Character Controller component.</p>
</li>
<li><p>Step 3: Press Play, and move using WASD.</p>
</li>
</ul>
</li>
</ol>
<p>    That's it, congrats!</p>
<p>    This pattern has been observed from game jams to even commercial games, but there is a better way to do it, that is scalable and doesn't break your code on every little change, imagine you have to add an extra superpower to your superhero, there are chances you would have to redo your code and the number of bugs you would produce would make it frustrating and to question your career in the gaming industry altogether, to say the least.</p>
<p>    To minimize these risks and stay on top of our code logic from the beginning, let me introduce you to the method that I swear by,</p>
<ul>
<li><h2 id="heading-playercontrollerfsmcs-character-controller-component-playerstatecs-n-states">PlayerController_FSM.cs [+ Character Controller Component + PlayerState.cs + N States]</h2>
</li>
<li><p>```plaintext
    //For Player Control. Acts like a little brain using other states through this script.
    using UnityEngine;</p>
<p>    public class PlayerController_FSM : MonoBehaviour
    {
        public static PlayerController_FSM ins;
        [Header("State System")]
        private PlayerState currentState;
        public readonly PlayerIdleState idleState = new PlayerIdleState();
        public readonly PlayerWalkState walkState = new PlayerWalkState();
        public readonly PlayerFlyState flyState = new PlayerFlyState();</p>
</li>
</ul>
<p>          [Header("Player Movement controls")]
          public float walkSpeed = 5f;
          private CharacterController controller;</p>
<p>          //Add gravity
          public float gravity = 10.0f; //9.8 but for sake of simplicity we will use 10. 
          //Add Flying power
          public float flyPower = 2.0f;
          private float verticalVelocity;</p>
<p>          void Awake()
          {
              ins= this;
          }
          void Start()
          {
              // Get the CharacterController component on the same GameObject
              controller = GetComponent();
              TransitionToState(idleState); //to start our player in idle state.
          }</p>
<p>          void Update()
          {
              currentState.Update(this);
          }</p>
<p>          private void OnCollisionEnter(Collision other)
          {
              currentState.OnCollisionEnter(this, other);
          }</p>
<p>          public void TransitionToState(PlayerState state)
          {
              currentState = state;
              currentState.EnterState(this);
          }</p>
<p>          private void OnTriggerEnter(Collider other)
          {
              currentState.OnTriggerEnter(this, other);
          }</p>
<p>          private void OnTriggerStay(Collider other)
          {
              currentState.OnTriggerStay(this, other);
          }</p>
<p>          private void OnTriggerExit(Collider other)
          {
              currentState.OnTriggerExit(this, other);
          }</p>
<p>          #region Player Walk Movement</p>
<p>          public void PlayerWalkMovement() //called from our different player states.
          {
          // Get input axes
              float horizontalInput = Input.GetAxis("Horizontal");
              float verticalInput = Input.GetAxis("Vertical");</p>
<p>              // Calculate movement direction
              Vector3 movement = new Vector3(horizontalInput, 0f, verticalInput).normalized;</p>
<p>              // Move the player
              MovePlayer(movement);
              //Rotate the player
              RotatePlayer(movement);
          }</p>
<p>          void MovePlayer(Vector3 direction)
          {
              // Calculate the movement amount
              Vector3 movementAmount = direction <em> walkSpeed </em> Time.deltaTime;</p>
<p>              // Apply gravity
              ApplyGravity();</p>
<p>              // Combine movement with gravity
              movementAmount += Vector3.up <em> verticalVelocity </em> Time.deltaTime;</p>
<p>              // Move the player using CharacterController
              controller.Move(movementAmount);</p>
<p>          }
          void RotatePlayer(Vector3 direction)
          {
              // Rotate the player to face the movement direction
              if (direction != Vector3.zero)
              {
                  Quaternion toRotation = Quaternion.LookRotation(direction, Vector3.up);
                  transform.rotation = Quaternion.RotateTowards(transform.rotation, toRotation, 360f <em> 2</em> Time.deltaTime);
              }
          }</p>
<p>          #endregion</p>
<p>          #region Player Idle Movement<br />          public void PlayerStoppedAndGrounded()
          {
              //Apply Gravity
              ApplyGravity();</p>
<p>              // Combine movement with gravity
              Vector3 movementAmount = Vector3.up <em> verticalVelocity </em> Time.deltaTime;</p>
<p>              // Move the player using CharacterController
              controller.Move(movementAmount); 
          }</p>
<p>           #endregion</p>
<p>      #region Player Fly Movement
      public void PlayerFlyMovement() //called from our different player states.
          {
          // Get input axes
              float horizontalInput = Input.GetAxis("Horizontal");
              float verticalInput = Input.GetAxis("Vertical");</p>
<p>              // Calculate movement direction
              Vector3 movement = new Vector3(horizontalInput, 0f, verticalInput).normalized;</p>
<p>              // Move the player
              FlyPlayer(movement);
              //Rotate the player
              RotatePlayer(movement);
          }</p>
<p>          void FlyPlayer(Vector3 direction)
          {
              // Calculate the movement amount
              Vector3 movementAmount = direction <em> walkSpeed </em> Time.deltaTime;</p>
<p>              // Apply Fly
             Fly();</p>
<p>              // Combine movement with gravity
              movementAmount += Vector3.up <em> verticalVelocity </em> Time.deltaTime;</p>
<p>              // Move the player using CharacterController
              controller.Move(movementAmount);</p>
<p>          }
          void FRotatePlayer(Vector3 direction)
          {
              // Rotate the player to face the movement direction
              if (direction != Vector3.zero)
              {
                  Quaternion toRotation = Quaternion.LookRotation(direction, Vector3.up);
                  transform.rotation = Quaternion.RotateTowards(transform.rotation, toRotation, 360f <em> 2</em> Time.deltaTime);
              }
          }</p>
<p>      #endregion</p>
<p>            void ApplyGravity()
          {
              // Apply custom gravity
              if (!controller.isGrounded)
              {
                  verticalVelocity -= gravity * Time.deltaTime;
              }
              else
              {
                  // Reset vertical velocity when grounded
                  verticalVelocity = -0.0f;
              }
          }</p>
<p>          void Fly()
          {
       // Apply custom gravity
              if (!controller.isGrounded)
              {
                  verticalVelocity += flyPower * Time.deltaTime;
              }
              else
              {
                  // Reset vertical velocity when grounded
                  verticalVelocity = -0.0f;
              }
          }
      }</p>
<pre><code>
    <span class="hljs-number">3.1</span> PlayerState.cs


<span class="hljs-string">``</span><span class="hljs-string">`plaintext
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public abstract class PlayerState
// Start is called before the first frame update
{
    public abstract void EnterState(PlayerController_FSM playerfsm);
    public abstract void Update(PlayerController_FSM playerfsm);
    public abstract void FixedUpdate(PlayerController_FSM playerfsm);
    public abstract void OnCollisionEnter(PlayerController_FSM playerfsm, Collision other);
    public abstract void OnTriggerEnter(PlayerController_FSM playerfsm, Collider other);
    public abstract void OnTriggerStay(PlayerController_FSM playerfsm,Collider other);
    public abstract void OnTriggerExit(PlayerController_FSM playerfsm, Collider other);
}</span>
</code></pre><p>PlayerIdleState.cs</p>
<pre><code class="lang-plaintext">using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerIdleState : PlayerState
{
    public override void EnterState(PlayerController_FSM playerfsm)
    {
        Debug.Log("Player Idle State Entered");
        //insert idle animation 
    }
    public override void OnCollisionEnter(PlayerController_FSM playerfsm, Collision other)
    {

    }
    public override void Update(PlayerController_FSM playerfsm)
    {        
        Debug.Log("Player Idle State Entered");
       if(Input.GetKeyDown(KeyCode.I)){
        Debug.Log("I is pressed");
        playerfsm.TransitionToState(playerfsm.walkState);
       }
       playerfsm.PlayerStoppedAndGrounded();
    }
    public override void FixedUpdate(PlayerController_FSM playerfsm) 
    {

    }
    public override void OnTriggerEnter(PlayerController_FSM playerfsm, Collider other)
    {

    }
    public override void OnTriggerStay(PlayerController_FSM playerfsm, Collider other)
    { 

    }

    public override void OnTriggerExit(PlayerController_FSM playerfsm, Collider other)
    { 

    }

}
</code></pre>
<p>PlayerWalkState.cs</p>
<pre><code class="lang-plaintext">using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerWalkState : PlayerState
{
    public override void EnterState(PlayerController_FSM playerfsm)
    {
        Debug.Log("Player Walk State Entered");
        //start walk animation
    }
    public override void OnCollisionEnter(PlayerController_FSM playerfsm, Collision other)
    {

    }
    public override void Update(PlayerController_FSM playerfsm)
    {
             Debug.Log("Player Walk State Entered");
             if(Input.GetKeyDown(KeyCode.I)){
                Debug.Log("I is pressed");
                playerfsm.TransitionToState(playerfsm.idleState);
            }

            playerfsm.PlayerWalkMovement();

    }
    public override void FixedUpdate(PlayerController_FSM playerfsm) 
    {

    }
    public override void OnTriggerEnter(PlayerController_FSM playerfsm, Collider other)
    {

    }
    public override void OnTriggerStay(PlayerController_FSM playerfsm, Collider other)
    { 

    }

    public override void OnTriggerExit(PlayerController_FSM playerfsm, Collider other)
    { 

    }

}
</code></pre>
<ul>
<li><p>To keep it simple, this is a pattern that most experienced Game Studios use and even though there is some setup time to it, it helps keep things segregated using Player States, and at any given point in time our player can only be in 1 state, i.e., either he is in walkState or idleState or jumpState etc. This pattern is also called Finite State Machine Pattern and in my opinion, it is gold for us game developers. Whether you are a developer or game designer, you need to try it out once and compare the differences, then once you start adding more to your RPG character, you will realize how things start breaking and how this pattern minimizes a lot of headaches.</p>
<p>  People also use enums, since enums are also very handy in this logic, but what I've shared here is the proper way to start your RPG Character Movement from scratch. There is more to it, I couldn't just fit in this but I hope you get the logic, so please do your study in depth.</p>
<p>  Assuming you already have a simple GameObject model (as simple as a Cube), The Steps to move your Protagonist using A Character Controller:</p>
<ul>
<li><p>Step 1: Attach the above PlayerController_FSM.cs script to your GameObject.</p>
</li>
<li><p>Step 2: Add a Character Controller component.</p>
</li>
<li><p>Step 3: Press Play, and move using WASD. By default you will be in an idle state, press "i" to switch to the walk state and then WASD to move, then to go back to the idle state, press "i" again and you are back to the idle state.</p>
</li>
</ul>
</li>
</ul>
<p>    That's it, congrats!</p>
<p>    Who should use this?<br />    If you are planning to sell your game on Steam (or any platform) and scale well ahead along with DLCs, i.e., new characters, skins, powers, mechanics, etc.. or simply want to impress AAA studios with a little RPG project of your own, this will come in handy.</p>
<p>    Having said that, I have also <a target="_blank" href="https://www.youtube.com/watch?v=AFCAtwZrcD4">videofied</a> this explanation, which unfortunately took some time, as it is a 1-hour long video session, but I still did it since videos help to understand better for some as well if anyone is interested.</p>
<ul>
<li><p>Thank you for your time guys.</p>
</li>
<li><p>Happy Game Dev'ving!</p>
<p>Karanveer<br />Unit Codes</p>
</li>
</ul>
]]></content:encoded></item><item><title><![CDATA[Understanding the root of MEGA Budgets]]></title><description><![CDATA[$1,000,000,000/year on marketing campaigns?
One might wonder, why?

Take The Coca-Cola company for example. It was founded in 1892 and had struggled in sales in it's first few years. Today, The Coca-Cola Company spends $4,000,000,000 on average for t...]]></description><link>https://www.karanveer.blog/understanding-the-root-of-mega-budgets</link><guid isPermaLink="true">https://www.karanveer.blog/understanding-the-root-of-mega-budgets</guid><category><![CDATA[marketing]]></category><category><![CDATA[business]]></category><category><![CDATA[finance]]></category><category><![CDATA[sales]]></category><category><![CDATA[corporations]]></category><dc:creator><![CDATA[karanveer]]></dc:creator><pubDate>Sat, 09 Sep 2023 07:09:45 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/jlWoIsNTKjA/upload/2005654d8dfd6f9ab3ab81b36c0af2b1.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><strong>$1,000,000,000/year</strong> on marketing campaigns?</p>
<p>One might wonder, why?</p>
<blockquote>
<p>Take The Coca-Cola company for example. It was founded in 1892 and had struggled in sales in it's first few years. Today, The Coca-Cola Company spends <strong>$4,000,000,000</strong> on average for their advertising, marketing, and promotions.</p>
</blockquote>
<p><a target="_blank" href="https://investors.coca-colacompany.com/filings-reports/annual-filings-10-k"><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1694242218398/ec38bda3-a3c0-44a3-a469-2b3cf3892de9.png" alt class="image--center mx-auto" /></a></p>
<p>Why does it need to do that when it's already one of the leading drinks companies?</p>
<p>And you might be right, they don't need to, but there's a catch.</p>
<p>We have all been versed with Coca-Cola while we were growing up. Our Parents were all versed with Coca-Cola while they were growing up. Our grandparents were also well versed with the brand Coca-Cola while they were growing up.</p>
<p>See the common factor?</p>
<p>They leave an ever-lasting impact on you. How?</p>
<h3 id="heading-imagine-a-scenario">Imagine A Scenario:</h3>
<blockquote>
<p>You are 60 and you visit a local store to get some groceries for your Thanksgiving dinner, on the way you pass by a soda cooler or a refrigerator and there is this recognizable name on the bottle or soda can you see that you saw when you were 6. In that brief moment, a response is triggered in your brain and it takes you back to your childhood for a brief second.</p>
</blockquote>
<p><img src="https://unsplash.com/photos/jlWoIsNTKjA" alt class="image--center mx-auto" /></p>
<p>It all happens so fast that sometimes we might not even realize it’s the power of marketing by that behemoth institution instilled in us. It's astonishing how our brains work but nevertheless, whether the 60-year-old ends up buying it or not for himself or his family is a different story, but there is a high probability that he will end up buying it.</p>
<p>This kind of brand presence just cannot be bought in a day.</p>
<p>That's the beauty of it.</p>
<p>Similarly, this extends to all industries, it could be a shoe store, candy store, or toy store…it all works the same.</p>
<hr />
<p>The Ultimate goal is to establish <strong>Market Cap Dominance.</strong> So you've reached the top, how do you stay there?</p>
<p>Maintaining that just takes as much work as reaching there, but that's a topic for another day.</p>
<p>Have a nice day folks!</p>
<hr />
<p>Thank you for your time.</p>
<p>If you liked this article, do follow for many such productivity goodies in upcoming articles. You can also suggest some in the comments or on my <a target="_blank" href="https://twitter.com/veerxyz"><strong>Twitter</strong></a>.</p>
]]></content:encoded></item><item><title><![CDATA[Maintaining a productive week ahead]]></title><description><![CDATA[There is a simple hack to have a productive week.

Write what you want to achieve.

Divide it into 5 parts: Monday through Tuesday

This is the hardest step of all, follow through.


Plan ahead. Baby steps go a long way.
Thank you for your time.]]></description><link>https://www.karanveer.blog/maintaining-a-productive-week-ahead</link><guid isPermaLink="true">https://www.karanveer.blog/maintaining-a-productive-week-ahead</guid><category><![CDATA[Productivity]]></category><category><![CDATA[#Productivity-tips]]></category><category><![CDATA[Productivity & Organization]]></category><category><![CDATA[ Productivity Hacks ]]></category><dc:creator><![CDATA[karanveer]]></dc:creator><pubDate>Sat, 20 May 2023 19:54:47 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/xG8IQMqMITM/upload/3349c24cae49692a7e054c75b4072a66.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>There is a simple hack to have a productive week.</p>
<ol>
<li><p>Write what you want to achieve.</p>
</li>
<li><p>Divide it into 5 parts: Monday through Tuesday</p>
</li>
<li><p>This is the hardest step of all, follow through.</p>
</li>
</ol>
<p>Plan ahead. Baby steps go a long way.</p>
<p>Thank you for your time.</p>
]]></content:encoded></item><item><title><![CDATA[Multi-tasking is a myth to the untrained mind]]></title><description><![CDATA[An exercise with me and I can prove to you that focusing on one thing at a time is probably a better option than choosing to believe that you can do 2 multiple things at the same time.
The Example, counting Numbers and the Alphabet with 2 methods:
Mo...]]></description><link>https://www.karanveer.blog/multi-tasking-is-a-myth-to-the-untrained-mind</link><guid isPermaLink="true">https://www.karanveer.blog/multi-tasking-is-a-myth-to-the-untrained-mind</guid><category><![CDATA[Productivity]]></category><category><![CDATA[#Productivity-tips]]></category><category><![CDATA[hacks]]></category><category><![CDATA[tips and tricks]]></category><dc:creator><![CDATA[karanveer]]></dc:creator><pubDate>Fri, 19 May 2023 17:20:41 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1694244238013/711d13f5-a7c5-4f49-a337-0f31927c2c45.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>An exercise with me and I can prove to you that focusing on <strong>one thing at a time</strong> is probably a better option than <strong>choosing to believe</strong> that you can do 2 multiple things at the same time.</p>
<p>The Example, counting Numbers and the Alphabet with 2 methods:</p>
<p>Monolith (individual-task allocation) vs Parallel (multi-tasking allocation):</p>
<p>Pre-requites:</p>
<ul>
<li>Stopwatch</li>
</ul>
<p>Method 1: <strong>The Monolith Method</strong></p>
<ul>
<li><p>Step 1: Start the Timer on your stopwatch</p>
</li>
<li><p>Step 2: Count 1- 26.</p>
</li>
<li><p>Step 3: Recite A-Z of the English alphabet</p>
</li>
<li><p>Step 4: Stop the Timer</p>
</li>
<li><p>Step 5: Note down the time.</p>
</li>
</ul>
<p>Method 2: <strong>The Parallel Method</strong></p>
<ul>
<li><p>Step 1: Start the Timer on your stopwatch</p>
</li>
<li><p>Step 2: Count numbers and Recite the alphabets together side by side, Eg: 1A, 2B …..26Z.</p>
</li>
<li><p>Step 3: Stop the Timer</p>
</li>
<li><p>Step 4: Note down the time.</p>
</li>
</ul>
<p>—</p>
<p>What time was quicker?</p>
<p>I suspect the answer is <strong>The Monolith Method.</strong> So leave the multi-tasking to the computers.</p>
<p>Have a nice day.</p>
<p>—</p>
<p>Thank you for your time.</p>
<p>If you liked this article, do follow for many such productivity goodies in upcoming articles. You can also suggest me some in the comments or on my <a target="_blank" href="https://twitter.com/veerxyz">Twitter</a>.</p>
]]></content:encoded></item></channel></rss>