using UnityEngine; public class ShipControls : MonoBehaviour { enum ModeSwitching { Start, Impulse, Acceleration, Force, VelocityChange }; ModeSwitching m_ModeSwitching; Vector3 m_StartPos; Vector3 m_StartForce; Vector3 m_Thrust; float m_thrustBase; float m_stabliseMag; Rigidbody m_Rigidbody; public GameObject ship; public Camera camera; void Start() { m_Rigidbody = GetComponent(); m_Thrust = new Vector3(0.0f, 0.0f, 0.0f); m_StartPos = camera.transform.position; m_StartForce = m_Rigidbody.transform.forward; m_thrustBase = 10.0f; m_stabliseMag = 75.0f; Cursor.lockState = CursorLockMode.Locked; } void Update() { // update the thrust vector every frame m_Thrust = camera.transform.forward; // do everything else input related on every frame too processInput(); } void FixedUpdate() { float thrustMag = getThrustMagnitude(); m_Rigidbody.AddForce(m_Thrust * thrustMag, ForceMode.Acceleration); // stablise ship towards camera position float step = m_stabliseMag * Time.fixedDeltaTime; m_Rigidbody.rotation = Quaternion.RotateTowards(transform.rotation, camera.transform.rotation, step); } float getThrustMagnitude() { if (Input.GetMouseButton(0)) return 1.0f * m_thrustBase; if (Input.GetMouseButton(1)) return -1.0f * m_thrustBase; return 0.0f; } void processInput() { if (Input.GetKey(KeyCode.Space)) Respawn(); } void Respawn() { m_Thrust = new Vector3(0.0f, 0.0f, 0.0f); transform.position = m_StartPos; m_Rigidbody.transform.forward = m_StartForce; } // { // //If the current mode is not the starting mode (or the GameObject is not reset), the force can change // if (m_ModeSwitching != ModeSwitching.Start) // { // //The force changes depending what you input into the text fields // m_NewForce = camera.transform.position; // } // //Here, switching modes depend on button presses in the Game mode // switch (m_ModeSwitching) // { // //This is the starting mode which resets the GameObject // case ModeSwitching.Startt // //This resets the GameObject and Rigidbody to their starting positions // transform.position = m_StartPos; // m_Rigidbody.transform.forward = m_StartForce; // //This resets the velocity of the Rigidbody // m_Rigidbody.velocity = new Vector3(0f, 0f, 0f); // break; // //These are the modes ForceMode can force on a Rigidbody // //This is Acceleration mode // case ModeSwitching.Acceleration: // //Use Acceleration as the force on the Rigidbody // break; // //This is Force Mode, using a continuous force on the Rigidbody considering its mass // case ModeSwitching.Force: // //Use Force as the force on GameObject’s Rigidbody // break; // //This is Impulse Mode, which involves using the Rigidbody’s mass to apply an instant impulse force. // case ModeSwitching.Impulse: // //Use Impulse as the force on GameObject // break; // //This is VelocityChange which involves ignoring the mass of the GameObject and impacting it with a sudden speed change in a direction // case ModeSwitching.VelocityChange: // //Make a Velocity change on the Rigidbody // break; // } // } //The function outputs buttons, text fields, and other interactable UI elements to the Scene in Game view // void OnGUI() // { // //Press the button to reset the GameObject and Rigidbody // if (GUI.Button(new Rect(100, 0, 150, 30), "Reset")) // { // //This switches to the start/reset case // m_ModeSwitching = ModeSwitching.Start; // } // //When you press the Acceleration button, switch to Acceleration mode // if (GUI.Button(new Rect(100, 30, 150, 30), "Apply Acceleration")) // { // //Switch to Acceleration (apply acceleration force to GameObject) // m_ModeSwitching = ModeSwitching.Acceleration; // } // //If you press the Impulse button // if (GUI.Button(new Rect(100, 60, 150, 30), "Apply Impulse")) // { // //Switch to impulse (apply impulse forces to GameObject) // m_ModeSwitching = ModeSwitching.Impulse; // } // //If you press the Force Button, switch to Force state // if (GUI.Button(new Rect(100, 90, 150, 30), "Apply Force")) // { // //Switch to Force (apply force to GameObject) // m_ModeSwitching = ModeSwitching.Force; // } // //Press the button to switch to VelocityChange state // if (GUI.Button(new Rect(100, 120, 150, 30), "Apply Velocity Change")) // { // //Switch to velocity changing // m_ModeSwitching = ModeSwitching.VelocityChange; // } // } }