cancel
Showing results for 
Search instead for 
Did you mean: 

I am learning to incorporate Oculus Touch with older Input Manager apps - WITH ABSOLUTELY NO LUCK!!!

Woody3D
Expert Protege
But as well as I though I understood Input manager etc.  I am at a complete loss.  I have of course imported the Oculus Integration package.  I just want to know how to use the trigger to SHOOT,  to use the Thumbstick to TURN or do Pitch Roll Yaw etc..  But after LITERAL WEEKS AND WEKKS 8 hours a day sitting and drinking coffee trying to figure out the AWFUL Unity Documentation and the near total lack or step by steps from Oculus,  IT's like they WANT VR to fail!!  I can't get there from here.  I learn by reverse engineering and I have N O T H I N G to reverse engineer this time,..  Please help me incorporate the Touch controllers in this Oculus sample control script, then I will be able to learn from that to apply to my 3 apps.

Here is one part of the script I would like to change:
---------------------------------------------------------------------------------------------------------
  if (Input.GetMouseButtonDown(0)) {
   fireShot();
  }
--------------------------------------------------------------------------------------------------------

Here is what I thought I could change it to, but it didn't work:
--------------------------------------------------------------------------------------------------------
if (OVRInput.Get(OVRInput.RawButton.RIndexTrigger(0)) {
fireShot();
}
---------------------------------------------------------------------------------------------------------

If only there were some useful example works and samples but all the stuff available is so cryptic,  it is essentially 100% inaccessible to those learning.   
You can't get there from here!!  SO Real World Example,  a Flying do-dad,  it shouldn't take an experienced Oculus / Unity programmer more than 4 minutes to update this script for Touch, it will take me the rest of my life wioth so littelgood information outthere, I LITERALLY san't find a SINGLE EXAMPLE of the code used in a ral world thing MUCH LESS a Before After code to show what used to be and whati  jow It's so simple to teach this way and [people learn instantly,  WHY DO THE MANUALS STILL LOOK LIKE SONY STEREO INSTRUCTIONS??  WHAT'S IN THE BOX, BUT NO REAL INFO!!!! PLEASE DO SO SO I CAN LEARN FROM THE DIFFERENCE N THE 2. THAT IS THE ONLY WAY I LEARN, IS BY EXAMPLE.      I AM YEARS INTO TRYING TO LEARN UNITY, BUT THE FIRST STEPS ARE NEAR IMPOSSIBLE!  I will blog and share with my 1,700 YouTube subscribers and help them too so PLEASE HELP!    PLEASE DO NOT BOTHER TO ANSWER IF YOU ARE NOT HELPING WITHTHE SCRIPT,  I HAVE HAD YEARS OF SNIPPETS OF ADVICE, THEY GO NOWHERE, THEY DO NOT HELP, I NEED TO SEE IT AND THE DIFFERENCE AND WH,  
.... THEN I WILL FINALLY UNDERSTAND FOR ALL TIME, 
UNTIL THEN I BANG MY HEAD AGAINST WALL WAITING FOR BEFORE AFTER EXAMPLE CODE TO LEARN FROM.  The documentation is LESS than uselss it is actually HARMFULL, I have to step away from Unity for WEEKS after trying to get my hear around that insanity!!  

They actually give OUT OF CONTEXT EXAMPLE CODE SNIPPETS LOL LOL LOL!!!!  WHAT THE HECK!!!!   If only Oculus had thought to take a simple Input script and rewrite it with annotations for Oculus Touch and no one would have any questions it would be simple,.. They love to make it harder than it is, 

 Once I know any given thing in UnIty it's SO DAMN EASY..  IT'S TIT>...  But getting that information the first time can be a near impossible task, a half a year long odyssey... PLEASE HELP!!!

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

using UnityEngine;
using System.Collections;
[System.Serializable]
public class PlayerFlightControl : MonoBehaviour
{
 //"Objects", "For the main ship Game Object and weapons"));
 public GameObject actual_model; //"Ship GameObject", "Point this to the Game Object that actually contains the mesh for the ship. Generally, this is the first child of the empty container object this controller is placed in."
 public Transform weapon_hardpoint_1; //"Weapon Hardpoint", "Transform for the barrel of the weapon"
 public GameObject bullet; //"Projectile GameObject", "Projectile that will be fired from the weapon hardpoint."
 //"Core Movement", "Controls for the various speeds for different operations."
 public float speed = 20.0f; //"Base Speed", "Primary flight speed, without afterburners or brakes"
 public float afterburner_speed = 40f; //Afterburner Speed", "Speed when the button for positive thrust is being held down"
 public float slow_speed = 4f; //"Brake Speed", "Speed when the button for negative thrust is being held down"
 public float thrust_transition_speed = 5f; //Thrust Transition Speed", "How quickly afterburners/brakes will reach their maximum effect"
 public float turnspeed = 15.0f; //"Turn/Roll Speed", "How fast turns and rolls will be executed "
 public float rollSpeedModifier = 7; //"Roll Speed", "Multiplier for roll speed. Base roll is determined by turn speed"
 public float pitchYaw_strength = 0.5f; //"Pitch/Yaw Multiplier", "Controls the intensity of pitch and yaw inputs"
 //"Banking", "Visuals only--has no effect on actual movement"
 
 public bool use_banking = true; //Will bank during turns. Disable for first-person mode, otherwise should generally be kept on because it looks cool. Your call, though.
 public float bank_angle_clamp = 360; //"Bank Angle Clamp", "Maximum angle the spacecraft can rotate along the Z axis."
 public float bank_rotation_speed = 3f; //"Bank Rotation Speed", "Rotation speed along the Z axis when yaw is applied. Higher values will result in snappier banking."
 public float bank_rotation_multiplier = 1f; //"Bank Rotation Multiplier", "Bank amount along the Z axis when yaw is applied."
 
 public float screen_clamp = 500; //"Screen Clamp (Pixels)", "Once the pointer is more than this many pixels from the center, the input in that direction(s) will be treated as the maximum value."
 
 [HideInInspector]
 public float roll, yaw, pitch; //Inputs for roll, yaw, and pitch, taken from Unity's input system.
 [HideInInspector]
 public bool afterburner_Active = false; //True if afterburners are on.
 [HideInInspector]
 public bool slow_Active = false; //True if brakes are on
 
 float distFromVertical; //Distance in pixels from the vertical center of the screen.
 float distFromHorizontal; //Distance in pixel from the horizontal center of the screen.
 Vector2 mousePos = new Vector2(0,0); //Pointer position from CustomPointer
 
 float DZ = 0; //Deadzone, taken from CustomPointer.
 float currentMag = 0f; //Current speed/magnitude
 
 bool thrust_exists = true;
 bool roll_exists = true;
 
 //---------------------------------------------------------------------------------
 
 void Start() {
 
  mousePos = new Vector2(0,0); 
  DZ = CustomPointer.instance.deadzone_radius;
  
  roll = 0; //Setting this equal to 0 here as a failsafe in case the roll axis is not set up.
  //Error handling, in case one of the inputs aren't set up.
  try {
   Input.GetAxis("Thrust");
  } catch {
   thrust_exists = false;
   Debug.LogError("(Flight Controls) Thrust input axis not set up! Go to Edit>Project Settings>Input to create a new axis called 'Thrust' so the ship can change speeds.");
  }
  
  try {
   Input.GetAxis("Roll");
  } catch {
   roll_exists = false;
   Debug.LogError("(Flight Controls) Roll input axis not set up! Go to Edit>Project Settings>Input to create a new axis called 'Roll' so the ship can roll.");
  }
  
 }
 
 
 void FixedUpdate () {
  
  if (actual_model == null) {
   Debug.LogError("(FlightControls) Ship GameObject is null.");
   return;
  }
  
  
  updateCursorPosition();
  
  //Clamping the pitch and yaw values, and taking in the roll input.
  pitch = Mathf.Clamp(distFromVertical, -screen_clamp - DZ, screen_clamp  + DZ) * pitchYaw_strength;
  yaw = Mathf.Clamp(distFromHorizontal, -screen_clamp - DZ, screen_clamp  + DZ) * pitchYaw_strength;
  if (roll_exists)
   roll = (Input.GetAxis("Roll") * -rollSpeedModifier);
   
  
  //Getting the current speed.
  currentMag = GetComponent<Rigidbody>().velocity.magnitude;
  
  //If input on the thrust axis is positive, activate afterburners.
  if (thrust_exists) {
   if (Input.GetAxis("Thrust") > 0) {
    afterburner_Active = true;
    slow_Active = false;
    currentMag = Mathf.Lerp(currentMag, afterburner_speed, thrust_transition_speed * Time.deltaTime);
    
   } else if (Input.GetAxis("Thrust") < 0) {  //If input on the thrust axis is negatve, activate brakes.
    slow_Active = true;
    afterburner_Active = false;
    currentMag = Mathf.Lerp(currentMag, slow_speed, thrust_transition_speed * Time.deltaTime);
    
   } else { //Otherwise, hold normal speed.
    slow_Active = false;
    afterburner_Active = false;
    currentMag = Mathf.Lerp(currentMag, speed, thrust_transition_speed * Time.deltaTime);
    
   }
  }
    
  //Apply all these values to the rigidbody on the container.
  GetComponent<Rigidbody>().AddRelativeTorque(
   (pitch * turnspeed * Time.deltaTime),
   (yaw * turnspeed * Time.deltaTime),
   (roll * turnspeed *  (rollSpeedModifier / 2) * Time.deltaTime));
  
  GetComponent<Rigidbody>().velocity = transform.forward * currentMag; //Apply speed
  
  if (use_banking)
   updateBanking(); //Calculate banking.
  
 }  
  
  
 void updateCursorPosition() {
  mousePos = CustomPointer.pointerPosition;
  
  //Calculate distances from the center of the screen.
  float distV = Vector2.Distance(mousePos, new Vector2(mousePos.x, Screen.height / 2));
  float distH = Vector2.Distance(mousePos, new Vector2(Screen.width / 2, mousePos.y));
  
  //If the distances are less than the deadzone, then we want it to default to 0 so that no movements will occur.
  if (Mathf.Abs(distV) < DZ)
   distV = 0;
  else
   distV -= DZ;
   //Subtracting the deadzone from the distance. If we didn't do this, there would be a snap as it tries to go to from 0 to the end of the deadzone, resulting in jerky movement.
   
  if (Mathf.Abs(distH) < DZ)
   distH = 0; 
  else
   distH -= DZ;
   
  //Clamping distances to the screen bounds. 
  distFromVertical = Mathf.Clamp(distV, 0, (Screen.height));
  distFromHorizontal = Mathf.Clamp(distH, 0, (Screen.width)); 
 
  //If the mouse position is to the left, then we want the distance to go negative so it'll move left.
  if (mousePos.x < Screen.width / 2 && distFromHorizontal != 0) {
   distFromHorizontal *= -1;
  }
  //If the mouse position is above the center, then we want the distance to go negative so it'll move upwards.
  if (mousePos.y >= Screen.height / 2 && distFromVertical != 0) {
   distFromVertical *= -1;
  }
  
 }

 void updateBanking() {
  //Load rotation information.
  Quaternion newRotation = transform.rotation;
  Vector3 newEulerAngles = newRotation.eulerAngles;
  
  //Basically, we're just making it bank a little in the direction that it's turning.
  newEulerAngles.z += Mathf.Clamp((-yaw * turnspeed * Time.deltaTime ) * bank_rotation_multiplier, - bank_angle_clamp, bank_angle_clamp);
  newRotation.eulerAngles = newEulerAngles;
  
  //Apply the rotation to the gameobject that contains the model.
  actual_model.transform.rotation = Quaternion.Slerp(actual_model.transform.rotation, newRotation, bank_rotation_speed * Time.deltaTime);
 
 }
 
 void Update() {
 
  //Please remove this and replace it with a shooting system that works for your game, if you need one.
  if (Input.GetMouseButtonDown(0)) {
   fireShot();
  }
 
 }
 
 
 public void fireShot() {
 
  if (weapon_hardpoint_1 == null) {
   Debug.LogError("(FlightControls) Trying to fire weapon, but no hardpoint set up!");
   return;
  }
  
  if (bullet == null) {
   Debug.LogError("(FlightControls) Bullet GameObject is null!");
   return;
  }
  
  //Shoots it in the direction that the pointer is pointing. Might want to take note of this line for when you upgrade the shooting system.
  if (Camera.main == null) {
   Debug.LogError("(FlightControls) Main camera is null! Make sure the flight camera has the tag of MainCamera!");
   return;
  }
  
  GameObject shot1 = (GameObject) GameObject.Instantiate(bullet, weapon_hardpoint_1.position, Quaternion.identity);
  
  Ray vRay;
  
  if (!CustomPointer.instance.center_lock)
   vRay = Camera.main.ScreenPointToRay(CustomPointer.pointerPosition);
  else
   vRay = Camera.main.ScreenPointToRay(new Vector2(Screen.width / 2f, Screen.height / 2f));
   
   
  RaycastHit hit;
  
  //If we make contact with something in the world, we'll make the shot actually go to that point.
  if (Physics.Raycast(vRay, out hit)) {
   shot1.transform.LookAt(hit.point);
   shot1.GetComponent<Rigidbody>().AddForce((shot1.transform.forward) * 9000f);
  
  //Otherwise, since the ray didn't hit anything, we're just going to guess and shoot the projectile in the general direction.
  } else {
   shot1.GetComponent<Rigidbody>().AddForce((vRay.direction) * 9000f);
  }
 
 }
 
}
3 REPLIES 3

MikeF
Trustee
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class InputEx : MonoBehaviour {

public float TriggerVal;
public float GripVal;
public Vector2 ThumbStickVal;

public bool IsPoint;
public bool IsThumbsUp;

public enum handedness
{
None = 0,
Left =1,
Right =2,
}
public handedness Handedness;
private OVRInput.Controller m_controllerMask;

void Start()
{
if (Handedness == handedness.Left) {
m_controllerMask = OVRInput.Controller.LTouch;
}

if (Handedness == handedness.Right) {
m_controllerMask = OVRInput.Controller.RTouch;
}
}

void Update () {
AnalogInputUpdate ();
DigitalInputUpdate ();
}

void AnalogInputUpdate()
{
if (Handedness == handedness.Left) {
TriggerVal = OVRInput.Get (OVRInput.RawAxis1D.LIndexTrigger);
GripVal = OVRInput.Get (OVRInput.RawAxis1D.LHandTrigger);
ThumbStickVal = OVRInput.Get (OVRInput.Axis2D.PrimaryThumbstick);
}
else if (Handedness == handedness.Right) {
TriggerVal = OVRInput.Get (OVRInput.RawAxis1D.RIndexTrigger);
GripVal = OVRInput.Get (OVRInput.RawAxis1D.RHandTrigger);
ThumbStickVal = OVRInput.Get (OVRInput.Axis2D.SecondaryThumbstick);
}
}

void DigitalInputUpdate()
{

//capacitive point and thumbs up
IsPoint = !(OVRInput.Get (OVRInput.Touch.PrimaryIndexTrigger, m_controllerMask));
IsThumbsUp = !OVRInput.Get(OVRInput.NearTouch.PrimaryThumbButtons, m_controllerMask);

//digital buttons down
if (OVRInput.GetDown (OVRInput.RawButton.X , m_controllerMask)) {
Debug.Log ("X Down");
}
if (OVRInput.GetDown (OVRInput.RawButton.Y , m_controllerMask)) {
Debug.Log ("Y Down");
}
if (OVRInput.GetDown (OVRInput.RawButton.A , m_controllerMask)) {
Debug.Log ("A Down");
}
if (OVRInput.GetDown (OVRInput.RawButton.B , m_controllerMask)) {
Debug.Log ("B Down");
}
if (OVRInput.GetDown (OVRInput.RawButton.Start , m_controllerMask)) {
Debug.Log ("Menu Button Down");
}

//digital buttons up
if (OVRInput.GetUp (OVRInput.RawButton.X , m_controllerMask)) {
Debug.Log ("X Up");
}
if (OVRInput.GetUp (OVRInput.RawButton.Y , m_controllerMask)) {
Debug.Log ("Y Up");
}
if (OVRInput.GetUp (OVRInput.RawButton.A , m_controllerMask)) {
Debug.Log ("A Up");
}
if (OVRInput.GetUp (OVRInput.RawButton.B , m_controllerMask)) {
Debug.Log ("B Up");
}
if (OVRInput.GetUp (OVRInput.RawButton.Start , m_controllerMask)) {
Debug.Log ("Menu Button Up");
}
}
}
Attach to gameobject, select handedness, run.


NextWorldVR
Protege

MikeF said:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class InputEx : MonoBehaviour {

public float TriggerVal;
public float GripVal;
public Vector2 ThumbStickVal;

public bool IsPoint;
public bool IsThumbsUp;

public enum handedness
{
None = 0,
Left =1,
Right =2,
}
public handedness Handedness;
private OVRInput.Controller m_controllerMask;

void Start()
{
if (Handedness == handedness.Left) {
m_controllerMask = OVRInput.Controller.LTouch;
}

if (Handedness == handedness.Right) {
m_controllerMask = OVRInput.Controller.RTouch;
}
}

void Update () {
AnalogInputUpdate ();
DigitalInputUpdate ();
}

void AnalogInputUpdate()
{
if (Handedness == handedness.Left) {
TriggerVal = OVRInput.Get (OVRInput.RawAxis1D.LIndexTrigger);
GripVal = OVRInput.Get (OVRInput.RawAxis1D.LHandTrigger);
ThumbStickVal = OVRInput.Get (OVRInput.Axis2D.PrimaryThumbstick);
}
else if (Handedness == handedness.Right) {
TriggerVal = OVRInput.Get (OVRInput.RawAxis1D.RIndexTrigger);
GripVal = OVRInput.Get (OVRInput.RawAxis1D.RHandTrigger);
ThumbStickVal = OVRInput.Get (OVRInput.Axis2D.SecondaryThumbstick);
}
}

void DigitalInputUpdate()
{

//capacitive point and thumbs up
IsPoint = !(OVRInput.Get (OVRInput.Touch.PrimaryIndexTrigger, m_controllerMask));
IsThumbsUp = !OVRInput.Get(OVRInput.NearTouch.PrimaryThumbButtons, m_controllerMask);

//digital buttons down
if (OVRInput.GetDown (OVRInput.RawButton.X , m_controllerMask)) {
Debug.Log ("X Down");
}
if (OVRInput.GetDown (OVRInput.RawButton.Y , m_controllerMask)) {
Debug.Log ("Y Down");
}
if (OVRInput.GetDown (OVRInput.RawButton.A , m_controllerMask)) {
Debug.Log ("A Down");
}
if (OVRInput.GetDown (OVRInput.RawButton.B , m_controllerMask)) {
Debug.Log ("B Down");
}
if (OVRInput.GetDown (OVRInput.RawButton.Start , m_controllerMask)) {
Debug.Log ("Menu Button Down");
}

//digital buttons up
if (OVRInput.GetUp (OVRInput.RawButton.X , m_controllerMask)) {
Debug.Log ("X Up");
}
if (OVRInput.GetUp (OVRInput.RawButton.Y , m_controllerMask)) {
Debug.Log ("Y Up");
}
if (OVRInput.GetUp (OVRInput.RawButton.A , m_controllerMask)) {
Debug.Log ("A Up");
}
if (OVRInput.GetUp (OVRInput.RawButton.B , m_controllerMask)) {
Debug.Log ("B Up");
}
if (OVRInput.GetUp (OVRInput.RawButton.Start , m_controllerMask)) {
Debug.Log ("Menu Button Up");
}
}
}
Attach to gameobject, select handedness, run.
Hey,  thanks so much for the response.   I tried for 70 days since you posted to understand what you have typed and make it work.  But I have had zero luck.  I will list my simple steps (I'm trying to get it to work on a CUBE before anything 'complex' (joke..) 🙂
1) I create a New Unity Project and import Oculus Utilities.

2)  I create a cube, I drag in OVR Camera Rig make it a child of the cube..

3) I select Cube, add component New Script and paste in your text in Visual Studio.  I save the file as fly.cs

