private void OnDrawGizmos() { // snapping to cone if (!Application.isPlaying) { if (transform.parent == null) { return; } Linkage3D linkage; if (linkage = transform.parent.GetComponent <Linkage3D>()) { float angleHere = Vector3.SignedAngle( Vector3.right, new Vector3(transform.localPosition.x, 0, transform.localPosition.z), Vector3.up); float radiusHere = Mathf.Lerp( linkage.coneRadius, 0, Mathf.InverseLerp(0, linkage.coneHeight, transform.localPosition.y)); Vector3 snappedPosition = Quaternion.Euler(0, angleHere, 0) * (Vector3.right * radiusHere) + Vector3.up * transform.localPosition.y; transform.localPosition = snappedPosition; transform.LookAt(linkage.transform.position + Vector3.up * linkage.coneHeight); } } // display edges foreach (Joint3D j in initialEdges) { Gizmos.DrawLine(transform.position, j.transform.position); } if (isAnchored) { //Gizmos.DrawWireSphere(transform.position, transform.lossyScale.x / 4f); } }
public void OnSceneGUI() { Linkage3D links = (Linkage3D)target; if (Event.current.type == EventType.MouseDown && Event.current.button == 1) { Ray worldRay = HandleUtility.GUIPointToWorldRay(Event.current.mousePosition); RaycastHit hitInfo; if (Physics.Raycast(worldRay, out hitInfo)) { Joint3D selected; if (selected = hitInfo.collider.GetComponentInParent <Joint3D>()) { if (previousSelection == null) // first selection { previousSelection = selected; } else // second selection { if (previousSelection == selected) // selected again, undo selection { previousSelection = null; } else if (previousSelection.initialEdges.Contains(selected)) { Undo.RecordObject(previousSelection, "Remove Edge"); previousSelection.initialEdges.Remove(selected); PrefabUtility.RecordPrefabInstancePropertyModifications(previousSelection); } else if (selected.initialEdges.Contains(previousSelection)) { Undo.RecordObject(selected, "Remove Edge"); selected.initialEdges.Remove(previousSelection); PrefabUtility.RecordPrefabInstancePropertyModifications(selected); } else // didn't exist yet, add from previous to new { Undo.RecordObject(previousSelection, "Add Edge"); previousSelection.initialEdges.Add(selected); PrefabUtility.RecordPrefabInstancePropertyModifications(previousSelection); } previousSelection = null; } Event.current.Use(); } } } if (previousSelection) { Handles.DrawWireCube(previousSelection.transform.position, previousSelection.transform.lossyScale / 4f); } }
private void Start() { linkage = GetComponentInParent <Linkage3D>(); }