新增拆除功能

This commit is contained in:
2024-11-06 22:43:36 +08:00
parent 3ee9b040d2
commit 0b104f435f
13 changed files with 1073 additions and 130 deletions
+75 -50
View File
@@ -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; // 未被遮挡
}
}