Nice Tutorial. I've updated to 3.0.1 and it works well. The only problem with Cinemachine is setting up player rotation on camera movement. So below is a script to handle the player rotation on camera movement. Put the script below on the player. using UnityEngine; public class PlayerRotate : MonoBehaviour { private Camera mainCamera; private void Start() { // Find the main camera in the scene mainCamera = Camera.main; } private void Update() { // Rotate the player towards the camera every frame RotatePlayerTowardsCamera(); } private void RotatePlayerTowardsCamera() { if (mainCamera != null) { Vector3 cameraForward = mainCamera.transform.forward; cameraForward.y = 0f; // Ignore the y-axis rotation if (cameraForward != Vector3.zero) { Quaternion newRotation = Quaternion.LookRotation(cameraForward); transform.rotation = newRotation; } } } }
@ElekriGames Ok, I see what is wrong. I had two projects runing I've posted the code for use with the character controller. I'll post the code for use with rigidbody tomorrow. Sorry about that....
Here's a short explanation of how to actually do this whitout needing cinemachine or other crap: Step1: create a empty game object. This is the game object you will be moving around in update and represents the target position of your camera. Step2: create a script that interpolates the position and rotation of your camera towards this empty game object, about 0.6-0.8 of the way per frame will do. Step3. Done. You are done.
cinemachine is actually good. i mean, it has effects so i wont need to make them. also has other nice features but for complex system. if you only care about camera them sure dont use cinemachine because you havee to set it up. jusst as i dont like the new input system because of the set up
a 4th step at the end could be to toggle unity's option to make the physics step happen during the render step instead of its own step. so if you get 80fps your physics is also 80fps
IMPORTANT: I found out why you might get the jittery camera even with everything working well. The issue is when you rotate the body of the player towards the camera/orientation. I don't really know why but removing this body rotation will fix the laggy camera.
However, If you need to rotate the player, and you are moving it through rigidboy, rotate it with rigidbody too. I was rotating it through transform and had the jitter. Changed to rigidbody.rotation and it worked allright
rotating camera and other stuff is always ass for me. The inspector display one number, eulerAngle display another, which makes clamping kind of a pain
This is all well and good. But I'm running into a problem. Now that I'm using Cinemachine 3.0.1, I cannot figure out how to invert the y axis of my camera movement in a way that is configurable in code. Setting an invert vector processor in the InputActions asset does invert the control, but I want something that can be changed in code (so the player can set the option they want). So I tried applying an invert vector processor override in code... But it doesn't seem to do anything (either I'm doing it wrong, or CinemachineInputAxisController is overriding it). There's also the "Gain" field in the CinemachineInputAxisController. And setting the Look Y (Tilt) Gain to 1 (rather than its default -1) DOES invert the y axis. But in the actual script, there's only one Gain float that applies to both the X and Y axis.. It's public, but I can't seem to access it anyway.. and the obvious: it's ONE value that's showing up as two values in the Inspector... So obviously there's stuff going on under the hood that's way beyond my understanding here (I've been back and forth with ChatGPT, which is not being super helpful cause it keeps giving me info that is depreciated/not applicable to Cinemachine 3.0.1 and can't seem to find the answer either).. I've also dug through the Cinemachine 3.0.1. API and there's nothing helpful there.. This is absolutely INSANE to me that this is so complicated, and now I've spent HOURS trying to figure this out when it should be simple... A public, code-accessible bool for invertYAxis (and I guess one invertXAxis for the weirdos). WHAT. The. HECK!? Someone help PLEASE!
@@rain.tamper I'm not working on this specifically anymore (it was just for a learning project), so it's not a big deal, but I am curious how you solved it, if you'd be willing to give me a brief overview. I have no idea how to send a PM on TH-cam though. Didn't even know that was a thing. :o Btw, even though you probably hate that you spent 3 days figuring this out, knowing it took you so long, makes me feel a lot better about myself. :p so thanks for that. At least now I know it's not some super simple thing I simply overlooked. :D
it depends on the unity version you're using. Cinemachine 3.x is available after Unity 2023.1 (you have to use a preview version) and 2023.2 (full release)
hi i use your solution and my rotation problem was solved but now i cant control my character because when i want to go forward when i looking right, my character wants to go left :/ the inputs arent change here is my code public class PlayerController : MonoBehaviour { [SerializeField] float moveSpeed; [SerializeField] float sensitivity = 0.1f; [SerializeField] int jumpPower; [SerializeField] Transform camTransform; Transform groundCheck; Rigidbody rb; Vector3 moveDirection; Vector2 currentRotation; private void Awake() { rb = GetComponent(); groundCheck = transform.GetChild(1); camTransform = transform.GetChild(0); } private void Start() { Cursor.lockState = CursorLockMode.Locked; } private void FixedUpdate() { rb.AddForce(new Vector2(moveDirection.x * moveSpeed, moveDirection.y * moveSpeed)); } public void OnMove(InputAction.CallbackContext context) { Vector2 inputDirection = context.ReadValue(); moveDirection = new Vector2(inputDirection.x, inputDirection.y); } public void OnJump(InputAction.CallbackContext context) { if (IsGrounded() && context.performed) { rb.AddForce(Vector3.up * jumpPower, ForceMode.Impulse); } } public void OnRotate(InputAction.CallbackContext context) { Vector2 mouseDelta = context.ReadValue(); currentRotation.x += mouseDelta.x * sensitivity; currentRotation.y -= mouseDelta.y * sensitivity; currentRotation.y = Mathf.Clamp(currentRotation.y, -90f, 90f); } private bool IsGrounded() { return Physics.CheckSphere(groundCheck.position, 0.2f); } }
get a reference to the FP Camera's Transform, say cmTransform, and multiply your inputs by cmTransform.forward or cmTransform.right depending on which input axis controls which movement axis.
So the best way to make a first person camera is to not make one and use a plugin, great job, why make a 10 minute tutorial on failed solutions if you're just gonna use a plugin.
I kinda agree with you on the use of plugins, but cinemachine, the new input system and textmeshpro are all plugins that should be in Unity from the start if we are honest these 3 plugins are so powerful and Unity itself uses them
WOW I really needed this before but I think I already fixed the gitter but still I will switch to cinemachine , I had a really complicated problem and it randomly got fixed , I had to make the camera follow the ridgidbody and I had a ridgidbody (GUN) follow a child of the camera so it was really weird got, before that I had an even weirder problem I wanted the gun as a ridgidbody to be a child of a child of the camera that moved with the player ridgidbody obviously didnt work but I made the gun not a child then worked
@5:22 the "step x" bit made it genuinely hard to follow. Please don't do it in future videos; every youtuber does self-deprecating humor in coding tutorials and it has never been funny and it always makes the concepts harder to follow. Make professional, to-the-point, videos; that's what we are here for. thanks. Otherwise great video.
Short and informative video. No long beating around the bush. Thank you!
Nice Tutorial. I've updated to 3.0.1 and it works well. The only problem with Cinemachine is setting up player rotation on camera movement. So below is a script to handle the player rotation on camera movement. Put the script below on the player.
using UnityEngine;
public class PlayerRotate : MonoBehaviour
{
private Camera mainCamera;
private void Start()
{
// Find the main camera in the scene
mainCamera = Camera.main;
}
private void Update()
{
// Rotate the player towards the camera every frame
RotatePlayerTowardsCamera();
}
private void RotatePlayerTowardsCamera()
{
if (mainCamera != null)
{
Vector3 cameraForward = mainCamera.transform.forward;
cameraForward.y = 0f; // Ignore the y-axis rotation
if (cameraForward != Vector3.zero)
{
Quaternion newRotation = Quaternion.LookRotation(cameraForward);
transform.rotation = newRotation;
}
}
}
}
if i put that script on the player, he will rotate with the camera, but the jittering is back
@ElekriGames strange it worked on mine but I'll check it incase I changed any other setting in cinemachine. Will look at it tomorrow.....
@ElekriGames Ok, I see what is wrong. I had two projects runing I've posted the code for use with the character controller. I'll post the code for use with rigidbody tomorrow. Sorry about that....
@@MichaelH-zb8gg if you could sent the code tomorrow it would be great im stuck like a week with this problem
@@Hirte2000 No prob will do...
Here's a short explanation of how to actually do this whitout needing cinemachine or other crap:
Step1: create a empty game object. This is the game object you will be moving around in update and represents the target position of your camera.
Step2: create a script that interpolates the position and rotation of your camera towards this empty game object, about 0.6-0.8 of the way per frame will do.
Step3. Done. You are done.
"You are done." Why are you intimidating me
cinemachine is actually good. i mean, it has effects so i wont need to make them. also has other nice features but for complex system. if you only care about camera them sure dont use cinemachine because you havee to set it up. jusst as i dont like the new input system because of the set up
the short answer how to remove jittering is to replace Update() with LateUpdate() method
a 4th step at the end could be to toggle unity's option to make the physics step happen during the render step instead of its own step. so if you get 80fps your physics is also 80fps
IMPORTANT:
I found out why you might get the jittery camera even with everything working well. The issue is when you rotate the body of the player towards the camera/orientation. I don't really know why but removing this body rotation will fix the laggy camera.
thanks
However, If you need to rotate the player, and you are moving it through rigidboy, rotate it with rigidbody too.
I was rotating it through transform and had the jitter.
Changed to rigidbody.rotation and it worked allright
Cinematic cut-scene tutorial 🙌
rotating camera and other stuff is always ass for me. The inspector display one number, eulerAngle display another, which makes clamping kind of a pain
Thanks for the solution!
I just interpolated the rotation values between each fixedupdate in update
but how did cinemachine fix this?
Cinemachine incorporates the solutions I've mentioned at 8:19
@@semikoder thx. But when i enable interpolation my players movement becomes broken wtf.
This is all well and good. But I'm running into a problem. Now that I'm using Cinemachine 3.0.1, I cannot figure out how to invert the y axis of my camera movement in a way that is configurable in code.
Setting an invert vector processor in the InputActions asset does invert the control, but I want something that can be changed in code (so the player can set the option they want).
So I tried applying an invert vector processor override in code... But it doesn't seem to do anything (either I'm doing it wrong, or CinemachineInputAxisController is overriding it).
There's also the "Gain" field in the CinemachineInputAxisController. And setting the Look Y (Tilt) Gain to 1 (rather than its default -1) DOES invert the y axis. But in the actual script, there's only one Gain float that applies to both the X and Y axis.. It's public, but I can't seem to access it anyway.. and the obvious: it's ONE value that's showing up as two values in the Inspector... So obviously there's stuff going on under the hood that's way beyond my understanding here (I've been back and forth with ChatGPT, which is not being super helpful cause it keeps giving me info that is depreciated/not applicable to Cinemachine 3.0.1 and can't seem to find the answer either).. I've also dug through the Cinemachine 3.0.1. API and there's nothing helpful there..
This is absolutely INSANE to me that this is so complicated, and now I've spent HOURS trying to figure this out when it should be simple... A public, code-accessible bool for invertYAxis (and I guess one invertXAxis for the weirdos). WHAT. The. HECK!? Someone help PLEASE!
took me 3 days to figure it out, youre welcome :)
lol, my message was deleted, PM me if you still need help
@@rain.tamper I'm not working on this specifically anymore (it was just for a learning project), so it's not a big deal, but I am curious how you solved it, if you'd be willing to give me a brief overview. I have no idea how to send a PM on TH-cam though. Didn't even know that was a thing. :o
Btw, even though you probably hate that you spent 3 days figuring this out, knowing it took you so long, makes me feel a lot better about myself. :p so thanks for that. At least now I know it's not some super simple thing I simply overlooked. :D
How do i get the first person template
i dont have event OnMouseMove :( why?
I can only find the cinemachine 2.9 version
it depends on the unity version you're using. Cinemachine 3.x is available after Unity 2023.1 (you have to use a preview version) and 2023.2 (full release)
@@GamerBoi9000 bruh
Oh wow. Kinda forgot about that fixedupdate kinda thing. I’m gonna go cry now
Thank you very much!
Still have jittering, followed all steps.
wish this existed 2 fookin years ago - too late to change my system now (+ i'm using version 2020) but this will save many devs going forward
i dont have these issues but cinemachine having explosion and some other stuff built in is one less work i will have to do so its great anyways
how do you add the Cinemachine namespace in my C# scripts
usually when utilising a camera with a rigidbody it is good to have it separated because that also prevents the camera jittering
It also happens on a CharacterController which isn't a Rigidbody, so that doesn't matter
@@blinkachu5275 I’ve never experienced this while using a cc before?
Cool video but not recommend to use motion blur in it. I want to watch those things clearly without pausing
Thank you so much you are best!!
what about godot?
Will it work on mobile devices?
hi i use your solution and my rotation problem was solved but now i cant control my character because when i want to go forward when i looking right, my character wants to go left :/ the inputs arent change here is my code
public class PlayerController : MonoBehaviour
{
[SerializeField] float moveSpeed;
[SerializeField] float sensitivity = 0.1f;
[SerializeField] int jumpPower;
[SerializeField] Transform camTransform;
Transform groundCheck;
Rigidbody rb;
Vector3 moveDirection;
Vector2 currentRotation;
private void Awake()
{
rb = GetComponent();
groundCheck = transform.GetChild(1);
camTransform = transform.GetChild(0);
}
private void Start()
{
Cursor.lockState = CursorLockMode.Locked;
}
private void FixedUpdate()
{
rb.AddForce(new Vector2(moveDirection.x * moveSpeed, moveDirection.y * moveSpeed));
}
public void OnMove(InputAction.CallbackContext context)
{
Vector2 inputDirection = context.ReadValue();
moveDirection = new Vector2(inputDirection.x, inputDirection.y);
}
public void OnJump(InputAction.CallbackContext context)
{
if (IsGrounded() && context.performed)
{
rb.AddForce(Vector3.up * jumpPower, ForceMode.Impulse);
}
}
public void OnRotate(InputAction.CallbackContext context)
{
Vector2 mouseDelta = context.ReadValue();
currentRotation.x += mouseDelta.x * sensitivity;
currentRotation.y -= mouseDelta.y * sensitivity;
currentRotation.y = Mathf.Clamp(currentRotation.y, -90f, 90f);
}
private bool IsGrounded()
{
return Physics.CheckSphere(groundCheck.position, 0.2f);
}
}
get a reference to the FP Camera's Transform, say cmTransform, and multiply your inputs by cmTransform.forward or cmTransform.right depending on which input axis controls which movement axis.
pls make tutorial on how to make cod mw type movement and camera animations
where do i get cm3
you have to have the latest version of unity
x2
@@sebastiangeraldohirales4935 ?
So the best way to make a first person camera is to not make one and use a plugin, great job, why make a 10 minute tutorial on failed solutions if you're just gonna use a plugin.
I kinda agree with you on the use of plugins, but cinemachine, the new input system and textmeshpro are all plugins that should be in Unity from the start if we are honest these 3 plugins are so powerful and Unity itself uses them
5 mins*
And the video is 9mins long not 10, that's not how you round to the nearest 😂
WOW I really needed this before but I think I already fixed the gitter but still I will switch to cinemachine , I had a really complicated problem and it randomly got fixed , I had to make the camera follow the ridgidbody and I had a ridgidbody (GUN) follow a child of the camera so it was really weird got, before that I had an even weirder problem I wanted the gun as a ridgidbody to be a child of a child of the camera that moved with the player ridgidbody obviously didnt work but I made the gun not a child then worked
I will switch to unreal engine
It's crazy how you have to do all those steps in Unity and in Unreal you don't 😂
Totally true
@5:22 the "step x" bit made it genuinely hard to follow. Please don't do it in future videos; every youtuber does self-deprecating humor in coding tutorials and it has never been funny and it always makes the concepts harder to follow. Make professional, to-the-point, videos; that's what we are here for. thanks. Otherwise great video.
I'll say I liked it. +1 and -1 makes both our comments irrelevant
just use late update for camera rotation lol, wtf