【Unity】关系网络图的简单实现

1.效果展示

unity关系网络图

2.简介

本项目是以UGUI为基础创建的一个简单的可交互关系网络图。基本实现了节点的添加、关联、创建等功能。提供了一种在Unity中实现可交互的关系网络图的思路。
本项目中节点与线段是以预制体的形式生成的,所绘制的关系线段也为UGUI,是一个继承于Graphic的类,只适用于UI层,若希望在3D项目中绘制线段,可使用Unity原生LineRender。

3.操作说明

点击Create按钮会创建一个节点。
点击某个节点会以绿色高亮显示,并且其关联节点和线段将以黄色高亮显示。
可以拖拽某个节点到任意位置。
点击DrawLine按钮会开启连线模式,会在先后点击的两个节点之间创建一条UGUI线段,该线段会随着关联节点的位置实时更新。
点击Delete按钮将会删除当前选中的节点,与之关联的线段也会随之删除。

4.核心代码

1)Data.cs

//基本的数据结构
public class Node
{
    public string Name;
    public List<Node> Children;
}

public class Line
{
    public string Name;
    public Node Node_1;
    public Node Node_2;
}

2)DragEvent.cs

//为节点添加拖拽事件
public class DragEvent : MonoBehaviour, IDragHandler,IBeginDragHandler,IEndDragHandler
{
    private RectTransform panelRectTransform;

    private void Awake()
    {
        panelRectTransform = transform as RectTransform;
    }
    public void OnDrag(PointerEventData eventData)
    {
        Vector3 pos;
        RectTransformUtility.ScreenPointToWorldPointInRectangle(panelRectTransform, eventData.position, eventData.enterEventCamera, out pos);
        transform.position = pos;
    }

    public void OnBeginDrag(PointerEventData eventData)
    {
        
    }

    public void OnEndDrag(PointerEventData eventData)
    {
        
    }
}

3)UILineRenderer.cs

//挂载在线条对象上的脚本,控制线条的绘制
[RequireComponent(typeof(CanvasRenderer))]
public class UILineRenderer : Graphic
{

    public Vector2 startPoint;
    public Vector2 endPoint;
    public float thickness = 2f;

    public Line line;

    protected override void OnPopulateMesh(VertexHelper vh)
    {
        vh.Clear();

        var rect = rectTransform.rect;
        var dir = (endPoint - startPoint).normalized;
        var normal = new Vector2(-dir.y, dir.x) * thickness / 2f;

        var corner1 = startPoint - normal;
        var corner2 = startPoint + normal;
        var corner3 = endPoint + normal;
        var corner4 = endPoint - normal;

        vh.AddVert(corner1, color, new Vector2(0, 0));
        vh.AddVert(corner2, color, new Vector2(0, 1));
        vh.AddVert(corner3, color, new Vector2(1, 1));
        vh.AddVert(corner4, color, new Vector2(1, 0));

        vh.AddTriangle(0, 1, 2);
        vh.AddTriangle(2, 3, 0);
    }

    // Call this method to update line position
    public void SetPositions(Vector2 start, Vector2 end)
    {
        startPoint = start;
        endPoint = end;
        SetVerticesDirty(); // Causes the graphic to redraw
    }
}

4)ImageNode.cs

//挂载在节点上的脚本,用于注册节点和交互事件
public class ImageNode : MonoBehaviour
{
    public Node ImgNode;

    public void Init(string name,UnityAction action)
    {
        ImgNode=new Node();
        ImgNode.Name=name;
        ImgNode.Children=new List<Node>();
        transform.Find("Text").GetComponent<Text>().text = name;
        transform.GetComponent<Button>().onClick.AddListener(action);
    }

    public void AddNodeIntoChildren(Node node)
    {
        if(ImgNode.Children.Contains(node))
        {
            return;
        }
        ImgNode.Children.Add(node);
    }
}

5.Package

百度云
链接:https://pan.baidu.com/s/1Baaj034-gMZhjTY4YoDOvw?pwd=7ofb
提取码:7ofb

  • 9
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Unity 中下载网络图片可以使用 UnityWebRequest 类。以下是一个示例代码,演示如何下载网络图片并将其保存到本地: ```csharp using UnityEngine; using UnityEngine.Networking; public class DownloadImage : MonoBehaviour { public string imageUrl = "http://example.com/image.jpg"; // 设置要下载的片的URL public string savePath = "Assets/Images/image.jpg"; // 设置要保存的本地路径 void Start() { StartCoroutine(DownloadImageCoroutine()); } IEnumerator DownloadImageCoroutine() { using (UnityWebRequest webRequest = UnityWebRequestTexture.GetTexture(imageUrl)) { yield return webRequest.SendWebRequest(); if (webRequest.result == UnityWebRequest.Result.Success) { Texture2D texture = DownloadHandlerTexture.GetContent(webRequest); byte[] bytes = texture.EncodeToJPG(); // 保存为 JPG 格式,如果需要 PNG 格式则使用 EncodeToPNG() System.IO.File.WriteAllBytes(savePath, bytes); Debug.Log("Image downloaded and saved to " + savePath); } else { Debug.Log("Error downloading image: " + webRequest.error); } } } } ``` 这段代码使用 UnityWebRequestTexture 类下载片,并将其保存为 Texture2D 对象。然后可以使用 Texture2D.EncodeToJPG() 或 Texture2D.EncodeToPNG() 将其转换为字节数组,并保存到本地文件。 在上述示例代码中,你需要设置 `imageUrl` 变量来指定要下载的片的URL, `savePath` 变量来指定要保存的本地路径。确保在运行代码之前将这些变量设置为正确的值。 希望对你有帮助!如果还有其他问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值