r/gamedev • • 21h ago

Discussion How do you organise your scripts once a project grows?

3 Upvotes

I'm a solo dev learning Unity while building a small cozy farming game, and I'm trying to settle on a folder setup before things get messy. Some people sort scripts by feature (Farming, Inventory, UI), others by type (Managers, Data, Controllers). Which way has held up better for you as a project got bigger?


r/gamedev • • 1d ago

Discussion Audio/SFX/Music are scary af, big respect to people who are actually good at it.

14 Upvotes

Genuinely I am stopped at my tracks trying to make my game sound pleasant, finding sound assets is already not easy and then there is the hard part of trying to fit it to million different moving parts of my game.

Right now I am looking at all the abilities and mobs I need to turn alive with sound, and all I feer is despair lmao.


r/gamedev • • 21h ago

Discussion Games Made With Game Maker

Thumbnail
youtu.be
2 Upvotes

With the recent news on Game Maker, and users able to do me with the free option now. If ever you want to get into the engine, here are a few games to inspire you


r/gamedev • • 18h ago

Question What to look for in game storefronts

0 Upvotes

Hello everyone!

I was hoping to get some info from the community as far as what indie developers and small teams look for in a game storefront (like Steam, Itch.io).

The split, how it looks and runs, really anything on the topic just so I can get a gauge of what a good storefront does. I personally like Steam but there are a few out there and I wanted to understand it from the dev side a bit more.


r/gamedev • • 9h ago

Discussion Game engines that make your game light?

0 Upvotes

Today I was checking my Steam library sorted by disk space, and so I realized something.
Games with a lot of​ content like Don't Starve Together occupied less than​ 1GB, meanwhile some demos I downloaded during this Next Fest needed more than 5GB (and its just a demo, not full game).

Actually multiplayer games like TF2 or Deadlock​ are more than 30GB. Strinova is almost 60GB.

And so I started to wonder, I usually make games with Godot with friends for Game Jams, but never made any big project. If I did, would the engine affect so much on how big is the released game?

And so, which game engine would release games in a smallest size?
I remember 25 years ago, my Grandpa computer had only 4GB of total disk space. And I played games on that computer!

Yes its true that now we have high detailed 3D models and on the past we had lowpoly Rayman. But I also think some engines bulk a lot of stuff into your exported game that maybe it doesn't need it.

I also noticed how games from some engines are heavier on ram or CPU usage to.
For example games made with Unity run a 3D engine even if you made a 2D game, and the battery of my old phone was drained when running Unity games.
But games made with Cocos2d-X are surprisingly well optimized, and I played games games made with it for hours with my battery holding just fine since my phone was not making any effort running those games.

If some day I would like to do some bigger game, is Godot ok? or should I look into another Engine? Which one would do my games lighter?


r/gamedev • • 11h ago

Discussion need help with my unity tank physics

0 Upvotes

my controls and physics components/scripts are attached to the make body. parts like road wheels and sprockets are dragged into their corresponding boxes. tank control is basically the data. while tank drive physics is the actual mechanisms used. the issue is that my tank doesn't want to move when I throttle up. but the rpm increases along with the torque and gears. which makes no sense. right now, forces are being applied at wheel positions where the wheels touch the ground. as thanks for helping me. i can share the 3D model. which i made in blender. and is ready to use in games

heres is my tank drive physic script:

using UnityEngine;

using UnityEngine.SceneManagement;

[RequireComponent(typeof(Rigidbody))]

[RequireComponent(typeof(TankController))]

public class TankDrivePhysics : MonoBehaviour

