コード例 #1
0
    public static CCActionOnBoard GetSSAction(GameObject obj, Vector3 target)
    {
        CCActionOnBoard action = ScriptableObject.CreateInstance <CCActionOnBoard> ();

        action.gameobject = obj;
        action.target     = target;
        return(action);
    }
コード例 #2
0
    /*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);
    }