Hi everyone, I have this SimpleSmoothMouseLook script and i wanna limit it to a specific area like mouse look should only work on half screen not everywhere is it possible and how? Here's the script: Code (CSharp): using UnityEngine; using System.Collections; [AddComponentMenu("Camera/Simple Smooth Mouse Look ")] public class SimpleSmoothMouseLook : MonoBehaviour { Vector2 _mouseAbsolute; Vector2 _smoothMouse; public Vector2 clampInDegrees = new Vector2(360, 180); public bool lockCursor; public Vector2 sensitivity = new Vector2(2, 2); public Vector2 smoothing = new Vector2(3, 3); public Vector2 targetDirection; public Vector2 targetCharacterDirection; // Assign this if there's a parent object controlling motion, such as a Character Controller. // Yaw rotation will affect this object instead of the camera if set. public GameObject characterBody; void Start() { // Set target direction to the camera's initial orientation. targetDirection = transform.localRotation.eulerAngles; // Set target direction for the character body to its inital state. if (characterBody) targetCharacterDirection = characterBody.transform.localRotation.eulerAngles; } void Update() { // Ensure the cursor is always locked when set Screen.lockCursor = lockCursor; // Allow the script to clamp based on a desired target value. var targetOrientation = Quaternion.Euler(targetDirection); var targetCharacterOrientation = Quaternion.Euler(targetCharacterDirection); // Get raw mouse input for a cleaner reading on more sensitive mice. var mouseDelta = new Vector2(Input.GetAxisRaw("Mouse X"), Input.GetAxisRaw("Mouse Y")); // Scale input against the sensitivity setting and multiply that against the smoothing value. mouseDelta = Vector2.Scale(mouseDelta, new Vector2(sensitivity.x * smoothing.x, sensitivity.y * smoothing.y)); // Interpolate mouse movement over time to apply smoothing delta. _smoothMouse.x = Mathf.Lerp(_smoothMouse.x, mouseDelta.x, 1f / smoothing.x); _smoothMouse.y = Mathf.Lerp(_smoothMouse.y, mouseDelta.y, 1f / smoothing.y); // Find the absolute mouse movement value from point zero. _mouseAbsolute += _smoothMouse; // Clamp and apply the local x value first, so as not to be affected by world transforms. if (clampInDegrees.x < 360) _mouseAbsolute.x = Mathf.Clamp(_mouseAbsolute.x, -clampInDegrees.x * 0.5f, clampInDegrees.x * 0.5f); var xRotation = Quaternion.AngleAxis(-_mouseAbsolute.y, targetOrientation * Vector3.right); transform.localRotation = xRotation; // Then clamp and apply the global y value. if (clampInDegrees.y < 360) _mouseAbsolute.y = Mathf.Clamp(_mouseAbsolute.y, -clampInDegrees.y * 0.5f, clampInDegrees.y * 0.5f); transform.localRotation *= targetOrientation; // If there's a character body that acts as a parent to the camera if (characterBody) { var yRotation = Quaternion.AngleAxis(_mouseAbsolute.x, characterBody.transform.up); characterBody.transform.localRotation = yRotation; characterBody.transform.localRotation *= targetCharacterOrientation; } else { var yRotation = Quaternion.AngleAxis(_mouseAbsolute.x, transform.InverseTransformDirection(Vector3.up)); transform.localRotation *= yRotation; } } } Any Help would be highly Appreciated...
You already have a spot where I see you are clamping. So you just need to clamp what value you can lerp to.
Thank u so much for the info..i'm kinda noob in C# but i understand little so can you tell me how can i clamp values so that mouse look script should only work on half screen or something? it'll be really helpful!
Thanks but your method was to clamp the radius/view i see so my player won't look/rotate up/down or left/right after reaching the decided clamp value but that's not i wanted.....BTW Thanks and I figured it out and customized it how i wanted...i am making a mobile fps game so i needed something to look around and this was working perfectly with touch so instead of limiting mouse view's area i got the code which was in update method and placed it in Repeat OnGUI Button and scaled it to the area i wanted the mouse look to work like half screen so on touching below that area the mouse look doesn't work and my player doesn't go crazy.....anyways i think i puzzled everyone....here's the script Hope it'll help someone else too. Code (CSharp): using UnityEngine; using System.Collections; [AddComponentMenu("Camera/Simple Smooth Mouse Look ")] public class SimpleSmoothMouseLook : MonoBehaviour { Vector2 _mouseAbsolute; Vector2 _smoothMouse; public Vector2 clampInDegrees = new Vector2(360, 180); public bool lockCursor; public Vector2 sensitivity = new Vector2(2, 2); public Vector2 smoothing = new Vector2(3, 3); public Vector2 targetDirection; public Vector2 targetCharacterDirection; public float minimumX = -90F; public float maximumX = 90F; public float minimumY = -60F; public float maximumY = 60F; // Assign this if there's a parent object controlling motion, such as a Character Controller. // Yaw rotation will affect this object instead of the camera if set. public GameObject characterBody; void Start() { // Set target direction to the camera's initial orientation. targetDirection = transform.localRotation.eulerAngles; // Set target direction for the character body to its inital state. if (characterBody) targetCharacterDirection = characterBody.transform.localRotation.eulerAngles; } void OnGUI() {//just for the sake of testing i made the button small so i can see what is going on. if (GUI.RepeatButton (new Rect (580, 580, 580, 590), "move")){ // Allow the script to clamp based on a desired target value. var targetOrientation = Quaternion.Euler(targetDirection); var targetCharacterOrientation = Quaternion.Euler(targetCharacterDirection); // Get raw mouse input for a cleaner reading on more sensitive mice. var mouseDelta = new Vector2(Input.GetAxisRaw("Mouse X"), Input.GetAxisRaw("Mouse Y")); // Scale input against the sensitivity setting and multiply that against the smoothing value. mouseDelta = Vector2.Scale(mouseDelta, new Vector2(sensitivity.x * smoothing.x, sensitivity.y * smoothing.y)); // Interpolate mouse movement over time to apply smoothing delta. _smoothMouse.x = Mathf.Lerp(_smoothMouse.x, mouseDelta.x, 1f / smoothing.x); _smoothMouse.y = Mathf.Lerp(_smoothMouse.y, mouseDelta.y, 1f / smoothing.y); // Find the absolute mouse movement value from point zero. _mouseAbsolute += _smoothMouse; // Clamp and apply the local x value first, so as not to be affected by world transforms. if (clampInDegrees.x < 360) _mouseAbsolute.x = Mathf.Clamp(_mouseAbsolute.x, minimumX, maximumX); var xRotation = Quaternion.AngleAxis(-_mouseAbsolute.y, targetOrientation * Vector3.right); transform.localRotation = xRotation; // Then clamp and apply the global y value. if (clampInDegrees.y < 360) _mouseAbsolute.y = Mathf.Clamp(_mouseAbsolute.y, minimumY, maximumY); transform.localRotation *= targetOrientation; // If there's a character body that acts as a parent to the camera if (characterBody) { var yRotation = Quaternion.AngleAxis(_mouseAbsolute.x, characterBody.transform.up); characterBody.transform.localRotation = yRotation; characterBody.transform.localRotation *= targetCharacterOrientation; } else { var yRotation = Quaternion.AngleAxis(_mouseAbsolute.x, transform.InverseTransformDirection(Vector3.up)); transform.localRotation *= yRotation; } } } }