Files
spacerace/Assets/ShipControls.cs
T
2023-06-29 23:30:13 +10:00

132 lines
4.0 KiB
C#
Executable File

using UnityEngine;
public class ShipControls : MonoBehaviour {
public Camera m_camera;
Rigidbody m_ridigBody;
Vector3 m_initialPosition;
Vector3 m_initialForce;
Vector3 m_thrust;
Vector3 m_strafe;
float m_strafeMag;
float m_thrustMag;
float m_stabliseMag;
ForceMode m_forceMode;
void Start() {
Cursor.lockState = CursorLockMode.Locked;
m_ridigBody = GetComponent<Rigidbody>();
m_initialPosition = m_ridigBody.transform.position;
m_initialForce = Vector3.zero;
m_thrust = Vector3.zero;
m_strafe = Vector3.zero;
m_thrustMag = 50.0f;
m_strafeMag = 25.0f;
m_stabliseMag = 75.0f;
m_forceMode = ForceMode.Acceleration;
}
void Update() {
// update the movement vectors every frame
m_thrust = getThrust();
m_strafe = getStrafe();
Debug.Log(m_thrust);
// do everything else input related on every frame too
processInput();
}
void FixedUpdate() {
// // the ship being propelled forward
m_ridigBody.AddForce(m_thrust, m_forceMode);
// moving side to side
m_ridigBody.AddForce(m_strafe, m_forceMode);
// add relative force?
// rotating towards the camera's orientation
// not being done by a force because of strange behaviour
// needs investigation
float step = m_stabliseMag * Time.fixedDeltaTime;
m_ridigBody.rotation = Quaternion.RotateTowards(transform.rotation, m_camera.transform.rotation, step);
}
Vector3 getThrust() {
// thrust
if (Input.GetMouseButton(0))
return m_camera.transform.TransformDirection(Vector3.forward) * m_thrustMag;
// brake
if (Input.GetMouseButton(1))
return m_camera.transform.TransformDirection(Vector3.back) * m_thrustMag;
return Vector3.zero;
}
// 2D strafing
// TODO add multiplier
// combine
Vector3 getStrafe() {
Vector3 strafe = new Vector3(0.0f, 0.0f, 0.0f);
if (Input.GetKey(KeyCode.W))
strafe += m_strafeMag * m_camera.transform.TransformDirection(Vector3.up);
if (Input.GetKey(KeyCode.S))
strafe += m_strafeMag * m_camera.transform.TransformDirection(Vector3.down);
if (Input.GetKey(KeyCode.A))
strafe += m_strafeMag * m_camera.transform.TransformDirection(Vector3.left);
if (Input.GetKey(KeyCode.D))
strafe += m_strafeMag * m_camera.transform.TransformDirection(Vector3.right);
return strafe;
}
void processInput() {
if (Input.GetKey(KeyCode.Space))
Respawn();
if (Input.GetKey(KeyCode.Alpha1))
m_forceMode = ForceMode.Acceleration;
if (Input.GetKey(KeyCode.Alpha2))
m_forceMode = ForceMode.Impulse;
if (Input.GetKey(KeyCode.Alpha3))
m_forceMode = ForceMode.Force;
if (Input.GetKey(KeyCode.Alpha4))
m_forceMode = ForceMode.VelocityChange;
}
void Respawn() {
m_thrust = new Vector3(0.0f, 0.0f, 0.0f);
transform.position = m_initialPosition;
m_ridigBody.transform.forward = m_initialForce;
m_ridigBody.velocity = new Vector3(0f, 0f, 0f);
m_camera.transform.eulerAngles = Vector3.forward;
}
void OnDrawGizmosSelected() {
Gizmos.color = Color.red;
Vector3 direction = m_camera.transform.TransformDirection(Vector3.up) * 10;
Gizmos.DrawRay(transform.position, direction);
Gizmos.color = Color.green;
Vector3 right = m_camera.transform.TransformDirection(Vector3.right) * 10;
Gizmos.DrawRay(transform.position, right);
Gizmos.color = Color.yellow;
Vector3 forward = m_camera.transform.TransformDirection(Vector3.forward) * 10;
Gizmos.DrawRay(transform.position, forward);
}
}