In addition to what @xZylter said, I can show an example you can work on. In the toolbox, if you type smooth camera, you’ll find a local script called “Smooth First Person Camera [bundle]”, published by @DuruTeru. Despite being last updated in 2020 and containing some outdated code combined with some bad practices, the heart of the code is still very relevant. I’ve successfully written efficient but similar code for smooth camera before.
As xZylter also mentioned, you bind the camera to RenderStep (RunService:BindToRenderStep()) and use UIS.InputChanged, which passes inputObject.Delta. The delta may be modified and used to construct a new camera CFrame.
Seeing that you take bad practices into account (including modifying transparency of all character parts and getting UserInputService each frame prior to screen drawing), the logic still applies, no matter if you’re creating a first person or over the shoulder camera.
The angle calculation part may seem confusing at first, but you’ll see that it can be broken into smaller segments. Modify input delta, construct new angle X (up-down), construct new angle Y (left-right), create new CFrame, multiply it by head’s position, multiply by the custom offset. Tada!