Unity-射线
Unity射线系统Demo展示UI+Physical射线测试: FPS自定义射线测试: UGUI射线工具实现功能,鼠标点击UI,返回鼠标点击的UI对象; 需要使用到鼠标点击事件-PointerEventData; 关键API:EventSystem.current.RaycastAll(); 参数为鼠标点击事件,和接受射线返回结果集合; 12345678910111213141516171819public static GameObject RaycastUI(){ if (EventSystem.current == null) return null; //鼠标点击事件 PointerEventData pointerEventData = new PointerEventData(EventSystem.current); //设置鼠标位置 pointerEventData.position = Input.mousePosition; //射线检测返回结果 List<RaycastResult> ...
二叉树
二叉树什么是二叉树简单地理解,满足以下两个条件的树就是二叉树: 本身是有序树; 树中包含的各个节点的度不能超过 2,即只能是 0、1 或者 2; 二叉树性质 二叉树中,第 i 层最多有 2i-1 个结点。 如果二叉树的深度为 K,那么此二叉树最多有 2K-1 个结点。 二叉树中,终端结点数(叶子结点数)为 n0,度为 2 的结点数为 n2,则 n0=n2+1。 性质 3 的计算方法为:对于一个二叉树来说,除了度为 0 的叶子结点和度为 2 的结点,剩下的就是度为 1 的结点(设为 n1),那么总结点 n=n0+n1+n2。同时,对于每一个结点来说都是由其父结点分支表示的,假设树中分枝数为 B,那么总结点数 n=B+1。而分枝数是可以通过 n1 和 n2 表示的,即 B=n1+2n2。所以,n 用另外一种方式表示为 n=n1+2n2+1。两种方式得到的 n 值组成一个方程组,就可以得出 n0=n2+1。 满二叉树如果二叉树中除了叶子结点,每个结点的度都为 2,则此二叉树称为满二叉树。 满二叉树除了满足普通二叉树的性质,还具有以下性质: 满二叉树中第 i 层的节点数为 2n-1 ...
Unity-Asset资源
Unity资源文件夹介绍 编辑时在Asset文件下存在Resources和SteamingAsset文件夹; Resources只读不可修改,打包时直接写死,没有办法通过热更新替换资源; 可以存放任何格式的资源; 通过Resources.Load加载; 一般只存登录UI,congfig配置等不会修改的文件; 1234//加载GameObject go = Resources.Load<GameObject>(path);Sprite sp = Resouces.Load(path,typeof(sprite)) as sprite;TextAsset txt = Resources.Load(path) as TextAsset; SteamingAssets存放打包后Unity打包后的资源,也就是我说的AssetBundle(ab包); 可读可写,打包后移动端不能使用File类读取(用过www读取streamingAssetspath数据拷贝到persistentDataPath); 安装后Application.dataPath包含游戏数据文件夹的路径,app程序包安装 ...
C#数据结构与算法
数据结构与算法什么是数据结构与算法?在学习数据结构与算法的时候,常常会思考一个问题:什么是数据结构与算法? 这里比较找到了一个比较好的答案。 从宏观来讲: 数据结构是一组数据的存储结构。 算法就是操作数据的方法。 数据结构为算法服务,算法要作用在特定的数据结构中。 从狭义上来讲,就是数据结构与算法这门学科就是去学习比较经典的数据结构和算法。 有点像学习设计模式一样,学习 23 种设计模式。 如何学习数据结构与算法?说到设计模式,学习数据结构与算法与学习设计模式非常相似的。 我们知道设计模式有 23 种,而一般一个开发者学习设计模式的时候,往往会对 23 个设计模式都从头到尾学一遍,但是学完之后发现除了记了个名字之外没啥卵用,就连名字也不一定记得住。 那么是以为 23 种设计模式的核心并不是设计模式本身,而是 23 种设计模式所遵循的 SOLID 原则,即六大设计原则,而开发者一开始最应该掌握的是六大设计原则,而不是设计模式,六大设计原则是核心,而 23 种设计模式算是 23 种对于六大设计原则的案例一样,一定要先搞清楚这一点。否则学习就会事倍功半,当然如果有一定的编码经验再去学设计 ...
Unity协程
yieldyield 实质是一个语法糖,它让程序员能够更方便的去使用迭代器,通过 yield 你可以直接使用迭代器操作而不需要去实现 IEnumerable 和 IEnumerator,也不需要一个临时的 Collection 来完成迭代。 yield 有两种格式声明 12yield return <expression>;yield break; 123456789101112131415161718192021222324using System.Collections;using UnityEngine;namespace UniRxLesson{ public class YieldExample : MonoBehaviour { private void Start() { foreach (var empty in FiveTimes()) { Debug.Log("A"); } } private IEnu ...
Unity-编辑器扩展
一、菜单栏拓展Menultem1[Menultem("Test/CreatePanel/func1 %_Q"),true,1] 1、路径+快捷键,是否启用,排列顺序 2、配合Selection.Object选中物体文件夹时启用 3、方法必须是静态方法 12345678910111213[MenuItem("Test/OpenPanel %_Q",true)]public static bool IsSelected(){ if (Selection.objects.Length > 0) return true; else return false;}[MenuItem("Test/OpenPanel %_Q",false)]public static void OpenPanel(){Undo.DestroyObjectImmediate(object);} 4、快捷键 符号 字符 % Ctrl # Shift & Alt LEFT/R ...
回溯算法
什么是回溯法回溯法也可以叫做回溯搜索法,它是一种搜索的方式。 在二叉树系列中,我们已经不止一次,提到了回溯,例如 二叉树:以为使用了递归,其实还隐藏着回溯。 回溯是递归的副产品,只要有递归就会有回溯。 回溯法的效率回溯法的性能如何呢,这里要和大家说清楚了,「虽然回溯法很难,很不好理解,但是回溯法并不是什么高效的算法」。 因为回溯的本质是穷举,穷举所有可能,然后选出我们想要的答案」,如果想让回溯法高效一些,可以加一些剪枝的操作,但也改不了回溯法就是穷举的本质。 那么既然回溯法并不高效为什么还要用它呢? 因为没得选,一些问题能暴力搜出来就不错了,撑死了再剪枝一下,还没有更高效的解法。 回溯法解决的问题回溯法,一般可以解决如下几种问题: 组合问题:N个数里面按一定规则找出k个数的集合排列问题:N个数按一定规则全排列,有几种排列方式切割问题:一个字符串按一定规则有几种切割方式子集问题:一个N个数的集合里有多少符合条件的子集棋盘问题:N皇后,解数独等等 组合是不强调元素顺序的,排列是强调元素顺序」。 例如:{1, 2} 和 {2, 1} 在组合上,就是一个集合,因为不强调顺序,而要是排列的话,{ ...
动态规划
动态规划为什么重要?从面试的角度看,动态规划是正规算法面试中无论如何都逃不掉的必考题。 其实最主要的原因就是动态规划非常适合面试,因为动态规划没办法「背」。 我们很多求职者其实是通过背题来面试的,而之前这个做法屡试不爽,什么翻转二叉树、翻转链表,快排、归并、冒泡一顿背,基本上也能在面试中浑水摸鱼过去,其实这哪是考算法能力、算法思维,这就是考谁的备战态度好,愿意花时间去背题而已,把连背都懒得背的筛出去就完事了。 但是随着互联网遇冷,人才供给进一步过热,背题的人越来越多,面试的门槛被增加了,因此这个时候需要一种非常考验算法思维、变化多端而且容易设计的题目类型,动态规划就完美符合这个要求。 比如 LeetCode 中有1261道算法类题目,其中动态规划题目占据了近200道,动态规划能占据总题目的 1/6 的比例,可见其火热程度。 更重要的是,动态规划的题目难度以中高难度为主 所以,既然我们已经知道这是算法面试的必考题了,我们怎么准备都不为过。 什么是动态规划动态规划(Dynamic programming,简称DP)是一种通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。 态规划与 ...
IOC
简介IOC简介IOC全称为Invertuon Of Control,也就是控制反转。控制反转是一种设计思想。而不是具体的技术。IOC这种设计思想有很多方式实现,最常见的实现方式就是DI。 DI简介DI的全称是Dependency Injection,也就是依赖注入,是IOC思想的一种实现。 依赖什么是依赖?看下面这段代码: 1234public class A{ public B b = new B();} 上述代码中就是A依赖B。我再这里理解为,A对象里面持有B对象,如果B对象不存在,那么A就无法成立,所以是A对象依赖B。 注入什么是注入呢?看下面这段代码: 1234567891011121314public class A{ public B b = null;}public class B {}void Main(){ var a = new A(); var b = new B(); a.b = b;} 从上面可以看出总共有两个对象,分别是a和b。可以看出现在的A对象是依赖B对象的。a.b ...
设计模式
如何正确使用设计模式?设计模式要活学活用,不要生搬硬套。想要游刃有余地使用设计模式,需要打下牢固的程序设计语言基础、夯实自己的编程思想、积累大量的时间经验、提高开发能力。目的都是让程序低耦合,高复用,高内聚,易扩展,易维护。 1. 需求驱动不仅仅是功能性需求,需求驱动还包括性能和运行时的需求,如软件的可维护性和可复用性等方面。设计模式是针对软件设计的,而软件设计是针对需求的,一定不要为了使用设计模式而使用设计模式,否则可能会使设计变得复杂,使软件难以调试和维护。 2. 分析成功的模式应用项目对现有的应用实例进行分析是一个很好的学习途径,应当注意学习已有的项目,而不仅是学习设计模式如何实现,更重要的是注意在什么场合使用设计模式。 3. 充分了解所使用的开发平台设计模式大部分都是针对面向对象的软件设计,因此在理论上适合任何面向对象的语言,但随着技术的发展和编程环境的改善,设计模式的实现方式会有很大的差别。在一些平台下,某些设计模式是自然实现的。 不仅指编程语言,平台还包括平台引入的技术。例如,Java EE 引入了反射机制和依赖注入,这些技术的使用使设计模式的实现方式产生了改变。 4. 在 ...