- Home /
Using mouse for realistic Top-Down space ship yaw control
I've ran into a problem with the 3D Top-Down spaceship controls I'm using a movement script that allows my ship to move with realistic motion, with velocity drag, rotation drag. Problem is the ship rotates with the A and D keys by using Input.GetAxis("Horizontal"), I want the ship to rotate towards the mouse cursor with realistic drag and not snapping to it quickly. How do I write a script for this?
 using UnityEngine;
 
 public class PlayerMovement : MonoBehaviour
 { 
     public float maxSpeed = 100;
 
     public float maxRotationSpeed = 100;
 
     public float verticalInputAcceleration = 1;
 
     public float horizontalInputAcceleration = 20;
 
     public float velocityDrag = 1;
 
     public float rotationDrag = 1;
 
     private Vector3 velocity;
     private float zRotationVelocity;
 
    
 
 
 
     // Update is called once per frame
     void Update()
     {
         // apply forward input
         Vector3 acceleration = Input.GetAxis("Vertical") * verticalInputAcceleration * transform.forward;
         velocity = velocity + acceleration * Time.deltaTime;
 
         // apply turn input
         float zTurnAcceleration = 1 * Input.GetAxis("Horizontal") * horizontalInputAcceleration;
         zRotationVelocity = zRotationVelocity + zTurnAcceleration * Time.deltaTime;
     }
     private void FixedUpdate()
     {
         // apply velocity drag
         velocity = velocity * (1 - Time.deltaTime * velocityDrag);
 
         // clamp to maxSpeed
         velocity = Vector3.ClampMagnitude(velocity, maxSpeed);
 
         // apply rotation drag
         zRotationVelocity = zRotationVelocity * (1 - Time.deltaTime * rotationDrag);
 
         // clamp tomaxRotationSpeed
         zRotationVelocity = Mathf.Clamp(zRotationVelocity, -maxRotationSpeed,maxRotationSpeed);
 
         // update transform
         transform.position = transform.position + velocity * Time.deltaTime;
         transform.Rotate(0, zRotationVelocity * Time.deltaTime, 0);
 
     }
 }
Thanks for any help!
Answer by JellySandwich · Jul 01, 2020 at 03:17 PM
Figured it out, use this code on the object you want to rotate with your mouse.
 using UnityEngine;
 
 public class PlayerMouseControl : MonoBehaviour
 {
 
     public float angularDragDecayFactor;  //Higher Value means less angular drag or rotation slowing
     public float angleOffset; //Offset incase your model rotation is not lining up with the mouse cursor
     public float speedFactor;
     private Vector3 worldMousePosition;
     private float angle;
 
     void Update()
     {
         Vector3 mousePos = Input.mousePosition;
         mousePos.z = 5f;
 
         Vector3 objectPos = Camera.main.WorldToScreenPoint(transform.position);
         mousePos.x = mousePos.x - objectPos.x;
         mousePos.y = mousePos.y - objectPos.y;
 
         angle = Mathf.Atan2(mousePos.x, mousePos.y) * Mathf.Rad2Deg;
     }
 
     private void FixedUpdate()
     {
         transform.rotation = Quaternion.Lerp(transform.rotation, Quaternion.Euler(0, angle + angleOffset, 0), speedFactor * (Time.deltaTime*angularDragDecayFactor));
     }
 }
 
 
Let me know if there is a more efficient way.
Your answer
 
 
             Follow this Question
Related Questions
Dragging gameobjects always at the center of the mouse? 0 Answers
ScreenToWorldPoint changing in small increments 0 Answers
Spaceship AI for 3d game 1 Answer
Mouse Click Based Movement/Actions & 2D Sprite Rotation in 3D Space 0 Answers
3D mouse position 0 Answers
 koobas.hobune.stream
koobas.hobune.stream 
                       
                
                       
			     
			 
                