コード例 #1
0
        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
        }
コード例 #2
0
        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.");
                    }
                }
            }
        }