4)  I set player setting for VR Enabled and Oculus (No open VR)

5) I run the game window, try every single button and grips etc on each oculus controller, Nothing at all,. 

So, That's where i'm at, 70 days of trying over and over, trying everything,..  (well except the once thing I'm missing  I guess LOL)  I look at the Cube inspector, it does say at the top of the Script Component entry 'NOTHING SELECTED' (???) The CUBE IS SELECTED!!  The errors I get are:

1) The referenced script on this Behaviour is missing! (referenced Script?  I only have ONer Script and it IS the fly.cs Script! ????? It is Definately in the Project FOlder, That where I created directly ONTO the cube,..)
2) The referenced script on this Behaviour (Game Object 'Cube') is missing!

Thanks for trying.  But it does not run. It does not run.


RANT:

I'm no dunce, I worked in CGI for 25 years in Hollywood, since the DOS days, 3D STUDIO R1 for DOS!!  I was Technical Director of an Animatoed TV show on Playboy TV, ( in the early 1990's!)  Ore recently, I worked on 'LIFE of PI'!   I build computers,  replace and update CCFL's in monitors with LEDS<  I solder blown Capacitors,  I compose 100-piece orchestral scores digitally,  I can make any impossible thing happen visually with CGI, compositing, editing, special effects.   I play Violin, Cello, Piano,. and my main talent:    I am a Master Character Animator of the highest order for 23 years.      <---- I only say this to point out the fact the fault is NOT in ME, it is with UNITY and their inability to GIVE GOOD CONCISE INSTRUCTION to OTHER Types of people than the typical, Left Brained Programmer Non-Artists.  

 I HAVE TRIED TO LEARN UNITY FOR .. AS LONG AS IT HAS EXISTED.  THE SIMPLEST THING LiKe THIS LOCOMOTION PROBLEM, THAT I CONTINUE TO BATTLE FOR,  CAN TAKE AS LONG AS A year TO GET ANY HELP ON, AND THAT HELP WHEN IT COMES,   IS USUALLY JUST, SOME UNEXPLAINED,  //non commented, NON-WOKRING CODE WITH SOMETHING GLIB 'INSTRUCTION' LIKE: 'SIMPLY ATTACH TO OBJECT AND RUN!"  

