GDC was a great refresh for the whole team. Combing back from San Francisco, the team worked very hard to optimize the user experience for the playtest day. Designers rework the physics logics for hits, allowing the actual strength of swinging to be better reflected by the ball’s velocity. Programmers were dedicated in fixing high-priority bugs as well as adding sound and haptic feedback to the game.
Teleport
The first thing we fixed was the teleport since the position player teleported to greatly influences the feeling of the hits. We realized through internal playtesting that our teleport system can occasionally be quite off and inconsistent – sometimes the ball is too close from the player and sometimes it’s too far away.
That is basically due to the design of the teleport system. Since we need to teleport the other player at the moment the hit happens, we must calculate the ball’s whole trajectory at that moment and get a estimated landing point of the ball. Having got the landing position, we simply added an offset to that point for the opposing player to be teleported to.
However, the ball’s movement after the bounce could vary greatly according the direction and magnitude of the ball’s velocity after hits. Therefore, a fixed offset for teleport is simply impossible to accommodate for all hitting conditions. We finally fix this by updating the offset by scaling it by the magnitude of the ball’s velocity after bounce.
‘Vertical Ball’
This is a internal term we used to describe a bug we found where the ball will only move vertically after the bounce and resulting in the player having to reach really hard for the ball. We spent hours debugging this problem, only to find out that the default collision API Unity provides are not called even the collision is performed.
We ended up abandoning the Unity API and wrote a costumed ground collision detection on our own. We fixed the vertical ball problem in this way, and it also grants us with more flexibility on the decay of balls’ velocity after the bounce.
Physics
Another urging issue is with the hitting. We realized that it is too easy to hit the ball too far away across the base line even though there wasn’t much strength applied in the real world.
We addressed this by changing the mapping function between the controller’s velocity in real world and the ball’s outgoing velocity. We used to use a linear mapping between them, so that even the controller is moving with a really small speed, the ball goes out with the minimum outgoing velocity.
We changed the linear mapping to a segmented quadratic mapping and also lowered the minimum outgoing speed, so that when the controller moves really slow, the ball move accordingly. And the player also needs to swing it really hard to reach the maximum speed.
Playtest Day
Finally, we were able to make a satisfying build by the Friday evening. Valerie also helped sorting out a playtest flow for every session, as well as composing a survey to better quantify the feedback.