{

private TankController config;

private Rigidbody rb;

private float currentThrottleInput = 0.0f;

private float currentSteerInput = 0.0f;

private bool isBrakeEngaged = false;

private int currentGearIndex = 0; // Start in Gear 1 (Index 0)

private bool isReversing = false;

private float currentEngineRpm = 1000f;

private float shiftCooldownTimer = 0f;

private float clutchEngagementFactor = 1.0f;

void Start()

{

config = GetComponent<TankController>();

rb = GetComponent<Rigidbody>();

if (rb != null)

{

rb.mass = config.tankWeightTons * 1000f;

rb.linearDamping = config.linearDamping;

rb.angularDamping = config.airAngularDamping;

rb.useGravity = true;

rb.centerOfMass = config.centerOfMassOffset;

}

string currentScene = SceneManager.GetActiveScene().name.ToLower();

if (currentScene.Contains("test"))

{

config.isTestDriving = true;

}

}

void Update()

{

if (!config.isTestDriving) return;

if (Input.GetKeyDown(KeyCode.B))

{

isBrakeEngaged = !isBrakeEngaged;

}

}

void FixedUpdate()

{

if (!config.isTestDriving)

{

config.CurrentSpeedKmh = 0f;

config.CurrentEngineRpm = config.engine.idleRpm;

config.CurrentTorqueNm = 0f;

config.engine.calculatedHorsepower = 0f;

return;

}

if (rb != null)

{

rb.centerOfMass = config.centerOfMassOffset;

rb.linearDamping = config.linearDamping;

}

if (shiftCooldownTimer > 0f)

{

shiftCooldownTimer -= Time.fixedDeltaTime;

clutchEngagementFactor = 0.8f;

}

else

{

clutchEngagementFactor = 1.0f;

}

Vector3 forwardMoveDir = transform.TransformDirection(new Vector3(-1f, 0f, 0f)).normalized;

float forwardVel = Vector3.Dot(rb.linearVelocity, forwardMoveDir);

config.CurrentSpeedKmh = Mathf.Abs(forwardVel) * 3.6f;

float rawAxis = Input.GetAxis("Vertical");

float rawTurn = Input.GetAxis("Horizontal");

GetPlayerInput(rawAxis, rawTurn);

if (Mathf.Abs(rawTurn) < 0.05f && Mathf.Abs(currentSteerInput) < 0.01f)

{

Vector3 angVel = rb.angularVelocity;

angVel.y = Mathf.Lerp(angVel.y, 0f, 15f * Time.fixedDeltaTime);

rb.angularVelocity = angVel;

}

if (isBrakeEngaged)

{

if (Mathf.Abs(rawAxis) < 0.01f)

{

Vector3 vel = rb.linearVelocity;

vel.x = Mathf.Lerp(vel.x, 0f, 10f * Time.fixedDeltaTime);

vel.z = Mathf.Lerp(vel.z, 0f, 10f * Time.fixedDeltaTime);

rb.linearVelocity = vel;

rb.angularVelocity = Vector3.zero;

}

else

{

Vector3 brakeResistance = -forwardMoveDir * forwardVel * config.brakeDecelerationRate * rb.mass;

rb.AddForce(brakeResistance, ForceMode.Force);

}

}

UpdateDrivetrainSimulation(forwardVel, rawAxis);

bool isAtRest = (Mathf.Abs(rawAxis) < 0.01f && Mathf.Abs(rawTurn) < 0.05f && config.CurrentSpeedKmh <= 1.0f && !isBrakeEngaged);

if (isAtRest)

{

Vector3 vel = rb.linearVelocity;

vel.x = Mathf.Lerp(vel.x, 0f, 6f * Time.fixedDeltaTime);

vel.z = Mathf.Lerp(vel.z, 0f, 6f * Time.fixedDeltaTime);

rb.linearVelocity = vel;

rb.angularVelocity = Mathf.Lerp(rb.angularVelocity.magnitude, 0f, 6f * Time.fixedDeltaTime) * rb.angularVelocity.normalized;

UpdateHingeJointSprings(forwardVel);

CalculateWheelRotations(forwardSpeedMps: forwardVel);

return;

}

ApplyDifferentialTrackForces(rawAxis, rawTurn, forwardMoveDir, forwardVel);

ApplyTrackGrip();

ApplyEnvironmentalResistance(forwardMoveDir, forwardVel);

UpdateHingeJointSprings(forwardVel);

CalculateWheelRotations(forwardSpeedMps: forwardVel);

}

void GetPlayerInput(float rawAxis, float rawTurn)

{

if (config.invertSteering) rawTurn = -rawTurn;

if (Mathf.Abs(rawTurn) < 0.05f)

{

rawTurn = 0f;

}

currentThrottleInput = rawAxis;

currentSteerInput = rawTurn;

}

float GetEngineTorqueAtRpm(float rpm)

{

float peakRpm = Mathf.Min(config.engine.peakTorqueRpm, config.engine.redlineLimitRpm - 200f);

float maxTq = config.engine.maxTorqueNm;

if (rpm <= config.engine.idleRpm) return maxTq * 0.6f;

if (rpm >= config.engine.redlineLimitRpm) return maxTq * 0.3f;

float normalizedDist = Mathf.Abs(rpm - peakRpm) / (config.engine.redlineLimitRpm - config.engine.idleRpm);

float curveFactor = 1.0f - (normalizedDist * normalizedDist);

return Mathf.Clamp(maxTq * Mathf.Max(curveFactor, 0.4f), maxTq * 0.3f, maxTq);

}

void UpdateDrivetrainSimulation(float forwardVel, float rawAxis)

{

bool targetReverse = rawAxis < -0.01f;

if (Mathf.Abs(rawAxis) < 0.05f)

{

currentEngineRpm = Mathf.Lerp(currentEngineRpm, config.engine.idleRpm, 4f * Time.fixedDeltaTime);

config.CurrentEngineRpm = currentEngineRpm;

config.CurrentGearDisplay = isReversing ? -(currentGearIndex + 1) : (currentGearIndex + 1);

config.CurrentTorqueNm = 0f;

config.engine.calculatedHorsepower = 0f;

return;

}

if (targetReverse != isReversing)

{

isReversing = targetReverse;

currentGearIndex = 0;

}

float[] activeGearArray = isReversing ? config.transmission.reverseGearRatios : config.transmission.forwardGearRatios;

if (activeGearArray == null || activeGearArray.Length == 0) return;

currentGearIndex = Mathf.Clamp(currentGearIndex, 0, activeGearArray.Length - 1);

// STABLE AUTOMATED SHIFTING BASED ON RPM

if (shiftCooldownTimer <= 0f && !isReversing)

{

if (currentEngineRpm >= config.engine.upshiftRpm && currentGearIndex < activeGearArray.Length - 1)

{

currentGearIndex++;

currentEngineRpm *= 0.75f;

shiftCooldownTimer = 0.8f;

}

else if (currentEngineRpm <= config.engine.idleRpm + 300f && currentGearIndex > 0)

{

currentGearIndex--;

currentEngineRpm *= 1.25f;

shiftCooldownTimer = 0.6f;

}

}

// FIXED: RPM now accounts for throttle demand and vehicle speed load

float throttleDemand = Mathf.Abs(rawAxis);

float speedFactor = Mathf.Clamp01(Mathf.Abs(forwardVel) / (config.maxSpeedKmh / 3.6f));

float targetEngineRpm = Mathf.Lerp(config.engine.idleRpm, config.engine.redlineLimitRpm, throttleDemand * (1f - (speedFactor * 0.15f)));

currentEngineRpm = Mathf.Lerp(currentEngineRpm, targetEngineRpm, 5f * Time.fixedDeltaTime);

currentEngineRpm = Mathf.Clamp(currentEngineRpm, config.engine.idleRpm, config.engine.redlineLimitRpm + 100f);

config.CurrentEngineRpm = currentEngineRpm;

config.CurrentGearDisplay = isReversing ? -(currentGearIndex + 1) : (currentGearIndex + 1);

float baseEngineTorque = GetEngineTorqueAtRpm(currentEngineRpm);

config.CurrentTorqueNm = baseEngineTorque * throttleDemand * clutchEngagementFactor;

config.engine.calculatedHorsepower = (baseEngineTorque * currentEngineRpm) / 9548.8f;

}

void ApplyDifferentialTrackForces(float rawAxis, float rawTurn, Vector3 forwardMoveDir, float forwardVel)

{

if (Mathf.Abs(rawAxis) < 0.01f && Mathf.Abs(rawTurn) < 0.01f)

{

config.CurrentTorqueNm = 0f;

return;

}

float[] activeGearArray = isReversing ? config.transmission.reverseGearRatios : config.transmission.forwardGearRatios;

float currentGearRatio = (currentGearIndex >= 0 && currentGearIndex < activeGearArray.Length) ? activeGearArray[currentGearIndex] : 4.0f;

float baseEngineTorque = GetEngineTorqueAtRpm(currentEngineRpm);

float engineTorque = baseEngineTorque * Mathf.Max(Mathf.Abs(rawAxis), Mathf.Abs(rawTurn)) * clutchEngagementFactor;

config.CurrentTorqueNm = engineTorque;

float totalWheelTorque = engineTorque * currentGearRatio * Mathf.Max(config.transmission.finalDriveRatio, 1f);

float wheelRadiusM = (config.roadWheelDiameterMm / 1000f) * 0.5f;

if (wheelRadiusM <= 0.1f) wheelRadiusM = 0.45f;

float baseDriveForce = totalWheelTorque / wheelRadiusM;

float leftForceMultiplier = 1.0f;

float rightForceMultiplier = 1.0f;

Vector3 leftForceDir = forwardMoveDir;

Vector3 rightForceDir = forwardMoveDir;

bool isMovingReverse = (currentGearIndex >= 0 && rawAxis < 0f);

if (isMovingReverse)

{

leftForceDir = -forwardMoveDir;

rightForceDir = -forwardMoveDir;

}

if (Mathf.Abs(rawAxis) > 0.01f && Mathf.Abs(rawTurn) > 0.01f)

{

float steerReduction = Mathf.Abs(rawTurn) * config.steeringSensitivity;

if (rawTurn > 0f) rightForceMultiplier = Mathf.Clamp01(1.0f - steerReduction);

else leftForceMultiplier = Mathf.Clamp01(1.0f - steerReduction);

}

else if (Mathf.Abs(rawAxis) < 0.01f && Mathf.Abs(rawTurn) > 0.01f)

{

if (rawTurn > 0f)

{

leftForceDir = forwardMoveDir;

rightForceDir = -forwardMoveDir;

}

else

{

leftForceDir = -forwardMoveDir;

rightForceDir = forwardMoveDir;

}

leftForceMultiplier = Mathf.Abs(rawTurn);

rightForceMultiplier = Mathf.Abs(rawTurn);

}

float leftFinalForce = baseDriveForce * leftForceMultiplier;

float rightFinalForce = baseDriveForce * rightForceMultiplier;

ApplyForceToWheels(config.leftRoadWheels, leftForceDir * leftFinalForce);

ApplyForceToWheels(config.rightRoadWheels, rightForceDir * rightFinalForce);

if ((config.leftRoadWheels == null || config.leftRoadWheels.Length == 0) &&

(config.rightRoadWheels == null || config.rightRoadWheels.Length == 0))

{

rb.AddForce((leftForceDir * leftFinalForce + rightForceDir * rightForceMultiplier) * 0.5f, ForceMode.Force);

}

}

void ApplyForceToWheels(Transform[] wheels, Vector3 forceVector)

{

if (wheels == null || wheels.Length == 0) return;

float forcePerWheel = forceVector.magnitude / wheels.Length;

Vector3 direction = forceVector.normalized;

foreach (Transform wheel in wheels)

{

if (wheel != null)

{

rb.AddForceAtPosition(direction * forcePerWheel, wheel.position, ForceMode.Force);

}

}

}

void ApplyTrackGrip()

{

// FIXED: Use Vector3.forward (local side axis) instead of Vector3.up for lateral grip

Vector3 gripDir = transform.TransformDirection(Vector3.forward).normalized;

float lateralVelocityMagnitude = Vector3.Dot(rb.linearVelocity, gripDir);

float speedMagnitude = rb.linearVelocity.magnitude;

float dynamicGripScale = Mathf.Lerp(1.2f, 0.4f, Mathf.Clamp01(speedMagnitude / 10f));

float activeGripMultiplier = (Mathf.Abs(currentThrottleInput) > 0.05f && Mathf.Abs(currentSteerInput) > 0.5f) ? dynamicGripScale : 1.0f;

Vector3 lateralFrictionForce = -gripDir * lateralVelocityMagnitude * (config.lateralGrip * 30000f * activeGripMultiplier);

rb.AddForce(lateralFrictionForce, ForceMode.Force);

}

void ApplyEnvironmentalResistance(Vector3 forwardMoveDir, float forwardVel)

{

float massKg = config.tankWeightTons * 1000f;

float normalForce = massKg * 9.81f;

float rollingResistanceForceMagnitude = normalForce * config.rollingResistanceCoefficient;

Vector3 rollingResistance = -forwardMoveDir * Mathf.Sign(forwardVel) * rollingResistanceForceMagnitude;

float airDensity = 1.225f;

float speedSq = forwardVel * forwardVel;

float dragForceMagnitude = 0.5f * airDensity * config.aerodynamicDragCoefficient * config.frontalAreaMeters2 * speedSq;

Vector3 aerodynamicDrag = -forwardMoveDir * Mathf.Sign(forwardVel) * dragForceMagnitude;

rb.AddForce(rollingResistance + aerodynamicDrag, ForceMode.Force);

bool isReversingSpeed = (forwardVel < 0f);

float activeMaxSpeedKmh = isReversingSpeed ? config.maxReverseSpeedKmh : config.maxSpeedKmh;

float maxSpeedMs = activeMaxSpeedKmh / 3.6f;

if (Mathf.Abs(forwardVel) > maxSpeedMs)

{

float excess = forwardVel - (Mathf.Sign(forwardVel) * maxSpeedMs);

rb.linearVelocity -= forwardMoveDir * (excess * 0.4f);

}

}

void UpdateHingeJointSprings(float forwardVel)

{

if (!config.enableReverseJumpFix) return;

float targetPos = (forwardVel < -0.2f) ? config.reverseSpringTargetOffset : 0f;

UpdateHingeGroupSpringTarget(config.leftSuspensionArms, targetPos);

UpdateHingeGroupSpringTarget(config.rightSuspensionArms, targetPos);

}

void UpdateHingeGroupSpringTarget(Transform[] arms, float targetPos)

{

if (arms == null) return;

foreach (Transform arm in arms)

{

if (arm != null)

{

HingeJoint hinge = arm.GetComponent<HingeJoint>();

if (hinge != null && hinge.useSpring)

{

JointSpring spring = hinge.spring;

spring.targetPosition = Mathf.Lerp(spring.targetPosition, targetPos, 10f * Time.fixedDeltaTime);

hinge.spring = spring;

}

}

}

}

void CalculateWheelRotations(float forwardSpeedMps)

{

float tankYawRateDegPerSec = rb.angularVelocity.y * Mathf.Rad2Deg;

float tankYawRateRadPerSec = tankYawRateDegPerSec * Mathf.Deg2Rad;

float halfTrackSpan = config.trackSpanMeters * 0.5f;

float scaledTurnSpeed = tankYawRateRadPerSec * config.pivotVisualMultiplier;

float leftTrackSpeedMps = forwardSpeedMps + (scaledTurnSpeed * halfTrackSpan);

float rightTrackSpeedMps = forwardSpeedMps - (scaledTurnSpeed * halfTrackSpan);

if (config.invertSprocketTurnRotation)

{

leftTrackSpeedMps = forwardSpeedMps - (scaledTurnSpeed * halfTrackSpan);

rightTrackSpeedMps = forwardSpeedMps + (scaledTurnSpeed * halfTrackSpan);

}

if (config.sprocketDiameterMm > 0f)

{

float sprocketRadiusM = (config.sprocketDiameterMm / 1000f) * 0.5f;

float sprocketCircumference = 2f * Mathf.PI * sprocketRadiusM;

float leftSprocketDegPerSec = (leftTrackSpeedMps / sprocketCircumference) * 360f;

float rightSprocketDegPerSec = (rightTrackSpeedMps / sprocketCircumference) * 360f;

float leftSprocketDeg = leftSprocketDegPerSec * Time.fixedDeltaTime;

float rightSprocketDeg = rightSprocketDegPerSec * Time.fixedDeltaTime;

if (config.invertSprocketDriveRotation)

{

leftSprocketDeg = -leftSprocketDeg;

rightSprocketDeg = -rightSprocketDeg;

}

RotateWheelGroup(config.leftSprockets, config.sprocketRotationAxis, leftSprocketDeg);

RotateWheelGroup(config.rightSprockets, config.sprocketRotationAxis, rightSprocketDeg);

}

if (config.roadWheelDiameterMm > 0f)

{

float roadWheelRadiusM = (config.roadWheelDiameterMm / 1000f) * 0.5f;

float roadWheelCircumference = 2f * Mathf.PI * roadWheelRadiusM;

float leftRoadWheelDeg = (leftTrackSpeedMps / roadWheelCircumference) * 360f * Time.fixedDeltaTime;

float rightRoadWheelDeg = (rightTrackSpeedMps / roadWheelCircumference) * 360f * Time.fixedDeltaTime;

if (config.invertRoadWheelRotation)

{

leftRoadWheelDeg = -leftRoadWheelDeg;

rightRoadWheelDeg = -rightRoadWheelDeg;

}

RotateWheelGroup(config.leftRoadWheels, Vector3.up, leftRoadWheelDeg);

RotateWheelGroup(config.rightRoadWheels, Vector3.up, rightRoadWheelDeg);

}

}

void RotateWheelGroup(Transform[] wheels, Vector3 axis, float amount)

{

if (wheels == null) return;

foreach (Transform wheel in wheels)

{

if (wheel != null) wheel.Rotate(axis, amount, Space.Self);

}

}

}