I WOULD SAY, IT'S NO WONDER SO FEW REAL ARTISTS,  CHARACTER ANIMATORS, FILMMAKERS, MUSICIANS LIKE MYSELF, ARE MAKING VR GAMES!! ( OR INTERACTIVE FEATURE FILMS,..) 

We get the same 'stand in the middle of a room and shoot at things' VR apps OVER and OVER,. 

I'm not embarrassed in the slightest.  I can figure ANYTHING out INSTANTLY with good source material. , There has NEVER in 20 years, been anything good to learn UNITY, and the few things I found that seemed ok,  WERE COMPLETELY WRONG and unusable because EVERYTHING IN UNITY had changed between micro-sub-point incremental updates, making it irrelevant.( and actually HARMFUL)

This interactive stuff is so much heartache, hair pulling,  the worst thing I have ever done on my life and I'm a Cancer survivor,.  IT's NOT AT ALL FUN IN ANY WAY SHAPE OR FORM, JUST AN ENDLESS NIGHTMARE .  

At least my stupid Human 'optimism bias' is finally dead..  I don't even HOPE any more..


 




NextWorldVR
Protege

MikeF said:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class InputEx : MonoBehaviour \ (ETC....)

Attach to gameobject, select handedness, run.


Hey Mike,  thanks so much for the response.   I have literally tried to make this work  for 70 days since you posted (not wanting to post back until I figured it out, but,....  That single sentence of 'instruction', pretty much doomed me to fail,...)    

