using UnityEngine; using System.Collections.Generic; using UnityEngine.EventSystems; using UnityEngine.UI; using System.Linq; using DG.Tweening; using AibisDream; using Yarn.Unity; public class Plug : MonoBehaviour, IDragHandler, IPointerDownHandler, IPointerUpHandler { private Vector3 startPosition; private Quaternion startRotation; private bool isDragging = false; private Socket currentSocket = null; private Image image; private Vector3 pickupOffset = new Vector3(0, 0, 0); private Quaternion pickupRotationOffset = Quaternion.Euler(0, 0, 30); public Socket initialSocket; // new variable public Image plugSprite; // new variable public bool IsInDialogue { get; set; } = false; private Cable cableref; public Cable CableRef { get { return cableref; } set { cableref = value; } } private void Awake() { image = GetComponent(); cableref=FindObjectOfType(); cableref.End=transform; } private void Start() { startPosition = initialSocket.GetPosition(); transform.position = startPosition; initialSocket.InsertPlug(this); plugSprite.enabled = false; DialogController.OnDialogueStart += HandleDialogueStart; DialogController.OnDialogueComplete += HandleDialogueComplete; } void OnDestroy() { // Unsubscribe from dialogue events DialogController.OnDialogueStart -= HandleDialogueStart; DialogController.OnDialogueComplete -= HandleDialogueComplete; } [YarnCommand("Enable_plugInput")] public void HandleDialogueStart() { // Dialogue has started, disable plug interactions IsInDialogue = true; //Debug.Log("in dialogue"); } [YarnCommand("Disable_plugInput")] public void HandleDialogueComplete() { // Dialogue has completed, enable plug interactions IsInDialogue = false; //Debug.Log("dialoguecompleted"); } public void OnPointerDown(PointerEventData eventData) { if (IsInDialogue) { return; } isDragging = true; image.raycastTarget = false; currentSocket?.RemovePlug(this); plugSprite.enabled = true; transform.position += pickupOffset; transform.rotation = pickupRotationOffset; } public void OnDrag(PointerEventData eventData) { if (IsInDialogue) { return; } if (isDragging) { CableRef.End=transform.GetChild(0).transform; Vector3 screenPosition = new Vector3(eventData.position.x, eventData.position.y, Camera.main.WorldToScreenPoint(transform.position).z); Vector3 move = Camera.main.ScreenToWorldPoint(screenPosition); move.z = transform.position.z; transform.position = move; } } public void OnPointerUp(PointerEventData eventData) { if (IsInDialogue) { return; } isDragging = false; image.raycastTarget = true; float closestDistance = Mathf.Infinity; Socket closestSocket = null; Socket[] sockets = FindObjectsOfType().OfType().ToArray(); foreach (Socket socket in sockets) { float distance = Vector3.Distance(transform.position, socket.GetPosition()); if (distance < closestDistance) { closestDistance = distance; closestSocket = socket; } } float snappingRange = 1f; // You might need to adjust this for WorldSpace Canvas if (closestSocket != null && closestDistance <= snappingRange) { currentSocket = closestSocket; currentSocket.InsertPlug(this); transform.position = currentSocket.GetPosition(); plugSprite.enabled = false; //transform.rotation = startRotation; } else { transform.DOMove(startPosition, 0.1f).OnComplete(() => { //transform.rotation = startRotation; initialSocket.InsertPlug(this); plugSprite.enabled = false; // Make the plug sprite disappear when it is inserted into the initial socket. }); } } void OnDrawGizmosSelected() { Gizmos.color = Color.yellow; float snappingRange = 1.0f; // You might need to adjust this for WorldSpace Canvas Gizmos.DrawWireSphere(transform.position, snappingRange); } }