说明:

简单总结一下深度优先算法和广度优先算法在Unity中最直观和最多见的使用。这里我所举的例子是应用到Unity中3D 人物的全部骨骼关键的遍历,推广开就是能够对全部物体的层级关系进行简单的遍历。。。算法

数据结构中的树的遍历在Unity中最直观的表现就是对某物体的全部子物体的遍历关系。数据结构

以下所示就是对Unity全部子物体层级的转换出的数据结构(树)3d

深度优先遍历:

深度优先遍历是按照树(图)的深度遍历的一种遍历算法。主要是基于深度优先,既是从某一节点V做为起始节点开始进行遍历,当V的的某一边里全部都遍历事后,回溯到起始节点V,而后继续对另外一条边进行遍历,直至全部节点被遍历完成为止。
如上图所示的树,深度优先的遍历方式为:
  1. A做为Root结点,第一个被访问,而后依次访问B、E、K,当这条路走完后,接着访问L,而后访问F,这样就表明第一条边被访问完成;
  2. 而后回溯到A,依次访问C、G
  3. 最后在回溯到A,依次访问D、H、M、I、J
在Unity中深度遍历全部子物体以下所示:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/// <summary>
/// 深度优先
/// </summary>
public class DepthFirst : MonoBehaviour
{
//用于存储所遍历到的物体
List<Transform> DepthFirstList = new List<Transform>(); void Start()
{
DepthFirst_0(transform);
//打印序列
foreach (var item in DepthFirstList)
{
Debug.Log(item);
}
} void DepthFirst_0(Transform tran)
{
foreach (Transform item in tran)
{
DepthFirstList.Add(item);
//判断是否存在子物体
if (item.childCount != 0)
{
DepthFirst_0(item);
}
}
}
}
打印结果以下所示:
 

广度优先遍历

广度优先遍历是按照树(图)的广度遍历的一种遍历算法(又称为层次遍历)。主要是基于广度优先,既是某一节点V做为起始节点开始进行遍历,沿着树(图)的层次进行依次遍历,当第N层被遍历完成后,进行第N+1层遍历,当全部节点都比访问后,遍历完成。
如上图所示的树,广度优先的遍历方式为:
  1. A做为Root结点,做为第一层被访问,当第一层访问完成,切到第二层
  2. 而后依次访问第二层:B、C、D,第二层访问完成
  3. 而后依次访问第三层:E、F、G、H、I、J,第三层访问完成
  4. 而后依次访问第四层:K、L、M
  5. 没有第4+1层,遍历完成

在Unity中广度遍历全部子物体以下所示:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/// <summary>
/// 获取全部关键
/// </summary>
public class BreathFirst : MonoBehaviour
{
List<Transform> BreadthFirstList = new List<Transform>();//层次遍历所获得的List /// <summary>
/// 首先把物体的第一层子物体放入一个List,便于以后使用
/// </summary>
void Start()
{
List<Transform> joinsList = new List<Transform>();
foreach (Transform itemJoins in transform)
{
joinsList.Add(itemJoins);
}
BreadthFirst_1(joinsList); foreach (var item in BreadthFirstList)
{
Debug.Log(item);
}
} /// <summary>
/// 递归遍历每一层
/// </summary>
/// <param name="joins"></param>
void BreadthFirst_1(List<Transform> joins)
{
List<Transform> joinsChildListss = new List<Transform>();
foreach (Transform item in joins)
{
BreadthFirstList.Add(item);//将每一层依次放入列表中
if (item.childCount != 0)//判断每一次的序列项是否存在子物体,存在就将全部子物体放入一个新的List
{
foreach (Transform itemss in item)
{
joinsChildListss.Add(itemss);
}
}
}
if (joinsChildListss != null && joinsChildListss.Count != 0)//判断是不是最后一层
BreadthFirst_1(joinsChildListss);
}
}

打印结果以下所示:



深度优先算法结合广度优先算法获取物体全部节点关系

