An Interview With Victor Careil, a Creator of the Voxel Plugin for Unreal Engine
In this interview, we talk to Victor Careil about the Voxel Plugin and Victor’s experience with ReSharper C++ for Unreal Engine development.
Hi Victor, can you please tell us a bit more about yourself and your software development experience?
Hi! I’m a software developer with a passion for computer graphics and video game development. I’ve been working with C++ in Unreal Engine for a bit more than four years now. I attach a great importance to dev workflows and iteration times, which is one of the reasons I use ReSharper.
Your main project is the Voxel plugin. What is the main benefit game developers gain from using it?
Voxels give developers a lot more design freedom. You can make overhangs, caves, large planets, destructible terrain, Minecraft-like games, etc. Our goal with the Voxel Plugin is to democratize that technology so it’s easily accessible to the largest number of developers.
Are you working on it alone, or is there some team helping you?
We’re now a team of three, but I’m the only programmer.
Which technologies are you using to build Voxel?
It’s built on top of Unreal with a lot of custom, low-level C++. The bulk of the development is done through Visual Studio with ReSharper and Entrian Source Search.
What does your typical development flow look like? How is the project structured?
I usually develop the plugin in a host test project. I make changes in Visual Studio, start Unreal from there, and iterate a bit with Live Coding – then repeat.
Why and when did you decide to try ReSharper C++?
I first tried ReSharper a few years ago. I was using Visual Assist at the time, but its understanding of C++ was too limited for my liking. ReSharper gave many useful additional insights through inspections, and fully supported C++. It was sadly too slow at the time to be really used, but that was improved a lot in following updates.
What’s the main benefit of using the ReSharper C++ extension compared to vanilla Visual Studio?
The biggest is probably speed – being able to navigate code instantly is critical. It’s impossible to evaluate the difference, but if I had to give a number I’d say I’m 10 times as productive when I use ReSharper as when I use vanilla Visual Studio.
Which features or workflows are essential for you on a daily basis?
Navigation, inspections, inline hints, quick-fixes, and refactorings are likely my top features.
Navigation lets you navigate the code extremely quickly: going to a function definition, finding a type, finding usages of a function or of a member. In a code base as large as Unreal’s, this is a critical part of my dev workflow.
Inspections let you spot errors while you’re writing code. They will for instance gray out an unused variable, making copy-paste errors obvious. This can save a ridiculous amount of time: you catch the error while writing the code, not during debugging. They can also warn about uninitialized variables (but in a smart, non-intrusive way), missing virtual destructors, invalid template usages (e.g. ones that would compile on MSVC but not clang).
Inlay hints make it easier to read code and catch potential errors. For example, parameter names will be shown inline in function calls, but only if the passed expression is different from the argument. That way, if you’re passing PositionX to a function that takes a PositionY argument, ReSharper will explicitly tell you “PositionX is passed as PositionY”, forcing you to mentally check that it’s what you want to do.
Quick-fixes make it easy to fix errors and improve code quality. The ones I use the most are likely Specify type explicitly, which lets you replace any auto with the full type, and Add const, which shows up for all variables with no write access.
Finally, refactorings let you safely and quickly rename anything in your codebase. This is a must for quickly iterating on new designs.
Is there anything in ReSharper C++ you especially love in the context of Unreal Engine and game development?
Having all the Unreal Engine–specific support is great: support for reflection specifiers (
UPROPERTY etc), the “object pointer stored without
UPROPERTY()” inspection, the automatic Super calls, the naming convention tips, etc.
You are participating in the Rider for Unreal Engine Public Preview, aren’t you? How do you like Rider for your Voxel project?
I’ve tried Rider a few times, and it’s great! In my case, however, making the switch from the Visual Studio + ReSharper workflow proved to be too big of a change for too little benefit – especially with Visual Studio 2022 being 64-bit, making ReSharper faster than ever.
Is there any advice you can give to teams and developers starting out with ReSharper C++ in game development or in general?
If you’re starting out with Unreal Engine, give Rider for Unreal Engine a try first :)
More seriously, I’d recommend making yourself familiar with all the ReSharper features using their website and online docs – if only to be aware of their existence. It’s a small time investment compared to all the time you’ll end up saving.
To get familiar with shortcuts, you can press Left Ctrl 3 times to get a list of all the relevant ReSharper shortcuts. This was a great help when starting up.
Lastly, don’t ever hesitate to reach out to JetBrains if you have any issue with ReSharper. The dev team is amazing and tends to fix issues very quickly :)
Subscribe to Blog updates
Thanks, we've got you!
ReSharper C++ 2023.2: Safe Delete Refactoring, AI Assistant, New C++23 and C++20 Features
New release brings the Safe Delete refactoring, support for several new C++20 and C++23 features, ReSharper’s AI Assistant, and more.
ReSharper C++ 2023.1: Call Tracking, Macro Expansion Preview, and Support for C++23 Features
ReSharper C++ 2023.1 brings updates for C++20 and C++23 features, and also introduces Call tracking for incoming calls and macro substitution previews in tooltips and Quick Documentation popups.
ReSharper C++ 2022.3: C++20 Modules and Clang-Format Integration
ReSharper C++ 2022.3 introduces experimental support for C++20 modules and provides seamless integration with clang-format.