private void OnSceneGUI() { if (_mirrorEnabled) { Transform t = ((Transform)target); MirrorRig rig = t.GetComponentInParent <MirrorRig>(); if (rig == null) { return; } Transform m = rig.GetMirrorTransform(t); if (m != null) { Handles.color = Color.red; Handles.DrawLine(m.position, m.position + m.right * .05f); Handles.color = Color.green; Handles.DrawLine(m.position, m.position + m.up * .05f); Handles.color = Color.blue; Handles.DrawLine(m.position, m.position + m.forward * .05f); } } }
public override void OnInspectorGUI() { bool bHasMirror = false; foreach (var obj in targets) { Transform t = ((Transform)obj); MirrorRig rig = t.GetComponentInParent <MirrorRig>(); if (rig != null) { bHasMirror = true; } } #region base tools if (bHasMirror) { EditorGUILayout.BeginHorizontal(); _mirrorEnabled = EditorGUILayout.Toggle("Mirror (M)", _mirrorEnabled); if (GUILayout.Button("Select Mirror")) { List <UnityEngine.Object> selection = new List <UnityEngine.Object>(); foreach (var obj in targets) { Transform mirror = ((Transform)obj).GetComponentInParent <MirrorRig>()?.GetMirrorTransform((Transform)obj); if (mirror != null) { selection.Add(mirror.gameObject); } } if (selection.Count > 0) { Selection.objects = selection.ToArray(); } } EditorGUILayout.EndHorizontal(); if (_mirrorEnabled) { _mirrorPos = EditorGUILayout.Toggle("Mirror Position", _mirrorPos); _mirrorRot = EditorGUILayout.Toggle("Mirror Rotation", _mirrorRot); _mirrorSca = EditorGUILayout.Toggle("Mirror Scale", _mirrorSca); } } #endregion _defaultEditor.OnInspectorGUI(); if (!bHasMirror) { return; } Transform referenceTarget = ((Transform)target); //mirror the values if (_mirrorEnabled && (referenceTarget.position != _originalPosition || referenceTarget.rotation != _originalRotation || referenceTarget.localScale != _originalScale )) { _originalPosition = referenceTarget.position; _originalRotation = referenceTarget.rotation; _originalScale = referenceTarget.localScale; Plane mirror; foreach (var obj in targets) { Transform t = ((Transform)obj); MirrorRig rig = t.GetComponentInParent <MirrorRig>(); if (rig == null) { return; } Transform m = rig.GetMirrorTransform(t); if (m == null) { return; } Vector3 lookatTarget, up; mirror = rig.GetMirrorPlane(t); //we have a mirror for this object Undo.RecordObject(m, "Mirror"); if (_mirrorPos) { m.position = MirrorRig.ReflectionOverPlane(t.position, mirror); } if (_mirrorSca) { m.localScale = t.localScale; } if (_mirrorRot) { //we're going to calculate rotation based on lookat lookatTarget = t.position + t.forward; lookatTarget = MirrorRig.ReflectionOverPlane(lookatTarget, mirror); up = t.position + t.up; up = MirrorRig.ReflectionOverPlane(up, mirror); m.LookAt(lookatTarget, up - m.position); m.Rotate(rig.GetRotationOffset(t)); } } } }