深度优先算法是对物体的深度上进行的遍历,广度优先算法是对物体广度上的遍历,若是当咱们想要获得物体的层级关系(如:文件件的全部层级关系,3D 人物的骨骼关键关系等)时,咱们能够将深度优先结合广度优先便可获得整个层级关系——经过深度优先遍历获取获得每一个节点的深度信息,经过广度优先遍历获取到每一个节点的广度信息。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/// <summary>
/// 获取全部关键
/// </summary>
public class ListOfJoints : MonoBehaviour
{
public Transform HumModel;
int numCount = 0;
List<Transform> BreadthFirstList = new List<Transform>();
Dictionary<Transform, int> BreathFirstDic = new Dictionary<Transform, int>();
List<Transform> DepthFirstList = new List<Transform>();
IEnumerator Start()
{
yield return new WaitForEndOfFrame();
DepthFirst_0(HumModel);
BreadthFirst_0(HumModel);
yield return new WaitForEndOfFrame();
foreach (var item in DepthFirstList)
{
if (BreathFirstDic.ContainsKey(item))
{
string str = "";
for (int i = 0; i < BreathFirstDic[item]; i++)
{
str += " ";
}
Debug.Log(str + item);
}
}
}
void BreadthFirst_0(Transform tran)
{
List<Transform> joinsList = new List<Transform>();
foreach (Transform itemJoins in HumModel)
{
joinsList.Add(itemJoins);
}
BreadthFirst_1(joinsList);
}
void BreadthFirst_1(List<Transform> joins)
{
numCount++;//层数
List<Transform> joinsChildListss = new List<Transform>();
foreach (Transform item in joins)//打印子物体
{
BreadthFirstList.Add(item);
BreathFirstDic.Add(item, numCount);
if (item.childCount != 0)
{
foreach (Transform itemss in item)
{
joinsChildListss.Add(itemss);
}
}
}
if (joinsChildListss != null && joinsChildListss.Count != 0)
BreadthFirst_1(joinsChildListss);
}
void DepthFirst_0(Transform tran)
{
foreach (Transform item in tran)
{
DepthFirstList.Add(item);
if (item.childCount != 0)
{
DepthFirst_0(item);
}
}
} }

