欢迎来到淼淼之森的个人小站。  交流请加我微信好友: studyjava。  也欢迎关注同名公众号:Java学习之道

unity实战之根据配置实现树状图

  |   0 评论   |   0 浏览

前言

最近项目需要做一个模块,一个树状解锁功能,功能很简单。需要根据配置生成数结构。
节点与节点之间需要根据配置进行连接。

树节点生产

1.首先在unity中创建一个空物体,命名为item,将其作为所有节点的父物体
2.创建数节点预制,命名为ScienceRender,如图
1.png

3.代码获取item游戏物体

ui.itemParent = base:findobj("item")

4.代码获取ScienceRender预制

ui.itemPrefab = utils.loadprefab("tree", "ScienceRender")

5.根据配置实例化生成节点

local scienceRender = {}
function view.InitTree()
    local list = {
        [1] = {icon = "1",position=(0,0),}
        [2] = {icon = "2",position=(200,0),unlock = { 1, }}
        [3] = {icon = "3",position=(200,200),unlock = { 2, }}
        [4] = {icon = "4",position=(400,200),unlock = { 2, }}
    }
    --item
    Util.DestroyAllChild(ui.itemParent)
    for i,v in ipairs(list) do
        local render = {}
        render.obj = Util.Instance(ui.itemPrefab)--实例化预制
        Util.SetParent(render.obj, ui.itemParent)
        render.icon = utils.findimage(render.obj,"icon")
        render.icon.sprite = utils.loadsprite("icon", v.icon)
        render.obj.transform.localPosition = Vector2.New(v.position[1], v.position[2]) 
        scienceRender[i] = render
    end
end

节点连接

1.首先在unity中创建一个空物体,命名为line,将其作为所有连线的父物体
2.创建线预制,命名为SciencteLine,如图
2.png

3.代码获取item游戏物体

ui.lineParent = base:findobj("line")

4.代码获取SciencteLine预制

ui.linePrefab = utils.loadprefab("tree", "SciencteLine")

5.根据配置生成线

local scienceLine = {}
function view.InitLine()
    Util.DestroyAllChild(ui.lineParent)
    for i,v in ipairs(list) do
        scienceLine[v.sid] = {}
        for a,b in ipairs(v.unlock or {}) do
            local render = {}
            render.obj = Util.Instance(ui.linePrefab)
            Util.SetParent(render.obj, ui.lineParent)
            render.img = render.obj:GetComponent("Image")
            render.rect = render.obj:GetComponent("RectTransform")
            local idx1 = i--前置条件sid
            local idx2 = b--当前sid
            render.obj.name = idx2.."_"..idx1
            scienceLine[i][b] = render
        end
    end
end

6.初始化生成线的位置

render.obj.transform.localPosition = pos1

7.初始化生成线的长度

local pos1 = scienceRender[idx1].obj.transform.localPosition
local pos2 = scienceRender[idx2].obj.transform.localPosition
--线长
local distence = Vector2.Distance(pos1,pos2)
render.rect.sizeDelta = Vector2.New(26, distence

8.初始化生成线的旋转角度

local v3 = pos2-pos1
local angle = Vector3.Angle(v3, Vector3.New(0,1,0))
render.obj.transform.localEulerAngles = Vector3.New(0,0,v3.x>0 and-angle or angle)

9.线的初始化完整代码

local scienceLine = {}
function view.InitLine()
    Util.DestroyAllChild(ui.lineParent)
    for i,v in ipairs(list) do
        scienceLine[v.sid] = {}
        for a,b in ipairs(v.unlock or {}) do
            local render = {}
            render.obj = Util.Instance(ui.linePrefab)
            Util.SetParent(render.obj, ui.lineParent)
            render.img = render.obj:GetComponent("Image")
            render.rect = render.obj:GetComponent("RectTransform")
            local idx1 = i--前置条件sid
            local idx2 = b--当前sid
            render.obj.name = idx2.."_"..idx1
            local pos1 = scienceRender[idx1].obj.transform.localPosition
            local pos2 = scienceRender[idx2].obj.transform.localPosition
            --线长
            local distence = Vector2.Distance(pos1,pos2)
            render.rect.sizeDelta = Vector2.New(26, distence)
            --位置
            render.obj.transform.localPosition = pos1
            --旋转
            local v3 = pos2-pos1
            local angle = Vector3.Angle(v3, Vector3.New(0,1,0))
            render.obj.transform.localEulerAngles = Vector3.New(0,0,v3.x>0 and-angle or angle)
            scienceLine[i][b] = render
        end
    end
end

运行结果

3.png


标题:unity实战之根据配置实现树状图
作者:shirlnGame
地址:https://www.mmzsblog.cn/articles/2023/04/23/1682235890359.html

如未加特殊说明,文章均为原创,转载必须注明出处。均采用CC BY-SA 4.0 协议

本网站发布的内容(图片、视频和文字)以原创、转载和分享网络内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。若本站转载文章遗漏了原文链接,请及时告知,我们将做删除处理!文章观点不代表本网站立场,如需处理请联系首页客服。
• 网站转载须在文章起始位置标注作者及原文连接,否则保留追究法律责任的权利。
• 公众号转载请联系网站首页的微信号申请白名单!

个人微信公众号 ↓↓↓                 

微信搜一搜爱上游戏开发