Wayback Machinekoobas.hobune.stream
May JUN Jul
Previous capture 12 Next capture
2021 2022 2023
1 capture
12 Jun 22 - 12 Jun 22
sparklines
Close Help
  • Products
  • Solutions
  • Made with Unity
  • Learning
  • Support & Services
  • Community
  • Asset Store
  • Get Unity

UNITY ACCOUNT

You need a Unity Account to shop in the Online and Asset Stores, participate in the Unity Community and manage your license portfolio. Login Create account
  • Blog
  • Forums
  • Answers
  • Evangelists
  • User Groups
  • Beta Program
  • Advisory Panel

Navigation

  • Home
  • Products
  • Solutions
  • Made with Unity
  • Learning
  • Support & Services
  • Community
    • Blog
    • Forums
    • Answers
    • Evangelists
    • User Groups
    • Beta Program
    • Advisory Panel

Unity account

You need a Unity Account to shop in the Online and Asset Stores, participate in the Unity Community and manage your license portfolio. Login Create account

Language

  • Chinese
  • Spanish
  • Japanese
  • Korean
  • Portuguese
  • Ask a question
  • Spaces
    • Default
    • Help Room
    • META
    • Moderators
    • Topics
    • Questions
    • Users
    • Badges
  • Home /
avatar image
0
Question by lCedric · Jun 26, 2019 at 04:12 PM · c#camerarotationcamera rotatefirst-person-controller

Coding noob struggles to implement first-Person camera rotation.

HI!

I am having problems on how i limit the Y axis to a certain degrees. What i mean is: When i look forward, i want the Y axis to be limited to a total of 40 degrees, so that i am not capable of looking straight up/straight down to my feet and further.

I would really appriciate it if someone could give me some help on how to make this possible, thank you.

