public override void OnInspectorGUI()
    {
        ObjectDock objectDock = target as ObjectDock;

        if (advancedEditor_EditGameEvent = EditorGUILayout.BeginToggleGroup(new GUIContent("Edit GameEvent", ""), advancedEditor_EditGameEvent))
        {
            foreach (ObjectDockData dockData in objectDock.objectDockData)
            {
                if (dictFlag.ContainsKey(dockData.Name) == false)
                {
                    dictFlag.Add(dockData.Name, false);
                }
                if (dictFlag[dockData.Name] = EditorGUILayout.BeginToggleGroup("Edit ObjectDockData:" + dockData.Name, dictFlag[dockData.Name]))
                {
                    if (dockData.event_at_start.Length > 0)
                    {
                        dockData.event_at_start = EditorCommon.EditGameEventArray("Edit StartEvent:", dockData.event_at_start);
                    }
                    if (dockData.event_at_end.Length > 0)
                    {
                        dockData.event_at_end = EditorCommon.EditGameEventArray("Edit EndEvent:", dockData.event_at_end);
                    }
                }
                EditorGUILayout.EndToggleGroup();
            }
        }
        EditorGUILayout.EndToggleGroup();

        if (autoFillDockWithChildren = EditorGUILayout.BeginToggleGroup(new GUIContent("Fill dockdata of children", ""), autoFillDockWithChildren))
        {
            defaultDockRotationType = (DockRotationType)EditorGUILayout.EnumPopup("Default rotation type:", defaultDockRotationType);
            defaultDockFleeMode     = (DockFleetMode)EditorGUILayout.EnumPopup("Default flee mode:", defaultDockFleeMode);
            if (GUILayout.Button("Fill dockData"))
            {
                ObjectDockData[] dockDatas = new ObjectDockData[objectDock.transform.childCount];
                int counter = 0;
                foreach (Transform child in objectDock.transform)
                {
                    dockDatas[counter]               = new ObjectDockData();
                    dockDatas[counter].Name          = child.name;
                    dockDatas[counter].DockTransform = child;
                    dockDatas[counter].fleeMode      = defaultDockFleeMode;
                    dockDatas[counter].rotationType  = defaultDockRotationType;
                    counter++;
                }
                objectDock.objectDockData = dockDatas;
            }
        }
        EditorGUILayout.EndToggleGroup();

        EditorGUILayout.LabelField("--------------------  Base inspector ----------------------------");
        base.OnInspectorGUI();
        CheckDuplicatedName(objectDock.Name);
    }
Exemple #2
0
    public override void OnInspectorGUI()
    {
        ObjectDock objectDock = target as ObjectDock;
        if(advancedEditor_EditGameEvent = EditorGUILayout.BeginToggleGroup(new GUIContent("Edit GameEvent",""),advancedEditor_EditGameEvent))
        {
            foreach(ObjectDockData dockData in objectDock.objectDockData)
            {
                if(dictFlag.ContainsKey(dockData.Name)==false)
                {
                    dictFlag.Add(dockData.Name, false);
                }
                if(dictFlag[dockData.Name] = EditorGUILayout.BeginToggleGroup("Edit ObjectDockData:" + dockData.Name, dictFlag[dockData.Name]))
                {
                    if(dockData.event_at_start.Length > 0)
                    {
                        dockData.event_at_start = EditorCommon.EditGameEventArray("Edit StartEvent:", dockData.event_at_start);
                    }
                    if(dockData.event_at_end.Length > 0)
                    {
                        dockData.event_at_end = EditorCommon.EditGameEventArray("Edit EndEvent:", dockData.event_at_end);
                    }
                }
                EditorGUILayout.EndToggleGroup();
            }
        }
        EditorGUILayout.EndToggleGroup();

        if(autoFillDockWithChildren = EditorGUILayout.BeginToggleGroup(new GUIContent("Fill dockdata of children",""),autoFillDockWithChildren))
        {
            defaultDockRotationType = (DockRotationType)EditorGUILayout.EnumPopup("Default rotation type:" , defaultDockRotationType);
            defaultDockFleeMode = (DockFleetMode)EditorGUILayout.EnumPopup("Default flee mode:" , defaultDockFleeMode);
            if(GUILayout.Button("Fill dockData"))
            {
                ObjectDockData[] dockDatas = new ObjectDockData[objectDock.transform.childCount];
                int counter = 0;
                foreach(Transform child in objectDock.transform)
                {
                   dockDatas[counter] = new ObjectDockData();
                   dockDatas[counter].Name = child.name;
                   dockDatas[counter].DockTransform = child;
                   dockDatas[counter].fleeMode = defaultDockFleeMode;
                   dockDatas[counter].rotationType = defaultDockRotationType;
                   counter++;
                }
                objectDock.objectDockData = dockDatas;
            }
        }
        EditorGUILayout.EndToggleGroup();

        EditorGUILayout.LabelField("--------------------  Base inspector ----------------------------");
        base.OnInspectorGUI();
        CheckDuplicatedName(objectDock.Name);
    }