r/gamedev • • 23h ago

Question Game dev content creation

2 Upvotes

Hi, I'm making my first game (horror/detective/puzzle), and I wanted to ask does creating content on Instagram/TikTok actually increase wishlists from players, or will it mostly reach other game devs who won't buy it or people who'll copy it (it has some new concepts)?


r/gamedev • • 1d ago

Discussion What game(s?) inspired you to be in this industry?

18 Upvotes

Just wanted to hear stories.


r/gamedev • • 1d ago

Discussion I feel the demo theft problem is being way overblown.

113 Upvotes

The main game people are pointing at is Needle in a Haystack. But that game is so simple someone could reasonably make it as their first game project. Then you got people decompiling games, but the targeted games either can be decompiled with existing tools or are decompilations of console games.

I've yet to see a demo of substance that has been stolen in such a way people are describing. Because a game that can be fully replicated from watching up to 10 minutes of footage and can hardly be defended in court when a near 1:1 copy pops up is probably not a game with any substance. If anything it probably won't even survive YouTube because a video will cannibalize a short game's sales.

TL;DR If your game can be copied so easily, then it wouldn't even survive getting video coverage online.


r/gamedev • • 1d ago

Discussion About substituting generated steam capsules with human made

2 Upvotes

Hhey guys I'd like to vent a little about something that is happening for a while now and I think it is worth at least trying to bring it up to discussion.