My script (c#):

using UnityEngine; using System.Collections;

public class CamMouseLook : MonoBehaviour {

 Vector2 mouseLook;
 Vector2 smoothV;
 public float sensitivity = 10f;
 public float smoothing = 2f;

 GameObject character;

 void Start()
 {
     character = this.transform.parent.gameObject;
 }

 void Update()
 {
     var md = new Vector2(Input.GetAxisRaw("Mouse X"), Input.GetAxisRaw("Mouse Y"));

     md = Vector2.Scale(md, new Vector2(sensitivity * smoothing, sensitivity * smoothing));
     smoothV.x = Mathf.Lerp(smoothV.x, md.x, 1f / smoothing);
     smoothV.y = Mathf.Lerp(smoothV.y, md.y, 1f / smoothing);
     mouseLook += smoothV;

     transform.localRotation = Quaternion.AngleAxis(-mouseLook.y, Vector3.right);
     character.transform.localRotation = Quaternion.AngleAxis(mouseLook.x, character.transform.up);
 }

}

Comment
Add comment
10 |3000 characters needed characters left characters exceeded
▼
  • Viewable by all users
  • Viewable by moderators
  • Viewable by moderators and the original poster
  • Advanced visibility
Viewable by all users

1 Reply

· Add your reply
  • Sort: 
avatar image
0

Answer by Zarenityx · Jun 26, 2019 at 08:33 PM

The Solution:

With your current setup, this is as simple as using if statements, or the handy builtin Mathf.Clamp function.

To clamp some value X between A and B, you can do this:

 float x, a, b; //Assuming A<=B
 
 if(x<a){
      x=a;
 }else if(x>b){
      x=b;
 }

This is actually equivalent to a nice helper function in the unity library, used like this:

 float x, a, b; //Again, a<=b
 
 x = Mathf.Clamp(x,a,b);

Both of these snippets do the same thing. In fact, while I'm not 100% certain, the second method probably just does the first one behind-the-scenes. So in your code, you could, say, define:

 public float yMin, yMax;

And then later, in Update():

 mouseLook += smoothV;//Your code, so you can see where to put it
 mouseLook.y = Mathf.Clamp(mouseLook.y,yMin,yMax); //The actual clamp
 //etc...

Big Important Sidenote

here are a couple of other things I'm noticing in your camera script that are going to cause you problems. This isn't part of the main question but, since you said you were new to coding, you might want to know these since they're pretty common mistakes. (Apologies for poor formatting, lists seem to break code-formatting)

----1: Your mouse sensitivity right now is framerate dependent. You need to include md *= Time.deltaTime to correct this. See This Page for more details.

----2: Your smoothing is a bit wonky. Your smoothing is A: framerate dependent, just like pt 1, and B: your smoothing is on the velocity, which can feel a bit weird (your camera won't end up where you expect if you move the mouse around a lot.) The fix for this is to instead do your interpolation on the target position instead. Consider the following code:

 Vector2 md = new Vector2(Input.GetAxisRaw("Mouse X"),Input.GetAxisRaw("Mouse Y"));
     md *= sensitivity * Time.deltaTime; //Notice the removal of smoothing term here and the introduction of the Time.deltaTime term
     targetLook = mouseLook+md; //I created this targetLook Vector2 here. This can replace smoothV, I just wanted a more descriptive name
     targetLook.y = Mathf.Clamp(targetLook.y,yMin,yMax); //The clamping you wanted. Make sure this is applied to the target, not the actual, rotation
     
     //Now, the interpolation
     //Using Vector2.Lerp is easier than 2 Mathf.Lerps
     //Note the use of Time.deltaTime
     //Also note that this happens to the ROTATION, not VELOCITY
     mouseLook = Vector2.Lerp(mouseLook,targetLook,Time.deltaTime/smoothing);
     
     //And then your rotation setting code:
     transform.localRotation = Quaternion.AngleAxis(-mouselook.y,Vector3.right);
     character.transform.localRotation = Quaternion.AngleAxis(mouselook.x,character.transform.up);



Hoped this helps, and good luck on your project!

Comment
Add comment · Show 2 · Share
10 |3000 characters needed characters left characters exceeded
▼
  • Viewable by all users
  • Viewable by moderators
  • Viewable by moderators and the original poster
  • Advanced visibility
Viewable by all users
avatar image lCedric · Jun 30, 2019 at 01:17 PM 0
Share

Hey, sorry for my late reaction! Thanks for the extra notes, i really Appriciate it! The code you have given me has worked for the most part, the clamping works perfectly, although there is one big problem... I am not sure what's causing it, but whenever i play test it the camera keeps shaking like it's having a stroke the moment i move my mouse! It says: "transform.localRotation assign attempt for 'Character' is not valid. Input rotation is { NaN, NaN, NaN, NaN }. UnityEngine.Transform:set_localRotation(Quaternion)" Do you now what that means? I have no clue 0_0

This is the script i currently have:

 using UnityEngine;
 using System.Collections;
 
 public class Cam$$anonymous$$ouseLook : $$anonymous$$onoBehaviour
 {
 
     public float y$$anonymous$$in, y$$anonymous$$ax;
     float x, a, b;
     Vector2 mouseLook;
     Vector2 targetLook;
     public float sensitivity = 10f;
     public float smoothing = 2f;
     GameObject character;
     void Start()
     {
         character = this.transform.parent.gameObject;
     }
     void Update()
     {
 
         if (x < a)
         {
             x = a;
         }
         else if (x > b)
         {
             x = b;
         }
 
         mouseLook += targetLook;
         targetLook.y = $$anonymous$$athf.Clamp(targetLook.y, y$$anonymous$$in, y$$anonymous$$ax);
 
         Vector2 md = new Vector2(Input.GetAxisRaw("$$anonymous$$ouse X"), Input.GetAxisRaw("$$anonymous$$ouse Y"));
         md *= sensitivity * Time.deltaTime;
 
         targetLook = mouseLook + md;
 
         targetLook.x = $$anonymous$$athf.Lerp(targetLook.x, md.x, 1f / smoothing);
         targetLook.y = $$anonymous$$athf.Lerp(targetLook.y, md.y, 1f / smoothing);
         mouseLook = Vector2.Lerp(mouseLook, targetLook, Time.deltaTime / smoothing);
         transform.localRotation = Quaternion.AngleAxis(-mouselook.y, Vector3.right);
         character.transform.localRotation = Quaternion.AngleAxis(mouselook.x, character.transform.up);
     }
 }

avatar image Zarenityx lCedric · Jul 01, 2019 at 04:53 PM 0
Share

Hey, sorry I got back so late too. I generally write code directly into the submission box so it's entirely possible that the code as is doesn't compile or work quite as intended. Code given is intended as a guideline or visual aid, but not to be copy-pasted. (It's always a bad idea to copy-paste code from the internet anyway.) Regardless, here's a few things I noticed:

  1. Check if your smoothing is 0 or near 0. This can cause issues. If you want to be able to turn off smoothing, then use an if statement to bypass the Vector2.Lerp.

  2. Get rid of the two lines with the $$anonymous$$athf.Lerp in them. Those two lines are superseded by the Vector2.Lerp line anyway, since they were framerate-dependent. The targetLook = mouseLook+md line and the $$anonymous$$athf.Clamp are the ONLY things that should modify targetLook.

  3. $$anonymous$$ove the clamping to AFTER the lines that adds md. This should fix some jittering. The issue it that it's being clamped, then edited, meaning it can actually go past the clamp and then later get re-clamped, causing a jarring shaking effect.

  4. You have an if statement included that does nothing. Looks like you copy-pasted my example code of how clamping works. This was written as an example, and actually does nothing useful in your script.

  5. Can't be sure, but it looks like you're copy-pasting. If you are, DON'T. It will make it significantly harder to figure out what's going on down the line, and even if you end up making it work, you'll learn less from it. Ins$$anonymous$$d, look through the code and figure out what it's doing, then write it yourself. This will let you learn how that code functions. Treat internet code snippets as pictures in an instruction manual, not as magic potion ingredients.

Your answer

Hint: You can notify a user about this post by typing @username

Up to 2 attachments (including images) can be used with a maximum of 524.3 kB each and 1.0 MB total.

Follow this Question

Answers Answers and Comments

661 People are following this question.

avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image

Related Questions

Third person follow camera on a sphere 1 Answer

Flip over an object (smooth transition) 3 Answers

maximum angle for camera 0 Answers

Limit camera RotateAround for an UAV game 0 Answers

Forward and back movements with a camera emulating an isometric view 1 Answer


Enterprise
Social Q&A

Social
Subscribe on YouTube social-youtube Follow on LinkedIn social-linkedin Follow on Twitter social-twitter Follow on Facebook social-facebook Follow on Instagram social-instagram

Footer

  • Purchase
    • Products
    • Subscription
    • Asset Store
    • Unity Gear
    • Resellers
  • Education
    • Students
    • Educators
    • Certification
    • Learn
    • Center of Excellence
  • Download
    • Unity
    • Beta Program
  • Unity Labs
    • Labs
    • Publications
  • Resources
    • Learn platform
    • Community
    • Documentation
    • Unity QA
    • FAQ
    • Services Status
    • Connect
  • About Unity
    • About Us
    • Blog
    • Events
    • Careers
    • Contact
    • Press
    • Partners
    • Affiliates
    • Security
Copyright © 2020 Unity Technologies
  • Legal
  • Privacy Policy
  • Cookies
  • Do Not Sell My Personal Information
  • Cookies Settings
"Unity", Unity logos, and other Unity trademarks are trademarks or registered trademarks of Unity Technologies or its affiliates in the U.S. and elsewhere (more info here). Other names or brands are trademarks of their respective owners.
  • Anonymous
  • Sign in
  • Create
  • Ask a question
  • Spaces
  • Default
  • Help Room
  • META
  • Moderators
  • Explore
  • Topics
  • Questions
  • Users
  • Badges