It took me over 30 days just to ALMOST RANDOMLY figure out because you called the Public Class InputEx,  I have to call the cs file InputEx.   

'Name the cs file InputEx.cs'  That simple line would have saved me 34 days and gotten my App into Dashboard. 

  I will list my simple steps.  

1) I create a New Unity Project and import Oculus Utilities.

2)  drag in OVR Character Controller (and tried on a OVR Camera Rig).

3) I add component New Script to the OVR Prefab, and paste your text in Visual Studio.  I save the file as InputEx.cs

4)  I set player setting for VR Enabled and Oculus (No open VR)

5) I run the game window, try every single button and grips etc on each oculus controller, Nothing at all,.  Some number and Checkboxes in the INSPECTOR Change,.  If I knew what to DO with that I'm sure it would be VERY HELPFUL,    But it means nothing,. Just numbers changing,.  Was I supposed to have an epiphany?,..  It might have been nice to say WHAT YOU WERE HANDING ME!!  I asked for help FLYING,.. I only got changing numbers,.. 

So that's where i'm at,.  I guess my new question is :  


HOW DO I USE CHANGING NUMBERS IN INSPECTOR TO FLY.  I never seem to get ahead in Unity.  THIS IS JUST NOT FUN.  Nearly everything else in my 26 year CGI Career has been so much fun, but this is like pulling razor-wire-teeth with a red hot poker...

Is is SO BAD to be an Artist, Musician and Character Animator, and want to make APPS?  Does the community have to PUNISH ARTISTS and CHARACTER ANIMATORS merely for having a DIFFERENT SPECIALITY????, 

  It would be nice to have someone make something DIFFERENT, WOULDN'T It???   I would LOVE to STOP LAUGHING at the CHARACTERS I see in VR.  Not one well done to date.  I suspect other Character Animators like myself, couldn't break thought the sullen, insular, CLIQUE that are these awful, UGLY, SOUL DRAINING,. FORUMS.  

SO,  more and more apps where one:  STANDS IN THE MIDDLE OF A ROOM AND SHOOTS AT THINGS. 

JOY.