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); }
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); }
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; } } }
/// <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)); } }
/// <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); } }