新增拆除功能
This commit is contained in:
@@ -135,63 +135,88 @@ public class Plug : MonoBehaviour, IDragHandler, IPointerDownHandler, IPointerUp
|
||||
}
|
||||
}
|
||||
|
||||
public void OnPointerUp(PointerEventData eventData)
|
||||
public void OnPointerUp(PointerEventData eventData)
|
||||
{
|
||||
if (!IsActive || IsInDialogue)
|
||||
{
|
||||
if (!IsActive)
|
||||
{
|
||||
return;
|
||||
}
|
||||
if (IsInDialogue)
|
||||
{
|
||||
return;
|
||||
}
|
||||
isDragging = false;
|
||||
image.raycastTarget = true;
|
||||
// 通知 DialogueManager 结束拖拽
|
||||
DialogueManager.Instance.SetDragging(false);
|
||||
|
||||
float closestDistance = Mathf.Infinity;
|
||||
Socket closestSocket = null;
|
||||
|
||||
Socket[] sockets = FindObjectsOfType<MonoBehaviour>().OfType<Socket>().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);
|
||||
OnPlugInserted?.Invoke(this); // 触发插入事件
|
||||
transform.position = currentSocket.GetPosition();
|
||||
plugSprite.enabled = false;
|
||||
//transform.rotation = startRotation;
|
||||
}
|
||||
else
|
||||
{
|
||||
transform.DOMove(startPosition, 0.1f).OnComplete(() =>
|
||||
{
|
||||
//transform.rotation = startRotation;
|
||||
initialSocket.InsertPlug(this);
|
||||
OnPlugInserted?.Invoke(this); // 触发插入事件
|
||||
plugSprite.enabled =false; // Make the plug sprite disappear when it is inserted into the initial socket.
|
||||
});
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
isDragging = false;
|
||||
image.raycastTarget = true;
|
||||
|
||||
// 通知 DialogueManager 结束拖拽
|
||||
DialogueManager.Instance.SetDragging(false);
|
||||
|
||||
// 通过射线检测来检查是否有Socket
|
||||
PointerEventData pointerEventData = new PointerEventData(EventSystem.current)
|
||||
{
|
||||
position = eventData.position
|
||||
};
|
||||
|
||||
List<RaycastResult> raycastResults = new List<RaycastResult>();
|
||||
GraphicRaycaster graphicRaycaster = GameObject.Find("FaceCanvas").GetComponent<GraphicRaycaster>();
|
||||
graphicRaycaster.Raycast(pointerEventData, raycastResults);
|
||||
// 查找是否有Socket被检测到
|
||||
Socket targetSocket = raycastResults
|
||||
.Where(result => result.gameObject.GetComponent<Socket>() != null)
|
||||
.Select(result => result.gameObject.GetComponent<Socket>())
|
||||
.FirstOrDefault();
|
||||
|
||||
if (targetSocket != null)
|
||||
{
|
||||
// 插入到找到的Socket
|
||||
currentSocket = targetSocket;
|
||||
currentSocket.InsertPlug(this);
|
||||
OnPlugInserted?.Invoke(this); // 触发插入事件
|
||||
transform.position = currentSocket.GetPosition();
|
||||
plugSprite.enabled = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
// 没有找到有效的Socket,将插头移动回原位置
|
||||
transform.DOMove(startPosition, 0.1f).OnComplete(() =>
|
||||
{
|
||||
initialSocket.InsertPlug(this);
|
||||
OnPlugInserted?.Invoke(this); // 触发插入事件
|
||||
plugSprite.enabled = false;
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void OnDrawGizmosSelected()
|
||||
{
|
||||
Gizmos.color = Color.yellow;
|
||||
float snappingRange = 1.0f; // You might need to adjust this for WorldSpace Canvas
|
||||
Gizmos.DrawWireSphere(transform.position, snappingRange);
|
||||
}
|
||||
private bool IsSocketBlocked(Socket socket)
|
||||
{
|
||||
// 获取Socket的屏幕位置
|
||||
Vector2 socketPosition = RectTransformUtility.WorldToScreenPoint(Camera.main, socket.GetComponent<RectTransform>().position);
|
||||
|
||||
// 创建PointerEventData进行射线检测
|
||||
PointerEventData pointerEventData = new PointerEventData(EventSystem.current)
|
||||
{
|
||||
position = socketPosition
|
||||
};
|
||||
|
||||
// 使用GraphicRaycaster检测遮挡
|
||||
GraphicRaycaster graphicRaycaster = GameObject.Find("FaceCanvas").GetComponent<GraphicRaycaster>();
|
||||
List<RaycastResult> results = new List<RaycastResult>();
|
||||
graphicRaycaster.Raycast(pointerEventData, results);
|
||||
|
||||
// 如果检测到其他UI元素遮挡,返回true
|
||||
foreach (var result in results)
|
||||
{
|
||||
if (result.gameObject != socket.gameObject)
|
||||
{
|
||||
return true; // 被遮挡
|
||||
}
|
||||
}
|
||||
|
||||
return false; // 未被遮挡
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user