深度优先及广度优先在Unity中的应用的更多相关文章

  1. Unity中通过深度优先算法和广度优先算法打印游戏物体名

    前言:又是一个月没写博客了,每次下班都懒得写,觉得浪费时间.... 深度优先搜索和广度优先搜索的定义,网络上已经说的很清楚了,我也是看了网上的才懂的,所以就不在这里赘述了.今天讲解的实例,主要是通过自 ...

  2. python、java实现二叉树,细说二叉树添加节点、深度优先(先序、中序、后续)遍历 、广度优先 遍历算法

    数据结构可以说是编程的内功心法,掌握好数据结构真的非常重要.目前基本上流行的数据结构都是c和c++版本的,我最近在学习python,尝试着用python实现了二叉树的基本操作.写下一篇博文,总结一下, ...

  3. 存储结构与邻接矩阵,深度优先和广度优先遍历及Java实现

    如果看完本篇博客任有不明白的地方,可以去看一下<大话数据结构>的7.4以及7.5,讲得比较易懂,不过是用C实现 下面内容来自segmentfault 存储结构 要存储一个图,我们知道图既有 ...

  4. Python爬虫从入门到放弃(十)之 关于深度优先和广度优先

    网站的树结构 深度优先算法和实现 广度优先算法和实现 网站的树结构 通过伯乐在线网站为例子: 并且我们通过访问伯乐在线也是可以发现,我们从任何一个子页面其实都是可以返回到首页,所以当我们爬取页面的数据 ...

  5. ES系列九、ES优化聚合查询之深度优先和广度优先

    1.优化聚合查询示例 假设我们现在有一些关于电影的数据集,每条数据里面会有一个数组类型的字段存储表演该电影的所有演员的名字. { "actors" : [ "Fred J ...

  6. python 实现图的深度优先和广度优先搜索

    在介绍 python 实现图的深度优先和广度优先搜索前,我们先来了解下什么是"图". 1 一些定义 顶点 顶点(也称为"节点")是图的基本部分.它可以有一个名称 ...

  7. 图的深度优先遍历&广度优先遍历

    1.什么是图的搜索? 指从一个指定顶点可以到达哪些顶点   2.无向完全图和有向完全图 将具有n(n-1)/2条边的无向图称为无向完全图(完全图就是任意两个顶点都存在边). 将具有n(n-1)条边的有 ...

  8. 58.海量bucket优化机制:从深度优先到广度优先

    当buckets数量特别多的时候,深度优先和广度优先的原理,图解 假如我们有如下数据数据:每个演员的每个电影的评论. 现在我们的需求是找到前10名的演员所演的电影的评论.这是一个两层聚合题.     ...

  9. Python之 爬虫(十二)关于深度优先和广度优先

    网站的树结构 深度优先算法和实现 广度优先算法和实现 网站的树结构 通过伯乐在线网站为例子: 并且我们通过访问伯乐在线也是可以发现,我们从任何一个子页面其实都是可以返回到首页,所以当我们爬取页面的数据 ...

  10. python数据结构之图深度优先和广度优先实例详解

    本文实例讲述了python数据结构之图深度优先和广度优先用法.分享给大家供大家参考.具体如下: 首先有一个概念:回溯 回溯法(探索与回溯法)是一种选优搜索法,按选优条件向前搜索,以达到目标.但当探索到 ...

随机推荐

  1. 解决安装python各种包速度慢问题

    # 改用清华镜像库 pip install ******* -i https://pypi.tuna.tsinghua.edu.cn/simple

  2. 【忍者算法】从风扇叶片到数组轮转:探索轮转数组问题|LeetCode 189 轮转数组

    从风扇叶片到数组轮转:探索轮转数组问题 生活中的算法 想象你在看一个风扇缓缓转动,每次转动三个叶片的距离.原本在上方的叶片转到了右侧,原本在右侧的叶片转到了下方...这就是一个生动的轮转过程.再比如, ...

  3. 一键实现风险识别+处理,天翼云AOne助手尽在“掌”握!

    随着企业数字化建设的不断加速,优化站点性能与响应速度成为当今时代的一个重要课题.对于政务.金融类机构来说,其门户网站.信用卡中心等代表着对外形象,如果出现访问不通或者时延严重的现象将影响业务办理效率以 ...

  4. ChatGPT 背后的英雄——AI芯片

    本文分享自天翼云开发者社区<ChatGPT 背后的英雄--AI芯片>,作者:w****n AI芯片能为人工智能应用提供所需的基础算力:按技术架构主要分为GPU.FPGA和ASIC.Chat ...

  5. VS Code 开发工具的基本使用

    VS Code 开发工具的基本使用 VS Code(Visual Studio Code)是微软开发的一款免费.开源的代码编辑器,它支持多种操作系统,包括Windows.macOS和Linux.VS ...

  6. P5384 [Cnoi2019] 雪松果树 题解

    传送门 前言 一年一度,生长在高山上的雪松果树又结果了. 第二天,雪松果树长成了一颗参天大树, 上面长满了雪松果. 求雪松果树生长周期 整活向题解. 奋力卡常 3h,纪念一下. 是的,我一个人的提交占 ...

  7. 前端视角看 HTTPS

    最近用Docusaurus搭了一个个人网站,部署后看到浏览器地址栏上"不安全"三个字感觉特别辣眼,便不由自主的想起了HTTPS.回忆起自己在日常开发中遇到的一些与HTTPS相关的知 ...

  8. kubesphere应用系列(一)部署NET8API

    一.准备工作 1.kubesphere 2.harbor 3.net8 二.创建API应用 1.创建api应用 1.1使用命令创建应用 dotnet new webapi -n YourApiAppN ...

  9. 生成式 AI 的发展方向,是 Chat 还是 Agent?

    一.整体介绍 生成式 AI 在当今科技领域的发展可谓是日新月异,其在对话系统(Chat)和自主代理(Agent)两个领域都取得了显著的成果. 在对话系统(Chat)方面,发展现状令人瞩目.当前,众多智 ...

  10. DOCKER20231217: 容器引擎Docker

    1.1 Docker简介 1.1.1 什么是Docker? 一种轻量级的操作系统虚拟化技术,基于Go语言实现的开源容器项目,诞生于2013年,最初发起者是dotCloud公司(现 Docker Inc ...