public static CCActionOnBoard GetSSAction(GameObject obj, Vector3 target) { CCActionOnBoard action = ScriptableObject.CreateInstance <CCActionOnBoard> (); action.gameobject = obj; action.target = target; return(action); }
/*OnBoard()mainly solve four cases. These cases' codes are very similar. * And the four cases are :Priest OnBoard from Start;Priest OnBoard from End; * Devil OnBoard From Start ;Devil OnBoard from End*/ public bool OnBoard() { RaycastHit rayHit; /*we use rayHit to catch the clicked object*/ Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); /*choose the layer 8 because I set the Priest and Devil in Layer 8*/ if (Physics.Raycast(ray, out rayHit, 1 << 8)) { Debug.Log(rayHit.transform.gameObject.tag); /*I use tag to distinguish Priest and Devil*/ if (rayHit.transform.gameObject.tag.Equals("Priest")) { /*And I use axis X to know whether is Start or End.If x is positive then Start,otherwise End*/ if (rayHit.collider.gameObject.transform.position.x > 0) { /*IF object want to Board from Start,the boat must park at BoatPositionOne * and there is free position on Boat.*/ if (Boat.transform.position.Equals(BoatPositionOne) && (BoatDevils.Count + BoatPriests.Count) < 2) { /*Just use the list as stack ,choose the top posiiton of list */ int indexOfPositionOnBoat = UnOccupiedBoatPosition.Count; /*Because The father object is empty,the ray will hit the child so we should get the parent of the child*/ Transform father = FindRootParent(rayHit.collider.gameObject.transform); Vector3 ObjectOriginalPosition = father.position; /*When the object OnBoard ,it will move together with the boat.So let it be the child of the boat.*/ father.SetParent(Boat.transform); CCActionOnBoard onBoard = CCActionOnBoard.GetSSAction(father.gameObject, UnOccupiedBoatPosition [indexOfPositionOnBoat - 1]); actionManager.RunAction(onBoard, null); /*OccupiedBoatposition will increase and the UnOccupiedBoatposition will decrease.The StartPosition is as the same*/ OccupiedBoatPosition.Add(UnOccupiedBoatPosition[indexOfPositionOnBoat - 1]); UnOccupiedBoatPosition.RemoveAt(indexOfPositionOnBoat - 1); UnOccupiedStartPosition.Add(ObjectOriginalPosition); OccupiedStartPosition.Remove(ObjectOriginalPosition); /*Priest move from Start to Boat so we need to keep such information on Lists*/ StartPriests.Remove(father.gameObject); BoatPriests.Add(father.gameObject); return(true); } } else { /*Priest OnBoard from End the detail is as the same as above*/ if (Boat.transform.position.Equals(BoatPositionTwo) && (BoatDevils.Count + BoatPriests.Count) < 2) { int indexOfPositionOnBoat = UnOccupiedBoatPosition.Count; Transform father = FindRootParent(rayHit.collider.gameObject.transform); Vector3 ObjectOriginalPosition = father.position; father.SetParent(Boat.transform); CCActionOnBoard onBoard = CCActionOnBoard.GetSSAction(father.gameObject, UnOccupiedBoatPosition [indexOfPositionOnBoat - 1]); actionManager.RunAction(onBoard, null); // father.localPosition= UnOccupiedBoatPosition[indexOfPositionOnBoat-1]; OccupiedBoatPosition.Add(UnOccupiedBoatPosition[indexOfPositionOnBoat - 1]); UnOccupiedBoatPosition.RemoveAt(indexOfPositionOnBoat - 1); UnOccupiedEndPosition.Add(ObjectOriginalPosition); OccupiedEndPosition.Remove(ObjectOriginalPosition); EndPriests.Remove(father.gameObject); BoatPriests.Add(father.gameObject); return(true); } } } else if (rayHit.collider.gameObject.tag.Equals("Devil")) { /*Devil OnBoard from Start*/ if (rayHit.collider.gameObject.transform.position.x > 0) { if (Boat.transform.position.Equals(BoatPositionOne) && (BoatDevils.Count + BoatPriests.Count) < 2) { int indexOfPositionOnBoat = UnOccupiedBoatPosition.Count; Transform father = FindRootParent(rayHit.collider.gameObject.transform); Vector3 ObjectOriginalPosition = father.position; father.SetParent(Boat.transform); CCActionOnBoard onBoard = CCActionOnBoard.GetSSAction(father.gameObject, UnOccupiedBoatPosition [indexOfPositionOnBoat - 1]); actionManager.RunAction(onBoard, null); // father.localPosition= UnOccupiedBoatPosition[indexOfPositionOnBoat-1]; OccupiedBoatPosition.Add(UnOccupiedBoatPosition[indexOfPositionOnBoat - 1]); UnOccupiedBoatPosition.RemoveAt(indexOfPositionOnBoat - 1); UnOccupiedStartPosition.Add(ObjectOriginalPosition); OccupiedStartPosition.Remove(ObjectOriginalPosition); StartDevils.Remove(father.gameObject); BoatDevils.Add(father.gameObject); return(true); } } else { /*Devil OnBoard from End*/ if (Boat.transform.position.Equals(BoatPositionTwo) && (BoatDevils.Count + BoatPriests.Count) < 2) { int indexOfPositionOnBoat = UnOccupiedBoatPosition.Count; Transform father = FindRootParent(rayHit.collider.gameObject.transform); Vector3 ObjectOriginalPosition = father.position; father.SetParent(Boat.transform); CCActionOnBoard onBoard = CCActionOnBoard.GetSSAction(father.gameObject, UnOccupiedBoatPosition [indexOfPositionOnBoat - 1]); actionManager.RunAction(onBoard, null); // father.localPosition= UnOccupiedBoatPosition[indexOfPositionOnBoat-1]; OccupiedBoatPosition.Add(UnOccupiedBoatPosition[indexOfPositionOnBoat - 1]); UnOccupiedBoatPosition.RemoveAt(indexOfPositionOnBoat - 1); UnOccupiedEndPosition.Add(ObjectOriginalPosition); OccupiedEndPosition.Remove(ObjectOriginalPosition); EndDevils.Remove(father.gameObject); BoatDevils.Add(father.gameObject); return(true); } } } } Debug.Log("Direction:" + PositionBoatWillGoTo.x + " StartPriest:" + StartPriests.Count + " StartDevils:" + StartDevils.Count + " BoatPriests" + BoatPriests.Count + " BoatDevils:" + BoatDevils.Count + " EndPriests:" + EndPriests.Count + " EndDevils:" + EndDevils.Count); return(false); }