m0_71275421 2022-07-31 09:11 采纳率: 50%
浏览 72
已结题

UnityUI组件连线问题

我绿色按键并没有安装脚本,但是还是会被连接,有什么办法能不让按键被连接。
如果还能提供撤销上一次连线和删除所有连线的方法,我可以适当追加酬金。

img

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;
using System;

public class Class1 : MonoBehaviour, IPointerDownHandler, IPointerUpHandler, IDragHandler, IEndDragHandler
{
[Header("线宽度")]
public float lineWidth = 3f;
[Header("线颜色")]
public Color lineColor = Color.white;
[Header("线材质")]
public Material dongtai;
[Header("限制多选")]
bool isUP = true;
public Button ok;
//连线
GameObject lineObj = null;
RectTransform lineObjRT = null;
Image lineObjImg;
//初始点
Vector3 startPos = Vector3.zero;
Vector3 endPos = Vector3.zero;
// 最后落脚的物体
GameObject GetObj;

public void OnDrag(PointerEventData eventData)
{
    if (isUP)
    {
        endPos = Input.mousePosition;
        Vector3 durationPos = endPos - startPos;
        lineObjRT.sizeDelta = new Vector2(durationPos.magnitude, lineWidth);
        float angle = Mathf.Atan2(durationPos.y, durationPos.x) * Mathf.Rad2Deg;
        lineObjRT.localRotation = Quaternion.Euler(0, 0, angle);
    }
}

public void OnEndDrag(PointerEventData eventData)
{
    if (isUP)
    {
        if (eventData.pointerEnter != null)
        {
            print(eventData.pointerEnter.name);

            endPos = eventData.pointerEnter.transform.position;
            Vector3 durationPos = endPos - startPos;
            lineObjRT.sizeDelta = new Vector2(durationPos.magnitude, lineWidth);
            float angle = Mathf.Atan2(durationPos.y, durationPos.x) * Mathf.Rad2Deg;
            lineObjRT.localRotation = Quaternion.Euler(0, 0, angle);

            isUP = false;
        }
        else
        {

            print("未选中,结果为空");
        }
    }
}
public void OnPointerDown(PointerEventData eventData)
{


    //限制多选
    if (isUP)
    {
        lineObj = new GameObject("LineObj");
        lineObj.SetActive(false);

        lineObjRT = lineObj.AddComponent<RectTransform>();
        lineObjRT.pivot = new Vector2(0, 0.5f);
        lineObjRT.localScale = Vector3.one;

        lineObjImg = lineObj.AddComponent<Image>();
        lineObjImg.color = lineColor;
        lineObjImg.raycastTarget = false;

        lineObjRT.SetParent(transform);

        startPos = transform.position;

        lineObjRT.position = startPos;
        lineObjRT.sizeDelta = Vector2.zero;
        lineObj.SetActive(true);
    };


}
public void OnPointerUp(PointerEventData eventData)
{
    if (isUP)
    {
        if (eventData.pointerEnter != null)
        {
            GetObj = eventData.pointerEnter;

        }
        if (eventData.pointerEnter == null)
        {
            DestroyImmediate(lineObjRT.gameObject);
        }
    }
    if (eventData.button == PointerEventData.InputButton.Right)
    {
        DestoryAll();
        isUP = true;
    }

}
//销毁自身所有的线
void DestoryAll()
{
    for (int i = 0; i < transform.childCount; i++)
    {
        Destroy(transform.GetChild(i).gameObject);
    }

}

}

  • 写回答

1条回答 默认 最新

  • 周周的Unity小屋 Unity3D领域优质创作者 2022-07-31 12:19
    关注

    你可以采用unity自动组件linerenderer来实现连线呀,这样撤销连线或一键取消连线也容易些

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 8月8日
  • 已采纳回答 7月31日
  • 创建了问题 7月31日

悬赏问题

  • ¥500 寻找一名机械工程师完成pcb主板设计(拒绝AI生成式答案)
  • ¥15 关于#mysql#的问题:UNION ALL(相关搜索:sql语句)
  • ¥15 matlab二位可视化能否针对不同数值范围分开分级?
  • ¥15 已经创建了模拟器但是不能用来运行app 怎么办😭自己搞两天了
  • ¥15 关于#极限编程#的问题,请各位专家解答!
  • ¥20 win11账户锁定时间设为0无法登录
  • ¥45 C#学生成绩管理系统
  • ¥30 matlab appdesigner私有函数嵌套整合
  • ¥15 vb6.0使用jmail接收smtp邮件并另存附件到D盘
  • ¥30 vb net 使用 sendMessage 如何输入鼠标坐标