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); } }
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); } }