Homebrew First Attempt at 3DS Unity Development & Some Tips and Tricks I've Discovered

  • Thread starter Thread starter Cgreen58
  • Start date Start date
  • Views Views 1,392
  • Replies Replies 3
  • Likes Likes 4

Cgreen58

New Member
Newbie
Joined
Jan 13, 2026
Messages
1
Reaction score
4
Trophies
0
Age
24
XP
14
Country
United States
Hi everyone,
First post here!
I just recently modded my old, forgotten 3DS, and I always wondered how hard development would be for this platform. Let me say, it is not easy with everything being super depreciated, and, the lack of documentation. I hap-haphazardly stumbled through input controls, shaders and rendering, and I got a super WIP prototype, that builds, and plays!

If anyone can provide any documentation or anything else regarding input controls, shaders and more that would be amazing! Let me know what you think of this!

And, to help others on the 3DS journey in 2026, here are some shaders I made to get you started and tips I've learned.


First, forget all of the default shaders materials have. They either don't work, crash your 3DS/game, or are a buggy mess. You will need to code your own. Here are some very simple ones I've made or found online. If your game is crashing when attempting to run in an emulator, what I have found is its most likely because:

1. You have not set publisher settings in the Player Section
2. You have materials using Built-In Shaders
3. You have sprites that bigger than 512x512 trying to be displayed
(Sprites even from a spritesheet thats over 512x512 will still crash the game, meaning a 32x32 sprite, from a 2048x2048 spritesheet will crash the 3DS, even if its just a 32x32 sprite on its own!)


*All of this information is based on my experience, and their may be workarounds or other fixes that may make it possible for these to not crash the game, however, it's what worked for me after hours of trial and error!

Shaders
Code:
Shader "N3DS/Unlit/Solid Color 3D"
{
    Properties
    {
        _Color("Main Color", Color) = (1,1,1,1)
    }
    SubShader
    {
        Tags { "Queue"="Geometry" "RenderType"="Opaque" }
       
        Pass
        {
            Cull Back
            ZWrite On
            ZTest LEqual
           
            Color[_Color]
        }
    }
}
Code:
Shader "N3DS/Unlit/Diffuse + Alpha 32 Bit 3D"
{
    Properties
    {
        _Color("Main Color", Color) = (1,1,1,1)
        _MainTex("Diffuse (RGB) Alpha (A)", 2D) = "white" {}
    }
    SubShader
    {
        Tags { "Queue"="Geometry" "RenderType"="Opaque" }
       
        Pass
        {
            Cull Back
            ZWrite On
            ZTest LEqual
           
            SetTexture[_MainTex]
            {
                constantColor[_Color]
                combine constant * texture
            }
        }
    }
}
Code:
Shader "N3DS/GUI/3DSFont"
{
    Properties
    {
        _MainTex ("Font Texture", 2D) = "white" {}
        _Color ("Text Color", Color) = (1,1,1,1)
    }
 
    SubShader
    {
 
        Tags{"QUEUE" = "Transparent" "IGNOREPROJECTOR" = "true" "RenderType" = "Transparent" }

        ZWrite Off
        Lighting Off
        Fog { Mode Off }

        Blend SrcAlpha OneMinusSrcAlpha
 
        Pass
        {
            // Use the alpha channel of the texture to mask the color
            SetTexture[_MainTex]
            {
                   constantColor[_Color]
                   Combine texture alpha * constant
            }
           }
     }
Fallback "GUI/Text Shader"
}

And here's what I am working on, going for that Novel type of game! Having to relearn Unity 5.6 and missing out on all of the cool stuff in the newer versions really slows you down lol. It's going to be a murder horror game, where you can see your player in the lower LCD and you move and interact with the world in the Upper LCD screen.

Yazu Game
Very rudimentary, just a proof of concept that I could actually build and make something that runs on a 3DS!
testing.PNG




And some headaches I dealt with for the heck of it


wrongre.PNG


randomcolor.PNG
 
Last edited by Cgreen58,
Hi everyone,
First post here!
I just recently modded my old, forgotten 3DS, and I always wondered how hard development would be for this platform. Let me say, it is not easy with everything being super depreciated, and, the lack of documentation. I hap-haphazardly stumbled through input controls, shaders and rendering, and I got a super WIP prototype, that builds, and plays!

If anyone can provide any documentation or anything else regarding input controls, shaders and more that would be amazing! Let me know what you think of this!

And, to help others on the 3DS journey in 2026, here are some shaders I made to get you started and tips I've learned.


First, forget all of the default shaders materials have. They either don't work, crash your 3DS/game, or are a buggy mess. You will need to code your own. Here are some very simple ones I've made or found online. If your game is crashing when attempting to run in an emulator, what I have found is its most likely because:

1. You have not set publisher settings in the Player Section
2. You have materials using Built-In Shaders
3. You have sprites that bigger than 512x512 trying to be displayed
(Sprites even from a spritesheet thats over 512x512 will still crash the game, meaning a 32x32 sprite, from a 2048x2048 spritesheet will crash the 3DS, even if its just a 32x32 sprite on its own!)