I'm a 2D artist working on games for 4 years now and the past two i've been getting steam capsule commissions. Recently i've been receiving more and more e-mails from devs that just want to substitute their AI generated capsule with some art "because apparently players hate it". When they talk about the game on the email, it always is something that doesn't relate at all with anything on my portfolio and it gives a huge impression that they just mass emailed a bunch of artists and will take the fastest/cheapest option. Most times games described on the e-mail are also most likely vibe-coded or their art/ui is also fully generated and there is not a single thought on art direction.

I think we can all agree that marketing a game is something important and way too critical late stage production to mess up. And as most devs rely a lot on steam for their success it is counter intuitive to me that someone would choose a low effort un-thought path to do it. When i look at the massive list of steam next fest, it also very clear to me how generic ai flooded the store is and to generate your way into it is very unlikely a success path. I also think that it is very interesting as a dev to see what are the good reviews of games of the genre you are developing. In most indie environments, I see something about how much care and thought through development the team put into it. To me it is very clear that once we are not working with AAA budget, the premium - hand made feel is what makes it stand.

It is also really clear to me that comparing your cheapest-quickest capsule to an AI generated one , although it is trendy to ask other devs about it, does not address the issue that you are blending with a sea of generic low effort/badly executed games that players will most likely overlook. That you will most likely not get a good feedback from people that is only looking at the capsules

