Like @Lambdarevolution said, you’d save resources by using bytes. Each character in a string is a byte by itself (plus the null one at the end to signal the end of the string). Besides the processing to process the strings, convert from/to numbers etc.
But, if you still want to use strings, replace ReadString with ReadLine. If you just ReadString, it’ll read whatever is in the serial buffer, and you’ll likely get half strings many times. Because Unreal and the Arduino are not in sync. So you might get things like “modev:outp” in one frame and “utValueeol” on the next frame, because Unreal read while Arduino was still sending. Whereas if you use ReadLine, the reading will only end once it gets a line end, which you’re sending with Serial.println. It will freeze if Arduino takes too long to send another line end, so keep doing that in the loop as fast as possible.
Another thing you will want to do is use Flush after every ReadLine, to clear the serial buffer before the next frame’s ReadLine. Otherwise, if Arduino is sending data faster than Unreal is reading, as each ReadLine stops in the next line end, it will potentially leave many other strings in the serial buffer, and on each ReadLine you’d be reading only one group of commands, which would not be the latest one.