I would not recommend using eulerAngles… here’s why:
https://starmanta.gitbooks.io/unitytipsredux/content/second-question.html
But hey, if it plays well for you, go with it!
Here was my solution for ultra-simple-one-finger on phone.
You can play it in the Coinstorming modes of Pilot Kurt.
https://www.youtube.com/watch?v=RarIdj5DBN8
using UnityEngine;
using System.Collections;
public class FlightModelOriginal : FlightModel000
{
FlightModelOriginalParameters fmop;
public FlightControlInputs fci { get; private set; }
float MaxAltitude = 100.0f;
public static FlightModelOriginal AttachToStatePlayer ( FlightModelOriginalParameters fmop)
{
FlightModelOriginal fmo = STATE.pf.gameObject.AddComponent<FlightModelOriginal> ();
fmo.fmop = fmop;
return fmo;
}
public void DestroyThyself()
{
fci.DestroyThyself ();
Destroy (this);
}
Vector3 TimeFilteredOutput;
IEnumerator NoseOverAndDown( GameObject player)
{
Quaternion q1 = player.transform.rotation;
Quaternion q2 = Quaternion.Euler (70, 0, 0);
float NoseOverTime = 1.0f;
for (float t = 0; t < NoseOverTime; t += Time.deltaTime)
{
float fr = t / NoseOverTime;
player.transform.rotation = Quaternion.Lerp ( q1, q2, fr);
player.transform.position += player.transform.forward *
STATE.PlayerFlightSpeed * Time.deltaTime;
yield return null;
}
}
IEnumerator Start()
{
fci = FlightControlInputs.Attach (gameObject);
TimeFilteredOutput = Vector3.zero;
STATE.PlayerFlightSpeed = 10.0f;
GameObject player = STATE.pf.gameObject;
ServiceCeiling sc = FindObjectOfType<ServiceCeiling> ();
if (sc)
{
MaxAltitude = sc.transform.position.y;
}
// actual cheese main loop
while(true)
{
STATE.UpdateCountersAndTimers ();
if (GameModeManager.NeedSpeedIncreasing())
{
STATE.PlayerFlightSpeed += Time.deltaTime * 0.1f;
}
Vector3 rawOutput = fci.GetOutputRaw();
rawOutput += new Vector3( Input.GetAxis( "Horizontal"), Input.GetAxis ( "Vertical"));
if (SETTINGS.InvertXControls)
{
rawOutput.x = -rawOutput.x;
}
if (SETTINGS.InvertYControls)
{
rawOutput.y = -rawOutput.y;
}
TimeFilteredOutput = Vector3.Lerp(
TimeFilteredOutput, rawOutput,
fmop.ControlSnappiness * Time.deltaTime);
float Roll = -TimeFilteredOutput.x;
if (player.transform.position.y > MaxAltitude)
{
yield return StartCoroutine( NoseOverAndDown( player));
}
Roll *= fmop.RollMultiplier;
Roll *= Time.deltaTime;
player.transform.Rotate ( new Vector3( 0, 0, Roll));
float Turn = -player.transform.eulerAngles.z;
if (Turn < 180) Turn += 360;
if (Turn > 180) Turn -= 360;
Turn *= fmop.RollToTurnCoupling;
Turn *= Time.deltaTime;
player.transform.Rotate( new Vector3( 0, Turn, 0));
float Pitch = TimeFilteredOutput.y;
Pitch *= fmop.PitchMultiplier;
Pitch *= Time.deltaTime;
if (fmop.LimitPitchEnabled)
{
float xangle = player.transform.eulerAngles.x;
if (xangle > 180) xangle -= 360.0f;
if ((xangle < -fmop.LimitPitchAngle) &&
(Pitch < 0))
{
Pitch = 0;
}
if ((xangle > fmop.LimitPitchAngle) &&
(Pitch > 0))
{
Pitch = 0;
}
}
player.transform.Rotate ( new Vector3( Pitch, 0, 0));
player.transform.position += player.transform.forward *
STATE.PlayerFlightSpeed * Time.deltaTime;
yield return null;
}
}
}
Here’s the necessary stuff from STATE:
public static int score { get; private set; }
public static int wave { get; private set; }
public static float WaveTimer;
public static int multiplier { get; private set; }
public static int coinCount;
public static float playTime;
public static float MissionChronometer;
public static float MissionOdometer;
public static int MissionShotsFired;
public static int MissionShotsHit;
public static int MissionThingsDestroyed;
public static float PlayerFlightSpeed;
This is the flight model params:
using UnityEngine;
using System.Collections;
public class FlightModelOriginalParameters
{
public float ControlSnappiness;
public float RollMultiplier;
public float RollToTurnCoupling;
public float PitchMultiplier;
public bool LimitPitchEnabled;
public float LimitPitchAngle;
// <WIP> New stuff to implement:
// Roll limit
// Pitch limit
public void ConfigureOriginal()
{
ControlSnappiness = 4.0f;
RollMultiplier = 70.0f;
RollToTurnCoupling = 0.5f;
PitchMultiplier = 50.0f;
}
public void ConfigureFTUECanyon()
{
ConfigureOriginal ();
RollMultiplier = 0.0f;
RollToTurnCoupling = 0.0f;
LimitPitchEnabled = true;
LimitPitchAngle = 15.0f;
}
}