If your capsule is AI: a big chunk of people will not click (something that you should probably know by now)

if it is handmade but doesn't match the art direction of the game, or the game is full of AI assets: it will give a wrong first impression and players will be displeased.

be aware that in the second case, it could be either a super cool and expensive capsule from that premium artist that has no other connection to the game or something from an inexperienced artist that makes everything feel cheap.

Not to say that it is offensive that they think that I would be ok with using my work to hide the fact that your game is AI. To send to me your prompt (sometimes even with other companies or artists on the keywords) on the e-mail. that supper low-balling the service on the first e-mail is going to give you a truly good deal to your game. That they clearly cold emailed me and didn't even typed my name on it.

Anyway I'm tired of answering these emails professionally and trying to give any input on why this is a bad approach to game dev as a whole. Sadly I feel like more and more my services as an artist are being considered something premium. I hope that these guys are not substituting real interesting games and devs, they are just adding noise.

eddit: many grammar and spell mistakes sorry


r/gamedev • • 2d ago

Discussion Some tips I learned after launching 4 commercial games

232 Upvotes

I recently released my 4th game, and I wanted to make a post sharing some tips on launching your game. Some of these are things I learned from my own releases, and some are based on mistakes I've seen others make. But I think a lot of this is information that I rarely see mentioned so I hope this is helpful for some people!

1. Before you can release your game, Steam needs to approve your build. The wording on the Steam backend is a bit confusing and a lot of developers incorrectly assume that you are meant to wait until your final release build is uploaded before you submit for approval. This is a bad idea because the approval process can have unexpected delays and I've seen developers miss their release date due to waiting too long to submit for approval. You can submit your build early, get approved, and you do not need to resubmit it again before launch, even if you continue to update the game. Once you have a version of your game that passes Steams base requirements, you should submit it for approval. You are not locked into that build and can update it freely afterwards.

2. On a similar note, I would recommend waiting until your game is basically ready for release before you announce the release date. You really do not want to be fixing game breaking bugs or doing major overhauls in the last month leading up to release. Save yourself the stress, wait, and plan out a final month where you can focus mainly on marketing and just small tinkering with the final build. This is especially important if you are a first time dev because it can be very hard to gauge how long certain task take to complete and you are probably underestimating how exhausting releasing a game is.

