Esempio n. 1
0
        private void server_StartExperiment()
        {
            //Unhighlights everything
            for (int index = 0; index < targets.Count; index++)
            {
                targets[index].Highlighted = false;
            }

            //resets the zones to false
            for (int zone = 0; zone < doneZones.Length; zone++)
            {
                doneZones[zone] = false;
            }

            //reset widths to false
            for (int width = 0; width < doneWidths.Length; width++)
            {
                doneWidths[width] = false;
            }

            //reset distances to false
            for (int dist = 0; dist < doneDistances.Length; dist++)
            {
                doneDistances[dist] = false;

                // Do not do distances that will put targets out of view in view based.
                if (RefFrame == ReferenceFrame.View && dist > 1)
                {
                    doneDistances[dist] = true;
                }
                // Do not do distances that are all in view
                else if (RefFrame == ReferenceFrame.Body && dist < 2)
                {
                    doneDistances[dist] = true;
                }
            }

            //determines the initial zone (fixed to control for purposes of ring experiment)
            DistanceZones newZone = DistanceZones.Control;
            //determines initial width
            TargetWidths newWidth = (TargetWidths)UnityEngine.Random.Range(0, doneWidths.Length);

            while (doneWidths[(int)newWidth])
            {
                newWidth = (TargetWidths)UnityEngine.Random.Range(0, doneWidths.Length);
            }
            //determines initial distance
            TargetDistances newDistance = (TargetDistances)UnityEngine.Random.Range(0, doneDistances.Length);

            while (doneDistances[(int)newDistance])
            {
                newDistance = (TargetDistances)UnityEngine.Random.Range(0, doneDistances.Length);
            }

            all_UpdateReferenceFrame(newZone.ToString(), RefFrame.ToString(), newWidth.ToString(), newDistance.ToString());
            if (Network.isClient || Network.isServer)
            {
                networkView.RPC("all_UpdateReferenceFrame", RPCMode.OthersBuffered, newZone.ToString(), RefFrame.ToString(), newWidth.ToString(), newDistance.ToString());
            }
            doneZones[(int)newZone]         = true;
            doneWidths[(int)newWidth]       = true;
            doneDistances[(int)newDistance] = true;

            //Creates the trial tracking objects
            int nextTarget = UnityEngine.Random.Range(0, targets.Count);

            all_SetTargetAndTrial(nextTarget, 0);
            if (Network.isServer)
            {
                //if (Network.isClient || Network.isServer)
                networkView.RPC("all_SetTargetAndTrial", RPCMode.Others, nextTarget, experiment.Trial.TrialNro);
            }

            lastTarget = TargetSet;

            //creates the offscreen targeting objects
            GameObject osStart = GetInteractionZoneGO();
            GameObject osEnd   = targets[currentTarget].gameObject;

            all_SynchOffScreenTargets(osStart.name, osEnd.name);
            if (Network.isServer)
            {
                //if (Network.isClient || Network.isServer)
                networkView.RPC("all_SynchOffScreenTargets", RPCMode.Others, osStart.name, osEnd.name);
            }
        }
Esempio n. 2
0
        public void CreateNewTrial(SelectionEventArgs args, GameObject target, int trialNr, DistanceZones zone = DistanceZones.Control, ReferenceFrame refFrame = ReferenceFrame.World)
        {
            Started = true;

            //If it receives the trial number as a parameter it uses that number, else it increases from the previous trial
            Vector3 lastTargetPos = Trial.Target == null ? Vector3.zero : Trial.LastTargetPosition;

            Trial                    = new TrialInformation();
            Trial.RefFrame           = refFrame;
            Trial.Zone               = zone;
            Trial.Controller         = Settings.ControllerType;
            Trial.TrialNro           = trialNr;
            Trial.TrialWidth         = target.transform.localScale.x;
            Trial.TrialDistance      = (lastTargetPos - target.transform.position).magnitude;
            Trial.Target             = target;
            Trial.LastTargetPosition = lastTargetPos;
            Trial.StartTime          = System.DateTime.Now;

            if (args != null)
            {
                Trial.ControllerInitialPx   = args.ControllerEvent.PointerPx;
                Trial.ControllerInitialPos  = args.ControllerEvent.PointerPos;
                Trial.ControllerInitialQuat = args.ControllerEvent.PointerQuat;
            }

            Trial.CameraInitialPos  = Camera.transform.position;
            Trial.CameraInitialQuat = Camera.transform.rotation;

            if (Settings.IsCursorBasedController) //Touch, Gyro, Head (gyro)
            {
                Vector2 origin = (Vector2)LeftEyeCamera.WorldToScreenPoint(lastTargetPos);
                Vector2 end    = (Vector2)LeftEyeCamera.WorldToScreenPoint(target.transform.position);
                Trial.InitialDistanceToTarget           = (end - origin).magnitude;
                Trial.InitialDistanceToTargetPxAdjusted = CalculateAdjustedDistance(origin, end, new Vector3(2f, 1.0f, 1.0f));
            }
            else if (Settings.ControllerType == ControllerType.HandGesture) //Hand
            {
                Trial.InitialDistanceToTarget = (Trial.ControllerInitialPos - target.transform.position).magnitude;
            }
            else //IsRotationBasedController -- Raycast, Head
            {
                Trial.InitialDistanceToTarget = Vector3.Angle(Trial.ControllerInitialPos - lastTargetPos, Trial.ControllerInitialPos - target.transform.position);
            }
        }