Exemple #3
0
    IEnumerator StartDocking(Transform _object)
    {
        for (int i = 0; i < this.objectDockData.Length; i++)
        {
            ObjectDockData dock = this.objectDockData[i];
            yield return(StartCoroutine(Dock(dock, _object)));

//			Debug.Log("Docking done on :" + dock.Name + " at time:" + Time.time);
            // if cycle = true, change the dock index to zero and cycling the dock behavior.
            if ((i == this.objectDockData.Length - 1) && CycleDock)
            {
                i = 0;
            }
        }
    }
Exemple #4
0
    /// <summary>
    /// Dock the dockingObject to specified dock.
    /// </summary>
    IEnumerator Dock(ObjectDockData dock, Transform dockingObject)
    {
        //send start gameevent
        SendGameEvents(dock.event_at_start, dockingObject);

        //it's possible that the game object is destroyed when docking, so we quit docking immediately:
        if (dockingObject == null)
        {
            goto end;
        }

        if (dock.DockImmediately)
        {
            //handle rotation
            switch (dock.rotationType)
            {
            case DockRotationType.Unchange:
                break;

            case DockRotationType.HeadToEnd:
            case DockRotationType.LerpToEndPoint:
                dockingObject.LookAt(dock.DockTransform.position);
                break;

            case DockRotationType.HeadToEnd_XZ:
                dockingObject.LookAt(new Vector3(dock.DockTransform.position.x, dockingObject.position.y, dock.DockTransform.position.z));
                break;

            case DockRotationType.AlighToEndPoint:
                dockingObject.rotation = dock.DockTransform.rotation;
                break;
            }
            //handle position
            dockingObject.position = dock.DockTransform.position;
        }
        else
        {
            float      starttime         = Time.time;
            Vector3    startPos          = dockingObject.position;
            Quaternion startRotation     = dockingObject.rotation;
            Vector3    distance          = dock.DockTransform.position - startPos;
            float      AngleDistance     = Quaternion.Angle(dockingObject.rotation, dock.DockTransform.rotation);
            float      rotateAnglarSpeed = AngleDistance / dock.FleetTime;
            float      totalFleeTime     = 0;
            switch (dock.fleeMode)
            {
            case DockFleetMode.InTime:
                totalFleeTime = dock.FleetTime;
                break;

            case DockFleetMode.InSpeed:
                totalFleeTime = distance.magnitude / dock.FleetSpeed;
                break;

            case DockFleetMode.InGeneralSpeed:
//				Debug.LogError("not supported!");
                totalFleeTime = distance.magnitude / this.GeneralSpeed;
                break;
            }
//			Debug.Log("GameObjct:" + this.gameObject.name + " totalFleeTime" + totalFleeTime);
            while ((Time.time - starttime) <= totalFleeTime)
            {
                //it's possible that the game object is destroyed when docking, so we quit docking immediately:
                if (dockingObject == null)
                {
                    goto end;
                }

                float   percentage  = Mathf.Clamp01((Time.time - starttime) / totalFleeTime);
                float   xnormalized = dock.CurveForXAxis.Evaluate(percentage);
                float   ynormalized = dock.CurveForYAxis.Evaluate(percentage);
                float   znormalized = dock.CurveForZAxis.Evaluate(percentage);
                Vector3 endPosition = new Vector3(distance.x * xnormalized, distance.y * ynormalized, distance.z * znormalized) + startPos;

                //position this frame
                dockingObject.position = endPosition;
                //rotation of this frame
                switch (dock.rotationType)
                {
                case DockRotationType.HeadToEnd:
                    dockingObject.LookAt(dock.DockTransform);
                    break;

                case DockRotationType.HeadToEnd_XZ:
                    dockingObject.LookAt(new Vector3(dock.DockTransform.position.x, dockingObject.transform.position.y, dock.DockTransform.position.z));
                    break;

                case DockRotationType.LerpToEndPoint:
//					Vector3 rotationEulerIncrementValue = dock.RotationCurve.GetValueAtPercentage (percentage);
//					Vector3 rotationEulerAngleOfTheFrame = startRotation.eulerAngles + rotationEulerIncrementValue;
//					dockingObject.rotation = Quaternion.Euler (rotationEulerAngleOfTheFrame);
                    dockingObject.rotation = Quaternion.Slerp(startRotation, dock.DockTransform.rotation, percentage);                    //Quaternion.RotateTowards(dockingObject.rotation, dock.DockTransform.rotation, rotateAnglarSpeed * Time.deltaTime);
                    break;

                case DockRotationType.Unchange:
                    break;
                }
                yield return(null);
            }
        }

        //send end gameevent
//		Debug.Log("GameObjct:" + this.gameObject.name + " send gameEvent");
end:
        SendGameEvents(dock.event_at_end, dockingObject);
        if (dock.PendingTime > 0)
        {
            yield return(new WaitForSeconds(dock.PendingTime));
        }
    }