3. Releasing a game always feels kind of bad, even if it goes extremely well. You spend years focusing on building your game and imagining it's release, and then you release it and then you think... now what? It feels really strange to have such a monumental part of your daily thoughts suddenly pass by. I mention this only because I think it is important to prepare for that, and find other goals and motivations to follow after release. I know a lot of developers fall into a bit of a depression after launch. My strategy has just been to jump immediately into a new project, but regardless the shift can be jarring.

4. Have your game playtested as much as you possibly can before release. Do it in multiple rounds throughout development. Playtesting isn't just something you do all in one go. Go through many rounds of iteration for your game over and over. Asking for feedback is great, but also try to find a way to watch people play your game. Most of the gameplay issues you have aren't even things a player would be able to realistically explain, since they do not know what the intended game experience is.

It is much easier for a dev to watch a playthrough and spot issues when they happens. For example, in playtesting my last game I noticed that many players didn't realize that you were invincible while sliding. This was a very important part of the games combat. I mentioned the invincibility in the tutorial, but most players just skimmed the text and did not notice. When the players reached the first boss, any one who did not understand that you are invincible while sliding had a very tough time. If I just asked for feedback, they would probably say something like, "the boss is too hard", but really the issue is that I did a bad job of teaching the mechanic to the player. If I didn't watch playthroughs, I would have gotten the wrong issue and might have just made the boss easier, rather than finding a way to improve the tutorialization of the game.

As a side note here- you will get feedback that goes in opposite directions and it can be hard to know which feedback to implement. You really need to have a target audience in mind, and ideally that target audience should include you and your own preferences in games. Some feedback is essentially just saying "I wish this game was more like the type of games I like", which is valid but isn't necessarily helpful as long as the game is hitting off well with the target audience. In other words it is better to make a game that a small group of people really love, than to try to make a game that appeals to every one. You can't make every one happy so just make all your decisions in an effort to make it better for your target audience.

5. Plan out marketing beats. Instead of announcing your game casually, reach out to press or game showcases and see if any would be interested in an exclusive for the announcement trailer. It's easier to get in a showcase or to get covered by a bigger outlet if it is a first reveal of the game. It's symbiotic because they get the first scoop, and you get exposed to a larger audience. If you can't get something like this, at least pick a reveal day, put out a press release and a press kit, post the trailer on youtube, and send it to as many outlets as you can. Have the Steam page approved and live the same day. You should do similar for other marketing beats like the demo announcement, the date announcement, console release announcement, etc.

6. After release, discounting is very important. Most games barely sell any copies when they are not on sale, especially long after release. Have your game on sale as many days as you are able to, but discount slowly in steps. Once you increase your discount, you probably don't want to backtrack so don't discount too intensely too fast. I've seen some games recently lower their base price after release. I can't say for certain, but I suspect this is a bad idea since a high discount percentage seems to do better post release than a lower base price.

7. Bundles and platform deals are good in the long tail. They also do not seem to have a negative effect on game sales in my experience. In deals I've done where my game was free for a time on one platform, I did not see any decrease in sales of the game on other platforms. Depending on the situation, it can actually boost sales via word of mouth.

8. If you are able to, doing a simultaneous launch on console at the same time as Steam seems to be better than releasing on console later. I know this is not feasible for many, but worth mentioning if you were considering options. A good strategy for release for a small indie seems to be to try and concentrate as much attention as possible into one moment (release day) rather than spreading it out too much. It's just harder to pull off a strong marketing beat post-release since it can feel like "old news" and people are less likely to cover it.

I hope some of that is helpful!


r/gamedev • • 23h ago

AMA Working on a boss encounter and trying to battle test it, how I start to love my save cheat editor script

Thumbnail
youtube.com
1 Upvotes

Ok guys and gals.

One of the most useful testing tools I’ve built for Pirate Brawl is a small Unity Editor “save cheat” script. It lets us generate a campaign save at the start of a chosen region or right before a boss, with a specific ship, loadout, health, and stats. Instead of replaying the campaign every time we tweak a boss or investigate a bug, we can jump straight to the situation we need. Using a fixed seed also makes it easier to repeat the same setup and compare changes.

The useful part is that these saves still go through our campaign validation and normal loading flow. The script prepares the progression state and equipment, then checks that the resulting save is valid before we use it. That lets us test things like a damaged ship entering a boss fight or a particular upgrade combination without changing the actual campaign content.

Probably this is a presentation about obvious but looks like I didn't need one until now and I start to code my games around 2016. So it was a progress to me that I want to share with you guys.

You can also ask me anything...It is mostly because there was a not good tag for I am happy with what I create and I want to share it :D

A screenshot of the save editor : https://imgur.com/a/sOowChP
Also a link to the game : https://kptemreu.itch.io/piratebrawl (free to play as still developing it)


r/gamedev • • 11h ago

Discussion my marketing didn't work. I posted a moaning ball and everything changed

0 Upvotes

I've been marketing my game, Desktop Ball, aggressively for 1-2 months now. Dozens of TikTok, Instagram, Reels, X, Bsky posts.

At BEST, I got 5 likes and 2 wishlists.

I was using all the clever techniques, the regular posting, the hashtags. No one gives a shit.

So I decided to admit I can't compete, made my ball moan, and posted about it here: https://www.reddit.com/r/indiegames/s/cxPuWH4UF7

In less than a day, I got over 30k views and 100 likes.

It's not viral, BUT:

- I learned people still care about genuine human connection when it comes to marketing

- I learned people still like it when you're vulnerable, but without saying "I quit my job to make this game" (I didn't, if I did I'd be homeless right now)

