// TODO: Something weird is going on with the spawn, at least with robots with manipulators. Reset is fine. /// <summary> /// Loads and initializes the physical manipulator object (used in Mix and Match mode) /// </summary> /// <param name="directory">Folder directory of the manipulator</param> /// <param name="robotGameObject">GameObject of the robot the manipulator will be attached to</param> public bool InitializeManipulator(string directory) { ManipulatorObject = new GameObject("Manipulator"); ManipulatorObject.transform.position = robotStartPosition + manipulatorOffset; RigidNode_Base.NODE_FACTORY = delegate(Guid guid) { return(new RigidNode(guid)); }; List <RigidNode_Base> nodes = new List <RigidNode_Base>(); //TO-DO: Read .robot instead (from the new exporters if they are implemented). Maybe need a RobotSkeleton class manipulatorNode = BXDExtensions.ReadSkeletonSafe(directory + Path.DirectorySeparatorChar + "skeleton") as RigidNode; manipulatorNode.ListAllNodes(nodes); //Load node_0 for attaching manipulator to robot RigidNode node = (RigidNode)nodes[0]; node.CreateTransform(ManipulatorObject.transform); if (!node.CreateMesh(directory + Path.DirectorySeparatorChar + node.ModelFileName)) { Destroy(ManipulatorObject); return(false); } node.CreateManipulatorJoint(gameObject); node.MainObject.AddComponent <Tracker>().Trace = true; //Load other nodes associated with the manipulator for (int i = 1; i < nodes.Count; i++) { RigidNode otherNode = (RigidNode)nodes[i]; otherNode.CreateTransform(ManipulatorObject.transform); if (!otherNode.CreateMesh(directory + Path.DirectorySeparatorChar + otherNode.ModelFileName)) { Destroy(ManipulatorObject); return(false); } otherNode.MainObject.AddComponent <Tracker>().Trace = true; } RootNode.GenerateWheelInfo(); for (int i = 1; i < nodes.Count; i++) { RigidNode otherNode = (RigidNode)nodes[i]; otherNode.CreateJoint(this); } RotateRobot(robotStartOrientation); RobotHasManipulator = true; return(true); }
/// <summary> /// Initializes physical robot based off of robot directory. /// </summary> /// <param name="directory">folder directory of robot</param> /// <returns></returns> public bool InitializeRobot(string directory) { RobotDirectory = directory; RobotName = new DirectoryInfo(directory).Name; //Deletes all nodes if any exist, take the old node transforms out from the robot object foreach (Transform child in transform) { Destroy(child.gameObject); } robotStartPosition = FieldDataHandler.robotSpawn != new Vector3(99999, 99999, 99999) ? FieldDataHandler.robotSpawn : robotStartPosition; transform.position = robotStartPosition; //Sets the position of the object to the set spawn point robotStartOrientation = FieldDataHandler.robotSpawnOrientation; if (!File.Exists(directory + Path.DirectorySeparatorChar + "skeleton.bxdj") && !File.Exists(directory + Path.DirectorySeparatorChar + "skeleton.json")) { return(false); } OnInitializeRobot(); //Loads the node and skeleton data RigidNode_Base.NODE_FACTORY = delegate(Guid guid) { return(new RigidNode(guid)); }; List <RigidNode_Base> nodes = new List <RigidNode_Base>(); RootNode = BXDExtensions.ReadSkeletonSafe(directory + Path.DirectorySeparatorChar + "skeleton") as RigidNode; RootNode.ListAllNodes(nodes); emuList = new List <EmuNetworkInfo>(); foreach (RigidNode_Base Base in RootNode.ListAllNodes()) { try { if (Base.GetSkeletalJoint() != null && Base.GetSkeletalJoint().attachedSensors != null) { foreach (RobotSensor sensor in Base.GetSkeletalJoint().attachedSensors) { if (sensor.type == RobotSensorType.ENCODER) { emuList.Add(new EmuNetworkInfo { encoderTickCount = 0, RobotSensor = sensor, wheel = Base, wheel_radius = 0 }); } } } } catch (Exception e) { Debug.Log(e.ToString()); } } //Initializes the wheel variables float collectiveMass = 0f; if (!ConstructRobot(nodes, ref collectiveMass)) { return(false); } foreach (BRaycastRobot r in GetComponentsInChildren <BRaycastRobot>()) { r.RaycastRobot.OverrideMass = collectiveMass; r.RaycastRobot.RootRigidBody = (RigidBody)((RigidNode)nodes[0]).MainObject.GetComponent <BRigidBody>().GetCollisionObject(); } OnRobotSetup(); RotateRobot(robotStartOrientation); return(true); }