- 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