public static CCActionOffBoard GetSSAction(GameObject obj, Vector3 target) { CCActionOffBoard action = ScriptableObject.CreateInstance <CCActionOffBoard> (); action.gameobject = obj; action.target = target; return(action); }
/*the content of OffBoard is also very similar to OnBoard*/ public bool OffBoard() { n++; Debug.Log(n); RaycastHit rayHit; Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); if (Physics.Raycast(ray, out rayHit, 1 << 8)) { /*Priest OffBoard to Start*/ if (rayHit.collider.gameObject.tag.Equals("Priest")) { if (rayHit.collider.gameObject.transform.position.x > 0) { /*How to specify the object is on boat ,just check if it is the child of the boat*/ if (Boat.transform.position.Equals(BoatPositionOne) && rayHit.collider.gameObject.transform.IsChildOf(Boat.transform)) { int indexOfPositionOnStart = UnOccupiedStartPosition.Count; Transform father = FindRootParent(rayHit.collider.gameObject.transform); Vector3 ObjectOriginalPosition = father.localPosition; /*delete the child of boat,otherwise boat will Onland*/ father.SetParent(null); CCActionOffBoard offBoard = CCActionOffBoard.GetSSAction(father.gameObject, UnOccupiedStartPosition[indexOfPositionOnStart - 1]); actionManager.RunAction(offBoard, null); // father.position= UnOccupiedStartPosition[indexOfPositionOnStart-1]; OccupiedStartPosition.Add(UnOccupiedStartPosition[indexOfPositionOnStart - 1]); UnOccupiedStartPosition.RemoveAt(indexOfPositionOnStart - 1); UnOccupiedBoatPosition.Add(ObjectOriginalPosition); OccupiedBoatPosition.Remove(ObjectOriginalPosition); StartPriests.Add(father.gameObject); BoatPriests.Remove(father.gameObject); return(true); } } else { /*Priest OffBoard to End*/ if (Boat.transform.position.Equals(BoatPositionTwo) && rayHit.collider.gameObject.transform.IsChildOf(Boat.transform)) { int indexOfPositionOnEnd = UnOccupiedEndPosition.Count; // Transform father = rayHit.collider.gameObject.transform.parent; Transform father = FindRootParent(rayHit.collider.gameObject.transform); Vector3 ObjectOriginalPosition = father.localPosition; father.SetParent(null); CCActionOffBoard offBoard = CCActionOffBoard.GetSSAction(father.gameObject, UnOccupiedEndPosition[indexOfPositionOnEnd - 1]); actionManager.RunAction(offBoard, null); // father.position= UnOccupiedEndPosition[indexOfPositionOnEnd-1]; OccupiedEndPosition.Add(UnOccupiedEndPosition[indexOfPositionOnEnd - 1]); UnOccupiedEndPosition.RemoveAt(indexOfPositionOnEnd - 1); UnOccupiedBoatPosition.Add(ObjectOriginalPosition); OccupiedBoatPosition.Remove(ObjectOriginalPosition); EndPriests.Add(father.gameObject); BoatPriests.Remove(father.gameObject); if (EndDevils.Count == 3 && EndPriests.Count == 3) { checkResult(); } return(true); } } } else if (rayHit.collider.gameObject.tag.Equals("Devil")) { /*Devil OffBoard to Start*/ if (rayHit.collider.gameObject.transform.position.x > 0) { if (Boat.transform.position.Equals(BoatPositionOne) && rayHit.collider.gameObject.transform.IsChildOf(Boat.transform)) { int indexOfPositionOnStart = UnOccupiedStartPosition.Count; // Transform father = rayHit.collider.gameObject.transform.parent; Transform father = FindRootParent(rayHit.collider.gameObject.transform); Vector3 ObjectOriginalPosition = father.localPosition; father.SetParent(null); CCActionOffBoard offBoard = CCActionOffBoard.GetSSAction(father.gameObject, UnOccupiedStartPosition[indexOfPositionOnStart - 1]); actionManager.RunAction(offBoard, null); // father.position= UnOccupiedStartPosition[indexOfPositionOnStart-1]; OccupiedStartPosition.Add(UnOccupiedStartPosition[indexOfPositionOnStart - 1]); UnOccupiedStartPosition.RemoveAt(indexOfPositionOnStart - 1); UnOccupiedBoatPosition.Add(ObjectOriginalPosition); OccupiedBoatPosition.Remove(ObjectOriginalPosition); StartDevils.Add(father.gameObject); BoatDevils.Remove(father.gameObject); return(true); } } else { /*Devil OffBoard to End*/ if (Boat.transform.position.Equals(BoatPositionTwo) && rayHit.collider.gameObject.transform.IsChildOf(Boat.transform)) { int indexOfPositionOnEnd = UnOccupiedEndPosition.Count; // Transform father = rayHit.collider.gameObject.transform.parent; Transform father = FindRootParent(rayHit.collider.gameObject.transform); Vector3 ObjectOriginalPosition = father.localPosition; father.SetParent(null); CCActionOffBoard offBoard = CCActionOffBoard.GetSSAction(father.gameObject, UnOccupiedEndPosition[indexOfPositionOnEnd - 1]); actionManager.RunAction(offBoard, null); // father.position= UnOccupiedEndPosition[indexOfPositionOnEnd-1]; OccupiedEndPosition.Add(UnOccupiedEndPosition[indexOfPositionOnEnd - 1]); UnOccupiedEndPosition.RemoveAt(indexOfPositionOnEnd - 1); UnOccupiedBoatPosition.Add(ObjectOriginalPosition); OccupiedBoatPosition.Remove(ObjectOriginalPosition); EndDevils.Add(father.gameObject); BoatDevils.Remove(father.gameObject); if (EndDevils.Count == 3 && EndPriests.Count == 3) { checkResult(); } 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); }