Paras Chaudhary talked about the development of the adventure indie project Raji, game physics, animation, character movements and more.
80lv: Paras, we’ve actually covered Raji quite some time ago. Could you tell us in short how was the game going? What is the current status and where are you with the game in general?
The previous article extensively covered the process that went behind in creating the environments for the playable demo we released last year. Ever since then though, the road has been rough for us and Raji. After an unsuccessful Kickstarter campaign, we have been moving along gently with the development, weathering personal, emotional and financial challenges. The project got a second wind in the form of the Unreal Dev Grant in July and getting featured in Microsoft’s E3 conference opened up some potential avenues for the future of the game. The art style of the game had already been established and validated by the community through their overwhelmingly positive feedback. So, after getting some wind in our sails, we geared up to work on elevating the gameplay up to that level. For the past few months, we have been working on the movement and platforming mechanics for the playable character.
80lv: Let’s discuss a little the traversal experiments you’re working on. How do you approach traversable planes and what are the ways you’re actually working with them in UE4?
It all started with the feedback we got from the community on the playable demo. Some people expressed concern about the clunkiness of basic movements of the character. That made us think of the possibility of introducing some fluidity to her movement. What started off as the implementation of some small platforming mechanics eventually led to the addition of a whole new dimension of verticality in the level design. During the lull period in the project earlier this year, the team would brainstorm about the movement capabilities that could be added to her kit. A big part of our process included an exploration of relevant references. Some of them included analyzing the Prince of Persia series and Middle-earth: Shadow of war, and breaking down parkour videos of free runners on YouTube. Without revealing too much, I can say that we narrowed down her traversing capabilities based on the acrobatic background of the character. When it comes to implementing a capability in the engine, I design a brief pseudo-code of how it is supposed to work. As of now, her movement capabilities rely heavily on line and sphere traces, and root motion animations.
80lv: Could you talk about the way you’ve started implementing wall-running in your project? What way does the gravity and physics work here?
The wall-run mechanic uses root motion for movement of the character. The speed, distance, and trajectory, all are determined from the animation made in Maya. The distance from which the wall-run can be triggered is predetermined from the animation. In the engine, I use a line trace to check if the character is close enough to perform the wall-run. Once triggered, the character gets oriented towards the wall at the appropriate time through anim notifies. The default movement input is not at work while wall-running is active. Because the character takes an upward leap when starting the wall-run, the root of the skeletal mesh needs to be animated in Z also. The only way to make sure that UE4 processes root motion data on the Z-axis is to change the movement mode of the CharacterMovement component to “Flying”. Doing so automatically makes the character ignore gravity. At the end of the wall-run animation, The movement mode is changed to “Walking” through another anim notify, and the character starts getting affected by gravity once again.
80lv: You’ve created amazing animation, but before we start discussing it we’d like to learn how the clinging system works. How does the character find the corner she can cling to, how does the jumping and traversing from poles and planes work?
The ledge system was actually made possible through the help of some fellow developers in the UE4 community. I followed a video series by Medel Design on YouTube. Although I did have to heavily modify the implementation to suit our project, the tutorial helped me to understand the core logic of how the ledge system actually functions. I am taking advantage of custom collision object types to detect ledges. The line traces that go out as a part of this system detect only the meshes that are of a specific collision type. There are multiple traces in action which provide me with information like the height of the ledge and the horizontal distance from the character. The poles essentially follow the same logic with a few minor changes. The jump animation is the odd-one-out compared to the rest of them. The jump does not use root motion. Instead, the character is launched using physical force which results in the character not following a predefined path set by root motion. This allows for a sense of tension and uncertainty when the player makes the leap from one plane (or pole) to another.
80lv: Let’s move to the animation. What types of animations have you prepared for traversing? How do you use them? What is your animation workflow? Do you buy something pre-made or do you use your own animation production techniques?
We work with conventional 30 fps keyframe animations. Most of the animations for traversal systems use root motion and are used as a single piece from start to end. The jump animation is an exception which does not follow root motion and is cut in three parts – the anticipation, the fall loop, and the land. In the engine, they are implemented as montages. In addition to this, there are walk cycles made for movement on poles and ledges. All of the assets we are using in the project are made in-house. The production of an animation asset starts with a discussion between me (programmer), Avichal (game and level designer) and Himanshu (animator). We try to get an all-round understanding of the references and the feeling that is required from the concerned animation. After we feel that all of us are on the same page, Himanshu gets to work. He often starts with some 2D sketches of the key poses and moves on to recreate them in Maya. We first work towards getting the movement timing correct. This results in a brief back and forth between me and him. I keep testing the different iterations in the engine until the results are satisfactory. Once this is established, Himanshu moves on to the aesthetic element of the animation, which follows a similar iterative process.
80lv: How do you usually test your traversal systems?
The most essential baseline that we have set for a movement-related system is fluidity. The system, when triggered, should transition from basic movement seamlessly. There cannot be any friction here, otherwise, the feeling of everything happening in one single motion gets lost. Since the wall-run, the jump and the ledge are isolated systems, the sweetness of timing comes from the player pressing the button at the right time. To achieve this, the animations go through a few iterations in Maya to ensure that controls feel responsive. In the engine, we focus on making the animation transitions smooth by experimenting with different blend curves and values. After an iteration of a system is implemented, we first test it out in the ideal scenario. If we’re satisfied with the results, we stress test it trying to make the system do things it was not originally designed to do. This includes things like pushing the values to their extremes and combining a system with another out of curiosity. More often than not, this leads to some interesting revelations about the system which we did not comprehend before, resulting in a more vibrant character movement kit altogether. Even now, when internally playtesting the mechanics, we come across new possibilities.
80lv: How do you figure out the look and feel of the upcoming animation?
When coming up with ideas for animations, we try to stay true to the acrobatic background of the character. A good brainstorming session, with inputs from everyone in the team, ensures we have a common vision moving ahead. This process also helps us in finding the relevant references for Himanshu to use. We do refer to the animations we did previously to ensure that the upcoming ones follow a similar style.