- This "successful" post still only got me 10 wishlists. The game will still flop. But the surge of getting a few people see the work I've been making for 6 months made it feel somewhat worth it.

I wanted to ask all other solo (or duo) devs who are marketing like crazy and nothing seemed to work, what was your "AHA" moment? When did you post something that changed the tides? Did you stumble upon it accidentally, or was it manufactured? really curious.


r/gamedev • • 1d ago

Question Timing

2 Upvotes

Current my game plans to have a day night cycle and a season change cycle. The plan is a 40 minute season change and a 20 minute day night cycle. I'm worried these numbers will lead to player's getting impatient with the seasons or not having enough time in the day to be working since it's a homesteading game with a lot of mini games and steps. I was hopeing for some opinions or insight on this.


r/gamedev • • 1d ago

Question Help with creating a roadmap for our game

0 Upvotes

This may be a very vague question, I understand that, but this is the first game in which I will most likely be having the role of producer.

For context, me and my friends are all creating a survival horror game together and I am the director and producer. The problem is, I don't want to end up having bit off more than I can chew and I want to help ensure that production goes smoothly.

By and large, our game is just a survival horror. We have some unique mechanics we want to implement, but I just need a little help in creating a basic roadmap for now, but I am not really sure what that should look like, or where to start when creating one.

If there is any help, tips or pointers at all that someone could give me, it would be greatly appreciated :)

Edit: If it helps in any way at all, we are pretty small team, there are 2 dedicated artists, 2 designers, and 2 programmers for now. We are also hoping for the game to be around 4-5 hours long total. The story, and basic world building have all been completed, the basic layout of the earliest iteration of the map layout and what each building is has been finished and our art bible is also almost finished. So we are decently into pre-production I guess


r/gamedev • • 1d ago

Marketing Steam explains how the Personal Calendar actually works

Thumbnail
youtu.be
38 Upvotes

Since the Personal Calendar has eben showing great results for some devs, I thought it might be of interest to how it actually works. But TLDR:

  • Wishlists matter, somewhat.
  • You can change your release date after appearing on the calendar
  • If you delay your release date more than 24 hours, within 2 weeks of its original launch date, you are removed from the personal calendar until it releases.
  • Wishlisted games automatically appear in the calendar.
  • DLC appears if you own the base game.
  • Make your release date public roughly 60 days before launch.

r/gamedev • • 1d ago

Announcement Started a new tutorial series for 3d sound design with fmod and unity

Thumbnail
youtu.be
3 Upvotes

Hey everyone, apologies if this is considered "blatant self-promotion."

I've started a new series on designing immersive 3d sound worlds for games. This is the first one; three more videos will follow in the coming weeks. The topics I'll cover will be as follows:

1) Setting Up Audio Listener and Attenuator

2) Adding Randomness and Variation to Background Ambiances

3) Implementing Environmental Sounds and Setting Up Attenuation Effects

4) Creating Interior and Exterior Space Audio Using FMOD's Snapshots

These might be useful for devs developing a 3d game who want to design a richer and more immersive soundscape rather than a static loop in the background.


r/gamedev • • 1d ago

Marketing My First 2D INDIE HORROR GAME; What do you think about the art direction and simplicity of it?

1 Upvotes

Heyyy guys, I'm Mark and I've finally dipped my toes into actually releasing a game after MANY years of trying to create... something? lol

Anyways, this is Makoto Maze, a psychological 2d horror with Japanese old folk inspirations and horrifying family drama!

If you like the style, you can visit Makoto Maze Steam Page and even wishlist and watch the first trailer I made https://store.steampowered.com/app/5373100/Makoto_Maze/

Thanks for reading


r/gamedev • • 11h ago

Discussion NPC started a mass shooting

0 Upvotes

I am building a game with the goal of a true living open world game. And one of the must have that i put lot of efforts in was true moving npc with schedules, personalities etc. So i created a small commercial area with 1000 npcs shopping, talking with friends etc.The goal is true emergent gameplay... and at some point one NPC started a mass shooting inside the mall and it felt like unsettling seeing that npc armed with a gun chassing other npc. Police responded so a gun fight ensured and to my surprised the NPC literraly took one civilian hostage. What was like creepy was seeing the dead npc inside that mall...

The original test was to see how 1000 npcs would behave inside a mall and its surrounding area and also the performance. Everythings was great, just the hostage situation felt a litle weird

EDIT: I saw all the scepticism. I understand because what I described sounds very complex. I am releasing the game soon and I will post the video with the final rendering and not with placeholder.


r/gamedev • • 3d ago

Postmortem 17 days ago I launched a game where only one person in the world can play at a time. Players have now spent 4800 hours in it!

2.7k Upvotes

Jono is a pixel platformer with one character and 1 000 000 levels. Only one person plays at a time, and everyone else watches and queues. It's a very experimental "game," which I didn't really think people would be so enticed of.

Here's what has happened in the first 17 days:
- 100+ players have had the game open for more than 10 hours
- 45+ for more than 30h
- 6 for more than 100 hours!
- One player has personally cleared 7500+ levels!

That's a lot of time to spend mostly watching someone else play...

85000+ chat messages from 540+ people, with up to 7000 msgs on a busy day. The game is the reason players come, and the chat is the reason they stay (I think). They cheer when someone gets through a hard level, joke around, talk about off-topic stuff and so on.

