public bool PopulateTouchObjectList() { UIFinger[] fingerObjectFound = GameObject.FindObjectsOfType <UIFinger>(); List <TouchObjectDetails> fingerOjectsFound = new List <TouchObjectDetails>(); foreach (var f in fingerObjectFound) { if (ButtonSizeDeterminedFrom == ButtonSizeDetermining.AutomaticFromSphereCollider) { SphereCollider s = f.GetComponent <SphereCollider>(); if (s != null) //check if there's a radius size we can snag... { //create new object for touch object list TouchObjectDetails t = new TouchObjectDetails(); t.TouchObject = f.gameObject; t.Radius = s.radius; //gather up new touch objects fingerOjectsFound.Add(t); } } else // ...populate finger objects with default finger-size value { //create new object for touch object list TouchObjectDetails t = new TouchObjectDetails(); t.TouchObject = f.gameObject; t.Radius = ButtonSizeRadius; //gather up new touch objects fingerOjectsFound.Add(t); } } TouchObjectsList = fingerOjectsFound.ToArray(); return((TouchObjectsList != null && TouchObjectsList.Length > 0) ? true : false); //return if successfull or not }
private void Update() { if (_setupSuccessfull) { if (!_buttonPressed) //if button unpressed... { foreach (var f in TouchObjectsList) { //try rough sanity check first, before doing the more extensive math if ((f.TouchObject.transform.position - transform.position).sqrMagnitude < (_sanityCheckGlobalDist + f.Radius) * (_sanityCheckGlobalDist + f.Radius)) { //global sizes float fingerRadiusScaled = f.Radius * f.TouchObject.transform.lossyScale.x; float minButtonDimension = 0.001f; Vector3 vecDist = f.TouchObject.transform.position - transform.position; float totalDist = vecDist.magnitude; Vector3 buttonDimensionsGlobal = 0.5f * new Vector3( (_boundsLocal.x * transform.lossyScale.x), (_boundsLocal.z * transform.lossyScale.z), //NOTE: for bounds size from collider, swap y and z... don't know why yet (_boundsLocal.y * transform.lossyScale.y)); if (buttonDimensionsGlobal.x < minButtonDimension) { buttonDimensionsGlobal.x = minButtonDimension; } if (buttonDimensionsGlobal.y < minButtonDimension) { buttonDimensionsGlobal.y = minButtonDimension; } if (buttonDimensionsGlobal.z < minButtonDimension) { buttonDimensionsGlobal.z = minButtonDimension; } //global distances based on local orientation Vector3 distOrientated = new Vector3( Mathf.Abs(Vector3.Dot(transform.right, vecDist)), Mathf.Abs(Vector3.Dot(transform.forward, vecDist)), Mathf.Abs(Vector3.Dot(transform.up, vecDist))); /*DEBUG * DrawLineLocal(this.transform, Vector3.zero, transform.right * buttonDimensionsGlobal.x, Color.red, 0.00035f, 0.5f); * DrawLineLocal(this.transform, Vector3.zero, transform.forward * buttonDimensionsGlobal.y, Color.blue, 0.00035f, 0.5f); * DrawLineLocal(this.transform, Vector3.zero, transform.up * buttonDimensionsGlobal.z, Color.green, 0.00035f, 0.5f); * * DrawLineLocal(this.transform, Vector3.zero, transform.right * distOrientated.x, Color.grey, 0.0001f, 0.5f); * DrawLineLocal(this.transform, Vector3.zero, transform.forward * distOrientated.y, Color.grey, 0.0001f, 0.5f); * DrawLineLocal(this.transform, Vector3.zero, transform.up * distOrientated.z, Color.grey, 0.0001f, 0.5f); */ //distance check (global space) if (distOrientated.x <= buttonDimensionsGlobal.x + fingerRadiusScaled && distOrientated.y <= buttonDimensionsGlobal.y + fingerRadiusScaled && distOrientated.z <= buttonDimensionsGlobal.z + fingerRadiusScaled) { _buttonPressed = true; _fingerPressing = f; Debug.Log(transform.name + " button pressed by " + f.TouchObject.name); //DEBUG //DEBUG f.TouchObject.GetComponent <Renderer>().material.color = Color.green; //TODO: click sound? Results.Invoke(); } /*DEBUG * Debug.Log("Globals | fingerRadius: " + fingerRadiusScaled + " totalDist: " + totalDist + " buttonBoundsGlobal: " + formatVector3(buttonDimensionsGlobal) + " distOrientated: " + formatVector3(distOrientated)); */ } } } else // ...button currently pressed (only care about this one finger, when looking for a release) { //global *release* sizes float fingerRadiusScaled = _fingerPressing.Radius * _fingerPressing.TouchObject.transform.lossyScale.x * ReleaseDistanceModifier; float minButtonDimension = 0.001f; Vector3 vecDist = _fingerPressing.TouchObject.transform.position - transform.position; float totalDist = vecDist.magnitude; Vector3 buttonDimensionsGlobal = 0.5f * new Vector3( (_boundsLocal.x * transform.lossyScale.x), (_boundsLocal.z * transform.lossyScale.z), //NOTE: for bounds size from collider, swap y and z... don't know why yet (_boundsLocal.y * transform.lossyScale.y)); if (buttonDimensionsGlobal.x < minButtonDimension) { buttonDimensionsGlobal.x = minButtonDimension; } if (buttonDimensionsGlobal.y < minButtonDimension) { buttonDimensionsGlobal.y = minButtonDimension; } if (buttonDimensionsGlobal.z < minButtonDimension) { buttonDimensionsGlobal.z = minButtonDimension; } //global distances based on local orientation Vector3 distOrientated = new Vector3( Mathf.Abs(Vector3.Dot(transform.right, vecDist)), Mathf.Abs(Vector3.Dot(transform.forward, vecDist)), Mathf.Abs(Vector3.Dot(transform.up, vecDist))); //distance check (global space) if (distOrientated.x > buttonDimensionsGlobal.x + fingerRadiusScaled || distOrientated.y > buttonDimensionsGlobal.y + fingerRadiusScaled || distOrientated.z > buttonDimensionsGlobal.z + fingerRadiusScaled) { _buttonPressed = false; Debug.Log(transform.name + " button unpressed by " + _fingerPressing.TouchObject.name); //DEBUG //DEBUG _fingerPressing.TouchObject.GetComponent <Renderer>().material.color = Color.white; /* * Debug.Log("Globals | fingerRadius: " + fingerRadiusScaled + " totalDist: " + totalDist + " buttonBoundsGlobal: " + formatVector3(buttonDimensionsGlobal) + " distRotated: " + formatVector3(distOrientated)); */ //Results.Invoke(); } } } else //keep trying until finger object(s) found... { if (Random.Range(0, 90) < 5) { _setupSuccessfull = PopulateTouchObjectList(); if (_setupSuccessfull) { Debug.Log("Finger(s) found! Setup was successful."); } } } }