Files
spacerace/Assets/ShipControls.cs
T
2023-06-26 17:36:28 +10:00

120 lines
4.6 KiB
C#
Executable File
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using UnityEngine;
public class ShipControls : MonoBehaviour
{
//Use to switch between Force Modes
enum ModeSwitching { Start, Impulse, Acceleration, Force, VelocityChange };
ModeSwitching m_ModeSwitching;
Vector3 m_StartPos, m_StartForce;
Vector3 m_NewForce;
Rigidbody m_Rigidbody;
public float m_ForceAmp;
public GameObject ship;
void Start()
{
//You get the Rigidbody component you attach to the GameObject
m_Rigidbody = GetComponent<Rigidbody>();
//This starts at first mode (nothing happening yet)
m_ModeSwitching = ModeSwitching.Start;
//Initialising the force which is used on GameObject in various ways
m_NewForce = new Vector3(-5.0f, 1.0f, 0.0f);
//The GameObject's starting position and Rigidbody position
m_StartPos = transform.position;
m_StartForce = m_Rigidbody.transform.position;
}
void FixedUpdate()
{
//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 = ship.transform.forward * m_ForceAmp;
}
//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.Start:
//This resets the GameObject and Rigidbody to their starting positions
transform.position = m_StartPos;
m_Rigidbody.transform.position = 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
m_Rigidbody.AddForce(m_NewForce, ForceMode.Acceleration);
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
m_Rigidbody.AddForce(m_NewForce, ForceMode.Force);
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
m_Rigidbody.AddForce(m_NewForce, ForceMode.Impulse);
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
m_Rigidbody.AddForce(m_NewForce, ForceMode.VelocityChange);
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;
}
}
}