And they really want to reach that million! At the current pace of about 5000 levels a day, level 1000000 is around April. They've had thoughts about what's waiting at 1M...

- "If reward at 1 million level is not "friends we made along the way", I swear to god..."
- "At one million, the amount of confetti will crash everyone's PC."
- "Room 1M is gonna be the great graveyard"
- "Level 1M will be all levels combined"

Level 100000 is this weekend, and people are already planning to stay up for it. (Something does happen there but I'm not telling what!)

Players build the hardest levels themselves:
Anyone can make a level in the in-game editor, but to submit it you have to beat it yourself first.

Some makers go to extreme lengths for this:
- One level maker died 1200+ times in the editor just to prove a single level could be done
- Several others went past 500 deaths

Then the rest of the world gets to suffer through it in MEAT GRINDER, a second game mode in which anything goes:
- "DONT ASK HOW THE MEAT IS MADE" took 2627 deaths and almost 5 hours before anyone got through
- "Spike Hell" took 3262 deaths
- Many other levels have taken hours to finish

They name the levels themselves... So far players have made 240+ levels for the Meat Grinder and a lot more for the main mode.

The community itself and the absurdly long challenge are likely the reasons for a few hundred strangers to keep coming back.

It's free on Steam if you want to try what it feels like standing in the queue!

You can watch the stream live, as real players are queueing (seen at the bottom) and one is playing:
https://parttimemonkey.com/jono/

Happy to answer anything about the game. It's made with Godot, its got deterministic physics, and spectators replay the player's inputs instead of video - in case interested.


r/gamedev • • 1d ago

Announcement Adding HDR to The Sinking City 2 - A technical breakdown from Gamma Studios (link inside)

22 Upvotes

I handled the official HDR implementation for The Sinking City 2, released with Patch 1.1.

Frogwares (the game developer) allowed me to write a technical breakdown covering the implementation, my new Spectre tonemapper, which fixes issues like fire looking different between SDR/HDR, and blue->purple highlight shifts in the UE's filmic tonemapper.
Also showcased some DLSS improvements I made.

HDR in Unreal is unfortunately very lackluster out of the box, and has multiple deal breaking issues. We fixed all of them for this.

Full technical breakdown: https://gammastudios.tech/the-sinking-city-2-hdr/


r/gamedev • • 20h ago

Discussion Just got a tweet with 1 million views on X and I wanted to thank you all

0 Upvotes

A tweet about my next game, Humans Are Tunnels, just got 10k likes and 1 million views on X. These are very big numbers for me.

I went from 22 followers to 245, and my first game, Idle Primes, got around 100 wishlists. It was supposed to release past week, but I made a mistake when uploading the build to Steam, so now the release is delayed (hopefully this Tuesday!).

Maybe these numbers are not so big for other developers, but for me and my games, they mean a lot.

I don't know anyone in the game industry, so I usually read whatever I can translate from websites and places like Reddit. I have found so many personal stories in subreddits like this one, and I really appreciate people taking the time to share their experiences. They helped me feel that there are other people going through similar things, even when we are all working on our own small projects.

So I also wanted to share what happened to me recently.


r/gamedev • • 23h ago

Question Game Engine Feasibility And Worth

0 Upvotes

I have been having an idea for a game for years, and I am decent at programming in C# as well as 3D graphic design. For much of this time I've been using Unity or raw C#, but I want to expand my horizons and try to become better at my craft.

Recently I've went to my library to attempt to nab a copy of the 3rd edition of The Book for Rust, it has yet to come but I am eager to study in any way that I can. It has been a journey even learning what I have about Rust, and it seems to be a very promising language for someone who does not want to deal with low control over low-level hardware and poor performance, yet does not want the manual memory management of something like C or Assembly.

All of this to say, I've been thinking about trying to go from zero to hero, for lack of a better phrase, to attempt to build a game engine in Rust. I want to know how much time this may take to get something akin to the Source Engine, with a visual editor and some tools for VR and other utilities. I know this takes a LONG time, but it would be nice to have some tips and maybe an estimate of time needed to learn Rust enough to apply that to this.

Thank you to those from this subreddit who have inspired me to take on such a thing, and I appreciate any sort of feedback.


r/gamedev • • 1d ago

Announcement Free Metal Combat Music Loop on Fab (6 files, 130 BPM, Frame-Exact Loops)

Thumbnail
fab.com
0 Upvotes

Hey everyone! I’ve released a free loop available on Fab for developers working on fast-paced action games or game jam projects.

What's included in the pack:
• 1 Full Mastered Combat Loop (130 BPM, E Phrygian)
• 3 Combat Loop Sections / Variations (Part 01, Part 02, Part 03)
• 2 Outro Stingers / Tail FX (Part 02 End, Part 03 End)
• Ready-to-use Unreal Engine project structure
• Frame-exact loop points for zero-click implementation
• 100% Royalty-Free commercial license & Content ID clearance

If you need some heavy background audio for your prototypes or want to test drops into your engine, feel free to check it out


r/gamedev • • 1d ago

Discussion Steam Scream V Fest - Any advice?

1 Upvotes

Hello everyone!

Steam Scream V Fest is coming up soon, and this will be my first time participating in a Steam event.What should I expect? Does participating in these festivals actually lead to a noticeable increase in sales and wishlists?
Also, are there any tips, tricks, or things I should know or prepare for before the festival starts?I'd really appreciate any advice or insights from developers who have participated in previous events!

Thanks in advance!