예제 #1
0
 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);
         }
     }
 }
예제 #2
0
        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));
                    }
                }
            }
        }