*All of this information is based on my experience, and their may be workarounds or other fixes that may make it possible for these to not crash the game, however, it's what worked for me after hours of trial and error!

Shaders
Code:
Shader "N3DS/Unlit/Solid Color 3D"
{
    Properties
    {
        _Color("Main Color", Color) = (1,1,1,1)
    }
    SubShader
    {
        Tags { "Queue"="Geometry" "RenderType"="Opaque" }
     
        Pass
        {
            Cull Back
            ZWrite On
            ZTest LEqual
         
            Color[_Color]
        }
    }
}
Code:
Shader "N3DS/Unlit/Diffuse + Alpha 32 Bit 3D"
{
    Properties
    {
        _Color("Main Color", Color) = (1,1,1,1)
        _MainTex("Diffuse (RGB) Alpha (A)", 2D) = "white" {}
    }
    SubShader
    {
        Tags { "Queue"="Geometry" "RenderType"="Opaque" }
     
        Pass
        {
            Cull Back
            ZWrite On
            ZTest LEqual
         
            SetTexture[_MainTex]
            {
                constantColor[_Color]
                combine constant * texture
            }
        }
    }
}
Code:
Shader "N3DS/GUI/3DSFont"
{
    Properties
    {
        _MainTex ("Font Texture", 2D) = "white" {}
        _Color ("Text Color", Color) = (1,1,1,1)
    }
 
    SubShader
    {
 
        Tags{"QUEUE" = "Transparent" "IGNOREPROJECTOR" = "true" "RenderType" = "Transparent" }

        ZWrite Off
        Lighting Off
        Fog { Mode Off }

        Blend SrcAlpha OneMinusSrcAlpha
 
        Pass
        {
            // Use the alpha channel of the texture to mask the color
            SetTexture[_MainTex]
            {
                   constantColor[_Color]
                   Combine texture alpha * constant
            }
           }
     }
Fallback "GUI/Text Shader"
}

And here's what I am working on, going for that Novel type of game! Having to relearn Unity 5.6 and missing out on all of the cool stuff in the newer versions really slows you down lol. It's going to be a murder horror game, where you can see your player in the lower LCD and you move and interact with the world in the Upper LCD screen.

Yazu Game
Very rudimentary, just a proof of concept that I could actually build and make something that runs on a 3DS!




And some headaches I dealt with for the heck of it


View attachment 550953

View attachment 550954

Nice to see more 3ds stuff within Unity. All the stuff we make and discover is being posted here: https://gbatemp.net/threads/how-to-make-3ds-games-with-unity.441193/

Regarding size, the CTR SDK specifies a maximum of 1024x1024 in size and you can actually set textures within that size without crashing. The issue is not that but the memory allocation (you can see how much mem do your texture use in the preview). You should not use them that big anyway in a such a small screen.

1774992660943.png


Old3DS has a really small vram cache and it's quite easy to get out of memory. With new3DS you can have some 512x512 textures just fine being used on screen even without gpu instancing.

Last year I released like 4-5 fangames for N3DS and made some experimentation. From what I saw I can give some tips and tricks:

  • Outline/Shadow kills old 3ds memory but works just fine on new 3ds.
  • The "device memory" set in Player Settings is a chunk of memory used when the VRAM is overloaded (6MB for everything being rendered); and the rest is used to load, unload and store data. So sometimes you can get better results by reducing that value instead of increasing it. From my experience, 99% of the cases get WAY better by using extended memory (with rid tools or cia forgex), making that mandatory.
  • Atlas kill old 3ds vram due to how unity allocates them. Having 5 32x32 textures, is WAY better than having a 128x128 atlas with those 5 textures.
  • Use ETCS4 for compression if you are not using alpha channel. It reduces memory a lot.
  • Even if it's not specified in the documentation, I got Amiibo, PhotoSelector, Play coins, face tracking... working through native plugins. You just need to play a bit with CTR SDK.
  • SD Access is development only. No workaround at the moment...
  • We got access to web requests through the internet key. You can find it in that post (fyi).
  • The gyro's axis are different than regular as the default pose is not "standing" but upwards, so X axis is actually forward.
  • Loading empty scenes + unloading all the resources works the best when working with multiple scenes.
  • I never got asset bundles properly working on N3DS. Resources Load works perfectly but ABs give some issues...
  • You can "fake" real time shadows through planar approaches but it's not really worth even if devkitpro shows you can actually have tem though Shadow Mapping.
  • There's a theory that you should not render more than 100 objects per camera. I think it's not a matter of objects but memory anyway.
  • You can easily implement multiplayer through UDS protocol and it works online on emulator.
  • I got "modern" features to work on 3DS such as Inverse Kinematics and Cinemachine working on 3DS. Timeline gives more troubles than solutions but Slate Cutscenes works perfectly fine. You can also use Text Mesh Pro if you make a simple rendering shader (like you did).
 
Last edited by Manurocker95,

Site & Scene News

Popular threads in this forum