Exemple #5
0
    /// <summary>
    /// Dock the dockingObject to specified dock.
    /// </summary>
    IEnumerator Dock(ObjectDockData dock, Transform dockingObject)
    {
        //send start gameevent
        SendGameEvents(dock.event_at_start, dockingObject);

        //it's possible that the game object is destroyed when docking, so we quit docking immediately:
        if(dockingObject == null)
        {
            goto end;
        }

        if (dock.DockImmediately)
        {
            //handle rotation
            switch(dock.rotationType)
            {
                case DockRotationType.Unchange:
                     break;
                case DockRotationType.HeadToEnd:
                case DockRotationType.LerpToEndPoint:
                     dockingObject.LookAt(dock.DockTransform.position);
                     break;
                case DockRotationType.HeadToEnd_XZ:
                     dockingObject.LookAt(new Vector3(dock.DockTransform.position.x,dockingObject.position.y,dock.DockTransform.position.z));
                     break;
                case DockRotationType.AlighToEndPoint:
                     dockingObject.rotation = dock.DockTransform.rotation;
                     break;
            }
            //handle position
            dockingObject.position = dock.DockTransform.position;
        }
        else
        {
            float starttime = Time.time;
            Vector3 startPos = dockingObject.position;
            Quaternion startRotation = dockingObject.rotation;
            Vector3 distance = dock.DockTransform.position - startPos;
            float AngleDistance = Quaternion.Angle(dockingObject.rotation, dock.DockTransform.rotation);
            float rotateAnglarSpeed = AngleDistance / dock.FleetTime;
            float totalFleeTime = 0;
            switch(dock.fleeMode)
            {
            case DockFleetMode.InTime:
                totalFleeTime = dock.FleetTime;
                break;
            case DockFleetMode.InSpeed:
                totalFleeTime = distance.magnitude / dock.FleetSpeed;
                break;
            case DockFleetMode.InGeneralSpeed:
        //				Debug.LogError("not supported!");
                totalFleeTime = distance.magnitude / this.GeneralSpeed;
                break;
            }
        //			Debug.Log("GameObjct:" + this.gameObject.name + " totalFleeTime" + totalFleeTime);
            while ((Time.time - starttime) <= totalFleeTime) {

                //it's possible that the game object is destroyed when docking, so we quit docking immediately:
                if(dockingObject == null)
                {
                    goto end;
                }

                float percentage = Mathf.Clamp01((Time.time - starttime) / totalFleeTime);
                float xnormalized = dock.CurveForXAxis.Evaluate(percentage);
                float ynormalized = dock.CurveForYAxis.Evaluate(percentage);
                float znormalized = dock.CurveForZAxis.Evaluate(percentage);
                Vector3 endPosition = new Vector3(distance.x * xnormalized, distance.y * ynormalized, distance.z * znormalized)  + startPos;

                //position this frame
                dockingObject.position = endPosition;
                //rotation of this frame
                switch (dock.rotationType) {
                case DockRotationType.HeadToEnd:
                    dockingObject.LookAt (dock.DockTransform);
                    break;
                case DockRotationType.HeadToEnd_XZ:
                    dockingObject.LookAt (new Vector3 (dock.DockTransform.position.x, dockingObject.transform.position.y, dock.DockTransform.position.z));
                    break;
                case DockRotationType.LerpToEndPoint:
        //					Vector3 rotationEulerIncrementValue = dock.RotationCurve.GetValueAtPercentage (percentage);
        //					Vector3 rotationEulerAngleOfTheFrame = startRotation.eulerAngles + rotationEulerIncrementValue;
        //					dockingObject.rotation = Quaternion.Euler (rotationEulerAngleOfTheFrame);
                    dockingObject.rotation = Quaternion.Slerp(startRotation, dock.DockTransform.rotation, percentage);//Quaternion.RotateTowards(dockingObject.rotation, dock.DockTransform.rotation, rotateAnglarSpeed * Time.deltaTime);
                    break;
                case DockRotationType.Unchange:
                    break;
                }
                yield return null;
            }
        }

        //send end gameevent
        //		Debug.Log("GameObjct:" + this.gameObject.name + " send gameEvent");
        end:
        SendGameEvents(dock.event_at_end, dockingObject);
        if(dock.PendingTime > 0)
        {
            yield return new WaitForSeconds(dock.PendingTime);
        }
    }