/// <summary> /// Ajoute un rail et le définit comme sélection actuelle /// </summary> /// <param name="railIndex">Index du prefab à ajouter, depuis la palette de rails</param> private GameObject AddRail(int railIndex) { // Récupération de la sélection actuelle GameObject selected = Selection.activeGameObject; Rail selectedRail = null; if (selected) { selectedRail = selected.GetComponent <Rail>(); // null si l'objet sélectionné n'est pas un rail if (!selectedRail) { // Recherche parmi les parents selectedRail = selected.GetComponentInParent <Rail>(); } if (selectedRail != null) { // Can be null RailAnchor anchor = selectedRail.GetAnchorForEndpoint(Rail.Endpoint.Default); return(AddRail(railIndex, selectedRail, anchor)); } } return(AddRail(railIndex, null, null)); }
/// <summary> /// Ajoute un rail au circuit /// TODO : éviter la redondance toRail = anchor.Parent /// </summary> /// <param name="prefab"></param> /// <param name="toRail"></param> /// <param name="anchor"></param> /// <returns></returns> public Rail AddRail(Rail prefab, Rail toRail = null, RailAnchor anchor = null) { // Vérification si on ajoute à un rail existant if (toRail != null && anchor != null) { // Si le rail possède déjà un rail à cet endroit if (!toRail.CanAppendRail(anchor)) { return(null); } } Rail newRail; #if UNITY_EDITOR newRail = PrefabUtility.InstantiatePrefab(prefab) as Rail; // TODO tester le cast #else newRail = Instantiate(prefab); #endif // Créé à la suite d'un rail existant if (toRail) { toRail.AppendRail(newRail, anchor); } // Créé au centre du circuit (par défaut) else { newRail.transform.parent = transform; newRail.transform.localPosition = Vector3.zero; } return(newRail); }
// Start is called before the first frame update void Start() { Parent = GetComponentInParent <Rail>(); if (Parent == null) { Debug.LogError("Le parent d'un RailConnection doit être un rail"); } }
/// <summary> /// Ajoute un rail au circuit /// </summary> /// <param name="prefab"></param> /// <param name="toRail"></param> /// <param name="point"></param> /// <returns></returns> public Rail AddRail(Rail prefab, Rail toRail, Rail.Endpoint point) { if (toRail != null) { RailAnchor anchor = toRail.GetAnchorForEndpoint(point); if (anchor != null) { return(AddRail(prefab, toRail, anchor)); } } return(AddRail(prefab, null, null)); }
/// <summary> /// Ajoute un rail et le définit comme sélection actuelle /// </summary> /// <param name="railIndex"></param> /// <param name="toRail"></param> /// <param name="anchor"></param> /// <returns></returns> public GameObject AddRail(int railIndex, Rail toRail, RailAnchor anchor) { // TODO : changer le type GameObject newRail = Circuit.AddRail(_railPalette[railIndex].GetComponent <Rail>(), toRail, anchor).gameObject; if (newRail) { // Sélectionne le nouveau rail GameObject[] newSelection = { newRail }; Selection.objects = newSelection; Undo.RegisterCreatedObjectUndo(newRail, "Add Rail"); return(newRail); } else { Debug.LogError("Impossible d'ajouter un rail à cet endroit"); return(null); } }
// Update is called once per frame void Update() { // Initialisation de la caméra à l'ajout du premier rail if (!_cameraInitialized) { if (_circuitEditor.Circuit.RailsCount > 0) { ResetCamera(); _cameraInitialized = true; } } // Inputs \\ // Évènements à la souris restreint à l'extérieur de l'UI if (!EventSystem.current.IsPointerOverGameObject()) { Vector2 mousePos = Input.mousePosition; // Mouse move if (mousePos != _lastMousePos) { if (_circuitEditor.AddMode == CircuitEditor.AddingMode.Scene && !editorCamera.IsMovingView) { // ----------------------------------------------------------------------------------- // Détection de la proximité du curseur avec une extrémité de rail libre float lowestDistance = _maxDistanceSnap; RailAnchor previouslySelectedAnchor = _focusedAnchor; _focusedAnchor = null; foreach (Rail rail in _circuitEditor.Circuit.GetRails()) { foreach (RailAnchor anchor in rail.GetFreeConnections()) { Vector2 guiPosition = editorCamera.Camera.WorldToScreenPoint(anchor.Position); float distance = Vector2.Distance(mousePos, guiPosition); if (distance < lowestDistance) { _focusedAnchor = anchor; lowestDistance = distance; } } } // ----------------------------------------------------------------------------------- // La sélection a changé if (previouslySelectedAnchor != _focusedAnchor) { // Changement de la sélection d'anchor if (_focusedAnchor != null) { if (_railHandle == null) { _railHandle = Instantiate(_circuitEditor.SelectedRail); } // Placement de ce rail selon l'anchor _railHandle.transform.parent = _handlesRoot.transform; _railHandle.GetComponent <Rail>().SetTransformFromAnchor(_focusedAnchor); } // On est sorti de la zone de sqélection, suppression du handle else { DestroyRailHandle(); } } } _lastMousePos = mousePos; } // Clic gauche if (Input.GetMouseButtonDown(0)) { // En mode scène, le clic gauche sert à l'ajout de rail if (_circuitEditor.AddMode == CircuitEditor.AddingMode.Scene && !editorCamera.IsMovingView) { // Un rail est prêt à être placé if (_railHandle && _focusedAnchor) { Rail newRail = _circuitEditor.AddRail(_focusedAnchor.Parent, _focusedAnchor); if (newRail) { DestroyRailHandle(); } } } // En mode clic, le clic gauche sert à la sélection else if (_circuitEditor.AddMode == CircuitEditor.AddingMode.Click) { Ray ray = editorCamera.Camera.ScreenPointToRay(mousePos); int layerMask = 1 << CircuitEditor.railLayer; if (Physics.Raycast(ray, out RaycastHit hit, Mathf.Infinity, layerMask)) { if (hit.collider.TryGetComponent(out Rail selectedRail)) { // Le rail devient la nouvelle sélection Selection = selectedRail; } } else { // Clic dans le vide => déselection Selection = null; } } } }
// Changement de rail private void ChangeRail(Rail newRail) { AttachedRail = newRail; }
// Start is called before the first frame update void Start() { _previousSelectedPath = selectedPath; _rail = GetComponent <Rail>(); }
/// <summary> /// Ajoute un rail au circuit /// </summary> /// <param name="prefab"></param> /// <param name="toRail"></param> /// <param name="railBoundary"></param> /// <param name="pathIndex"></param> /// <returns></returns> public Rail AddRail(Rail prefab, Rail toRail = null, RAIL_BOUNDARY railBoundary = RAIL_BOUNDARY.RAIL_END, int pathIndex = -1) { return(AddRail(prefab, toRail, new Rail.Endpoint(railBoundary, pathIndex))); }