unity在制作游戏过程中,我们为什么要unity打包过程图集,unity打包过程图集的好处是啥?

孙广东& 我想做过NGUI 或者Unity2D【更熟悉】游戏的的人,应该记得,比如要做一个角色的动画,美术给的一张大图【里面包含很多的小图,是角色的各个部位】。这张大图就可以理解为一张图集!NGUI也是类似。那么UGUI图集的打包,网上也是介绍的很多了,&&& 只要我们为 Sprite设置好& Packing Tag的话,就完全不用在多考虑了,& Unity在每次都会为我们打包的。但是 习惯了NGUI的人还是会不适应的, 那么这个插件 Simple Sprite Packer 就就派上用场了。& 至于他的使用我就不做介绍了,本身这是一款免费的插件。&打包图集的算法可以选择和Unity一样的。其实还有一个必须使用的他的目的 是对 Resources目录下的Sprite资源,打包成图集。&& 因为这个目录下,Unity 是不会帮我们弄的。&& &&&&& Simple Sprite Packer v1.7 by ChoMPIHow to Use?- Right click in the Project view the go to Create -& Sprite Packer.- From there on just drag and drop graphics and hit the Rebuild Atlas button.
本文已收录于以下专栏:
相关文章推荐
一.设计的目的:让开发者忘记图集的概念,使用小图去开发UI,unity自动会将这些小图按照tag名字打到图集里面去。二.启用的方式:在Edit-&Project Settings-&Editor-&S...
NGUI更适合做游戏界面UI、游戏背包UI、游戏技能UI等UI
UGUI更适合做2D游戏的人物角色、2D游戏怪物图片等UI
------------------------NGUI如何创建精...
自从Unity 提供 Sprite Packer 方案,精灵图片就不需要自己来合并图集了,而是设置 Packing Tag 就会使得 Unity 自动帮我们合并图集。但是做资源更新的时候,自动生成的图...
/p/a08b861af4e9
今天研究了一下UGUI的图集生成,具体步骤就是设置Texture的Packing Tag名称,并且Sprite Mod...
使用UGUI的朋友,肯定都知道Sprite(精灵), 关于如何打包图集,MOMO大神已经写出了博客。/archives/3304
就这个问题,我自...
多渠道打包工具
packer-ng,新一代打包神器,可在1秒内打100个包。/mcxiaoke/packer-ng-plugin
集成方法:
1、首先下载Texturepackage工具,网上有破解版的,也可以到官网下载使用免费版,/texturepacker/,接着就是简单的安装不在过多...
最近,管理平台接到新需求,需要向第三方提供可单点的操作页面,嵌入到他们的系统页面。
一脸萌逼,听起来简单的,但实际操作,需要对用户鉴权,需要对嵌入的插件做模版处理等等一系列问题。
首先考虑第一个问题:...
1、下载字体集制作工具,如果电脑装有jdk请下载这个,没有请下载这个。
他的最新文章
讲师:姜飞俊
讲师:汪木铃
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)谁知道NGUI制作图集的原理?为什么我制作的一张图集这么大?_unity3d吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:76,549贴子:
谁知道NGUI制作图集的原理?为什么我制作的一张图集这么大?收藏
我用NGUI制作一张图集感觉很大是的,但这张图有三分之二的地方都是空白,怎么才能让这图集小点,为什么有的图集制作的小,有的图集制作的大呢???
达内unity3d培训全程&实战教学&,unity3d金牌讲师授课.免费unity3d课程试听中!到达内unity3d学院学习unity3d,只需4个月速成unity3d游戏工程师.
有没有一个素材超过了1024?
好像有个自动调整大小的选项,默认是勾的
其实自己用PS拼合一张图集也是能用的,只是要自己定义精灵
我个人发现 不管你生成 多小的图集,那么NGUI会默认生成一张的图集。
登录百度帐号推荐应用1046人阅读
Unity3D(179)
很多时候我们需要美术把贴图合并为一张贴图,现在在unity3d里通过几行代码就可以轻松完成(注释:今天查看API时发现的没想到如此好用),查看unity3dAPI你会发现Texture2D有个
Texture2D.PackageTextures的API
这个API可以自动将你的几张贴图合并为一张大图最大大小还能自定义,贴上一段我的测试代码和屏幕截图(只做测试用的有需要可以做成一个小工具)
using UnityE
using UnityE
using System.C
using System.IO;
public class TexturePackage : MonoBehaviour {
public Texture2D[]
public Rect[]
[ContextMenu(&TexturePack&)]
void TexturePack()
Texture2D altas = new Texture2D ();
rects = altas.PackTextures (texture, 2, 2048);
byte[] buffer = altas.EncodeToPNG();
File.WriteAllBytes (Application.dataPath + &/alta.jpg&,buffer);
AssetDatabase.Refresh();
如上面代码所示(前提你的Texture2D必须是ARGB32,RGBA32,或者是Alpha8的并且设置为可读),
代码中返回的Rects有什么用的这个是很有用的,这个可以映射到材质球Material的UV,Tilling和Offset上,Rect的x,y分别对应Offsets的x,yRect的width和height分别对应材质球的Tilling的x和y,也就是说你可以在材质球上显示你想要的贴图
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:672427次
积分:8633
积分:8633
排名:第2334名
原创:37篇
转载:985篇
评论:45条
(5)(4)(1)(22)(42)(36)(26)(5)(2)(26)(8)(16)(25)(16)(27)(17)(40)(27)(13)(29)(57)(57)(86)(86)(60)(57)(40)(30)(54)(36)(11)(16)(3)(4)(9)(12)(17)
(window.slotbydup = window.slotbydup || []).push({
id: '4740881',
container: s,
size: '200,200',
display: 'inlay-fix'unity(84)
/shly/archive//212443.html
UGUI Image已Sprite为主,而简单的合并图集可以使用自带的SpritePacker。
而当在使用AssetBundle的时候情况有些不同,会造成每个AB都会引入完整的Sprite图集,显然就增加了AB的大小,重复资源。
为了解决这个问题我们可以手动合并图集,那么方案也有多种,这里我们可以编辑器自带的API来实现一个小的图集合并工具。
&private&static&bool&CombineSpritesHelper(string&path,&string&dpath,&string&name,&int&padding)
&&&&&&&&string[]&paths&=&AssetDatabase.FindAssets(&t:sprite&,&new&string[]&{&path&});
&&&&&&&&List&Sprite&&spriteList&=&new&List&Sprite&();
&&&&&&&&List&Texture2D&&texList&=&new&List&Texture2D&();
&&&&&&&&foreach&(var&o&in&paths)
&&&&&&&&&&&&Sprite&s&=&AssetDatabase.LoadAssetAtPath(AssetDatabase.GUIDToAssetPath(o),&typeof(Sprite))&as&S
&&&&&&&&&&&&if&(null&!=&s)
&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&spriteList.Add(s);
&&&&&&&&&&&&&&&&texList.Add(s.texture);
&&&&&&&&&&&&}
&&&&&&&&if&(texList.Count&&&0)
&&&&&&&&&&&&Texture2D&tex&=&new&Texture2D(,&TextureFormat.ARGB32,&true);
&&&&&&&&&&&&Rect[]&uvs&=&UITexturePacker.PackTextures(tex,&texList.ToArray(),&4,&4,&padding,&1024);
&&&&&&&&&&&&if&(null&==&uvs)
&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&EditorUtility.DisplayDialog(path,&&图集超过1024,需要分组成多张图集&,&&点击退出&);
&&&&&&&&&&&&&&&&Object.DestroyImmediate(tex);
&&&&&&&&&&&&&&&&tex&=&null;
&&&&&&&&&&&&&&&&return&false;
&&&&&&&&&&&&}
&&&&&&&&&&&&else
&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&List&SpriteMetaData&&metaList&=&new&List&SpriteMetaData&();
&&&&&&&&&&&&&&&&for&(int&i&=&0;&i&&&uvs.L&++i)
&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&SpriteMetaData&data&=&new&SpriteMetaData();
&&&&&&&&&&&&&&&&&&&&data.alignment&=&(int)SpriteAlignment.C
&&&&&&&&&&&&&&&&&&&&data.border&=&spriteList[i].
&&&&&&&&&&&&&&&&&&&&data.name&=&spriteList[i].
&&&&&&&&&&&&&&&&&&&&data.pivot&=&spriteList[i].
&&&&&&&&&&&&&&&&&&&&data.rect&=&new&Rect(uvs[i].x&*&tex.width,&uvs[i].y&*&tex.height,&uvs[i].width&*&tex.width,&uvs[i].height&*&tex.height);
&&&&&&&&&&&&&&&&&&&&metaList.Add(data);
&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&//string&dpath&=&path.Substring(0,&path.Length&-&obj.name.Length)&+&&SpriteSet&;
&&&&&&&&&&&&&&&&if&(!System.IO.Directory.Exists(dpath))
&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&System.IO.Directory.CreateDirectory(dpath);
&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&string&file&=&dpath&+&&/&&+&name&+&&.png&;
&&&&&&&&&&&&&&&&if&(System.IO.File.Exists(file))
&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&System.IO.File.Delete(file);
&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&System.IO.File.WriteAllBytes(file,&tex.EncodeToPNG());
&&&&&&&&&&&&&&&&AssetDatabase.ImportAsset(file,&ImportAssetOptions.ForceUpdate);
&&&&&&&&&&&&&&&&TextureImporter&importer&=&AssetImporter.GetAtPath(file)&as&TextureI
&&&&&&&&&&&&&&&&importer.spritesheet&=&metaList.ToArray();
&&&&&&&&&&&&&&&&importer.spriteImportMode&=&SpriteImportMode.M
&&&&&&&&&&&&&&&&importer.textureType&=&TextureImporterType.S
&&&&&&&&&&&&&&&&importer.textureFormat&=&TextureImporterFormat.ARGB32;
&&&&&&&&&&&&&&&&importer.mipmapEnabled&=&true;
&&&&&&&&&&&&&&&&importer.mipmapFilter&=&TextureImporterMipFilter.BoxF
&&&&&&&&&&&&&&&&importer.assetBundleName&=&&ui_image/&&+&name.ToLower();
&&&&&&&&&&&&&&&&AssetDatabase.ImportAsset(file);
&&&&&&&&&&&&&&&&AssetDatabase.Refresh();
&&&&&&&&&&&&}
&&&&&&&&return&true;
&&&&[MenuItem(&Tool/Combine&Sprites&)]
&&&&[MenuItem(&Assets/Tool/Combine&Sprites&)]
&&&&public&static&void&CombineSprites()
&&&&&&&&EditorUtility.DisplayProgressBar(&Combine&Sprites&,&&Initializing&&,&0);
&&&&&&&&try
&&&&&&&&&&&&Object&obj&=&Selection.activeO
&&&&&&&&&&&&string&path&=&AssetDatabase.GetAssetPath(obj.GetInstanceID());
&&&&&&&&&&&&string&dpath&=&path.Substring(0,&path.Length&-&obj.name.Length)&+&&SpriteSet&;
&&&&&&&&&&&&if&(System.IO.Directory.Exists(path))
&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&string[]&directories&=&System.IO.Directory.GetDirectories(path);
&&&&&&&&&&&&&&&&int&count&=&0;
&&&&&&&&&&&&&&&&if&(directories.Length&&&0)
&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&foreach&(var&directory&in&directories)
&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&count++;
&&&&&&&&&&&&&&&&&&&&&&&&EditorUtility.DisplayProgressBar(&Combine&Sprites&,&string.Format(&combing&{0}&,&count),&(float)(count)&/&(directories.Length));
&&&&&&&&&&&&&&&&&&&&&&&&if&(!CombineSpritesHelper(directory,&dpath,&string.Concat(obj.name,&&_&,&count.ToString()),&1))
&&&&&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&&&&&break;
&&&&&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&else
&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&EditorUtility.DisplayProgressBar(&Combine&Sprites&,&&combing&0&,&1);
&&&&&&&&&&&&&&&&&&&&CombineSpritesHelper(path,&dpath,&obj.name,&1);
&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&}
&&&&&&&&catch&(System.Exception&e)
&&&&&&&&&&&&Debug.LogError(e);
&&&&&&&&EditorUtility.ClearProgressBar();
使用方法很简单,可以修改源码中的路径,可以将多个Single Sprite合成一个Multi Sprite。然后在供,UGUI使用,注意最好保存好合并前的源文件,不然可能造成新增图片打图集后对应不上从而造成引用丢失。
补充UITextPacker.cs :引用自NGUI
&&&&Based&on&the&Public&Domain&MaxRectsBinPack.cpp&source&by&Jukka&Jyl?nki
&&&&/juj/RectangleBinPack/
&&&&Ported&to&C#&by&Sven&Magnus
&&&&This&version&is&also&public&domain&-&do&whatever&you&want&with&it.
using&UnityE
using&System.C
using&System.Collections.G
public&class&UITexturePacker
&&&&public&int&binWidth&=&0;
&&&&public&int&binHeight&=&0;
&&&&public&bool&allowR
&&&&public&List&Rect&&usedRectangles&=&new&List&Rect&();
&&&&public&List&Rect&&freeRectangles&=&new&List&Rect&();
&&&&public&enum&FreeRectChoiceHeuristic
&&&&&&&&RectBestShortSideFit,&///&&-BSSF:&Positions&the&rectangle&against&the&short&side&of&a&free&rectangle&into&which&it&fits&the&best.
&&&&&&&&RectBestLongSideFit,&///&&-BLSF:&Positions&the&rectangle&against&the&long&side&of&a&free&rectangle&into&which&it&fits&the&best.
&&&&&&&&RectBestAreaFit,&///&&-BAF:&Positions&the&rectangle&into&the&smallest&free&rect&into&which&it&fits.
&&&&&&&&RectBottomLeftRule,&///&&-BL:&Does&the&Tetris&placement.
&&&&&&&&RectContactPointRule&///&&-CP:&Choosest&the&placement&where&the&rectangle&touches&other&rects&as&much&as&possible.
&&&&public&UITexturePacker&(int&width,&int&height,&bool&rotations)
&&&&&&&&Init(width,&height,&rotations);
&&&&public&void&Init&(int&width,&int&height,&bool&rotations)
&&&&&&&&binWidth&=&
&&&&&&&&binHeight&=&
&&&&&&&&allowRotations&=&
&&&&&&&&Rect&n&=&new&Rect();
&&&&&&&&n.x&=&0;
&&&&&&&&n.y&=&0;
&&&&&&&&n.width&=&
&&&&&&&&n.height&=&
&&&&&&&&usedRectangles.Clear();
&&&&&&&&freeRectangles.Clear();
&&&&&&&&freeRectangles.Add(n);
&&&&private&struct&Storage
&&&&&&&&public&Rect&
&&&&&&&&public&bool&paddingX;
&&&&&&&&public&bool&paddingY;
&&&&public&static&Rect[]&PackTextures&(Texture2D&texture,&Texture2D[]&textures,&int&width,&int&height,&int&padding,&int&maxSize)
&&&&&&&&if&(width&&&maxSize&||&height&&&maxSize)&return&null;
&&&&&&&&if&(width&&&maxSize&||&height&&&maxSize)&{&int&temp&=&&width&=&&height&=&&}
&&&&&&&&//&Force&square&by&sizing&up
&&&&&&&&/*
&&&&&&&&if&(NGUISettings.forceSquareAtlas)
&&&&&&&&&&&&if&(width&&&height)
&&&&&&&&&&&&&&&&height&=&
&&&&&&&&&&&&else&if&(height&&&width)
&&&&&&&&&&&&&&&&width&=&
&&&&&&&&*/
&&&&&&&&UITexturePacker&bp&=&new&UITexturePacker(width,&height,&false);
&&&&&&&&Storage[]&storage&=&new&Storage[textures.Length];
&&&&&&&&for&(int&i&=&0;&i&&&textures.L&i++)
&&&&&&&&&&&&Texture2D&tex&=&textures[i];
&&&&&&&&&&&&if&(!tex)&continue;
&&&&&&&&&&&&Rect&rect&=&new&Rect();
&&&&&&&&&&&&int&xPadding&=&1;
&&&&&&&&&&&&int&yPadding&=&1;
&&&&&&&&&&&&for&(xPadding&=&1;&xPadding&&=&0;&--xPadding)
&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&for&(yPadding&=&1;&yPadding&&=&0;&--yPadding)
&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&rect&=&bp.Insert(tex.width&+&(xPadding&*&padding),&tex.height&+&(yPadding&*&padding),
&&&&&&&&&&&&&&&&&&&&&&&&UITexturePacker.FreeRectChoiceHeuristic.RectBestAreaFit);
&&&&&&&&&&&&&&&&&&&&if&(rect.width&!=&0&&&&rect.height&!=&0)&break;
&&&&&&&&&&&&&&&&&&&&//&After&having&no&padding&if&it&still&doesn't&fit&--&increase&texture&size.
&&&&&&&&&&&&&&&&&&&&else&if&(xPadding&==&0&&&&yPadding&==&0)
&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&return&PackTextures(texture,&textures,&width&*&(width&&=&height&?&2&:&1),
&&&&&&&&&&&&&&&&&&&&&&&&&&&&height&*&(height&&&width&?&2&:&1),&padding,&maxSize);
&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&if&(rect.width&!=&0&&&&rect.height&!=&0)&break;
&&&&&&&&&&&&}
&&&&&&&&&&&&storage[i]&=&new&Storage();
&&&&&&&&&&&&storage[i].rect&=&
&&&&&&&&&&&&storage[i].paddingX&=&(xPadding&!=&0);
&&&&&&&&&&&&storage[i].paddingY&=&(yPadding&!=&0);
&&&&&&&&texture.Resize(width,&height);
&&&&&&&&texture.SetPixels(new&Color[width&*&height]);
&&&&&&&&//&The&returned&rects
&&&&&&&&Rect[]&rects&=&new&Rect[textures.Length];
&&&&&&&&for&(int&i&=&0;&i&&&textures.L&i++)
&&&&&&&&&&&&Texture2D&tex&=&textures[i];
&&&&&&&&&&&&if&(!tex)&continue;
&&&&&&&&&&&&Rect&rect&=&storage[i].
&&&&&&&&&&&&int&xPadding&=&(storage[i].paddingX&?&padding&:&0);
&&&&&&&&&&&&int&yPadding&=&(storage[i].paddingY&?&padding&:&0);
&&&&&&&&&&&&Color[]&colors&=&tex.GetPixels();
&&&&&&&&&&&&//&Would&be&used&to&rotate&the&texture&if&need&be.
&&&&&&&&&&&&if&(rect.width&!=&tex.width&+&xPadding)
&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&Color[]&newColors&=&tex.GetPixels();
&&&&&&&&&&&&&&&&for&(int&x&=&0;&x&&&rect.&x++)
&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&for&(int&y&=&0;&y&&&rect.&y++)
&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&int&prevIndex&=&((int)rect.height&-&(y&+&1))&+&x&*&(int)tex.
&&&&&&&&&&&&&&&&&&&&&&&&newColors[x&+&y&*&(int)rect.width]&=&colors[prevIndex];
&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&colors&=&newC
&&&&&&&&&&&&}
&&&&&&&&&&&&texture.SetPixels((int)rect.x,&(int)rect.y,&(int)rect.width&-&xPadding,&(int)rect.height&-&yPadding,&colors);
&&&&&&&&&&&&rect.x&/=&
&&&&&&&&&&&&rect.y&/=&
&&&&&&&&&&&&rect.width&=&(rect.width&-&xPadding)&/&
&&&&&&&&&&&&rect.height&=&(rect.height&-&yPadding)&/&
&&&&&&&&&&&&rects[i]&=&
&&&&&&&&texture.Apply();
&&&&&&&&return&
&&&&public&Rect&Insert&(int&width,&int&height,&FreeRectChoiceHeuristic&method)
&&&&&&&&Rect&newNode&=&new&Rect();
&&&&&&&&int&score1&=&0;&//&Unused&in&this&function.&We&don't&need&to&know&the&score&after&finding&the&position.
&&&&&&&&int&score2&=&0;
&&&&&&&&switch&(method)
&&&&&&&&&&&&case&FreeRectChoiceHeuristic.RectBestShortSideFit:&newNode&=&FindPositionForNewNodeBestShortSideFit(width,&height,&ref&score1,&ref&score2);&break;
&&&&&&&&&&&&case&FreeRectChoiceHeuristic.RectBottomLeftRule:&newNode&=&FindPositionForNewNodeBottomLeft(width,&height,&ref&score1,&ref&score2);&break;
&&&&&&&&&&&&case&FreeRectChoiceHeuristic.RectContactPointRule:&newNode&=&FindPositionForNewNodeContactPoint(width,&height,&ref&score1);&break;
&&&&&&&&&&&&case&FreeRectChoiceHeuristic.RectBestLongSideFit:&newNode&=&FindPositionForNewNodeBestLongSideFit(width,&height,&ref&score2,&ref&score1);&break;
&&&&&&&&&&&&case&FreeRectChoiceHeuristic.RectBestAreaFit:&newNode&=&FindPositionForNewNodeBestAreaFit(width,&height,&ref&score1,&ref&score2);&break;
&&&&&&&&if&(newNode.height&==&0)
&&&&&&&&&&&&return&newN
&&&&&&&&int&numRectanglesToProcess&=&freeRectangles.C
&&&&&&&&for&(int&i&=&0;&i&&&numRectanglesToP&++i)
&&&&&&&&&&&&if&(SplitFreeNode(freeRectangles[i],&ref&newNode))
&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&freeRectangles.RemoveAt(i);
&&&&&&&&&&&&&&&&--i;
&&&&&&&&&&&&&&&&--numRectanglesToP
&&&&&&&&&&&&}
&&&&&&&&PruneFreeList();
&&&&&&&&usedRectangles.Add(newNode);
&&&&&&&&return&newN
&&&&public&void&Insert&(List&Rect&&rects,&List&Rect&&dst,&FreeRectChoiceHeuristic&method)
&&&&&&&&dst.Clear();
&&&&&&&&while&(rects.Count&&&0)
&&&&&&&&&&&&int&bestScore1&=&int.MaxV
&&&&&&&&&&&&int&bestScore2&=&int.MaxV
&&&&&&&&&&&&int&bestRectIndex&=&-1;
&&&&&&&&&&&&Rect&bestNode&=&new&Rect();
&&&&&&&&&&&&for&(int&i&=&0;&i&&&rects.C&++i)
&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&int&score1&=&0;
&&&&&&&&&&&&&&&&int&score2&=&0;
&&&&&&&&&&&&&&&&Rect&newNode&=&ScoreRect((int)rects[i].width,&(int)rects[i].height,&method,&ref&score1,&ref&score2);
&&&&&&&&&&&&&&&&if&(score1&&&bestScore1&||&(score1&==&bestScore1&&&&score2&&&bestScore2))
&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&bestScore1&=&score1;
&&&&&&&&&&&&&&&&&&&&bestScore2&=&score2;
&&&&&&&&&&&&&&&&&&&&bestNode&=&newN
&&&&&&&&&&&&&&&&&&&&bestRectIndex&=&i;
&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&}
&&&&&&&&&&&&if&(bestRectIndex&==&-1)
&&&&&&&&&&&&&&&&return;
&&&&&&&&&&&&PlaceRect(bestNode);
&&&&&&&&&&&&rects.RemoveAt(bestRectIndex);
&&&&void&PlaceRect&(Rect&node)
&&&&&&&&int&numRectanglesToProcess&=&freeRectangles.C
&&&&&&&&for&(int&i&=&0;&i&&&numRectanglesToP&++i)
&&&&&&&&&&&&if&(SplitFreeNode(freeRectangles[i],&ref&node))
&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&freeRectangles.RemoveAt(i);
&&&&&&&&&&&&&&&&--i;
&&&&&&&&&&&&&&&&--numRectanglesToP
&&&&&&&&&&&&}
&&&&&&&&PruneFreeList();
&&&&&&&&usedRectangles.Add(node);
&&&&Rect&ScoreRect&(int&width,&int&height,&FreeRectChoiceHeuristic&method,&ref&int&score1,&ref&int&score2)
&&&&&&&&Rect&newNode&=&new&Rect();
&&&&&&&&score1&=&int.MaxV
&&&&&&&&score2&=&int.MaxV
&&&&&&&&switch&(method)
&&&&&&&&&&&&case&FreeRectChoiceHeuristic.RectBestShortSideFit:&newNode&=&FindPositionForNewNodeBestShortSideFit(width,&height,&ref&score1,&ref&score2);&break;
&&&&&&&&&&&&case&FreeRectChoiceHeuristic.RectBottomLeftRule:&newNode&=&FindPositionForNewNodeBottomLeft(width,&height,&ref&score1,&ref&score2);&break;
&&&&&&&&&&&&case&FreeRectChoiceHeuristic.RectContactPointRule:&newNode&=&FindPositionForNewNodeContactPoint(width,&height,&ref&score1);
&&&&&&&&&&&&score1&=&-score1;&//&Reverse&since&we&are&minimizing,&but&for&contact&point&score&bigger&is&better.
&&&&&&&&&&&&break;
&&&&&&&&&&&&case&FreeRectChoiceHeuristic.RectBestLongSideFit:&newNode&=&FindPositionForNewNodeBestLongSideFit(width,&height,&ref&score2,&ref&score1);&break;
&&&&&&&&&&&&case&FreeRectChoiceHeuristic.RectBestAreaFit:&newNode&=&FindPositionForNewNodeBestAreaFit(width,&height,&ref&score1,&ref&score2);&break;
&&&&&&&&//&Cannot&fit&the&current&rectangle.
&&&&&&&&if&(newNode.height&==&0)
&&&&&&&&&&&&score1&=&int.MaxV
&&&&&&&&&&&&score2&=&int.MaxV
&&&&&&&&return&newN
&&&&///&Computes&the&ratio&of&used&surface&area.
&&&&public&float&Occupancy&()
&&&&&&&&ulong&usedSurfaceArea&=&0;
&&&&&&&&for&(int&i&=&0;&i&&&usedRectangles.C&++i)
&&&&&&&&&&&&usedSurfaceArea&+=&(uint)usedRectangles[i].width&*&(uint)usedRectangles[i].
&&&&&&&&return&(float)usedSurfaceArea&/&(binWidth&*&binHeight);
&&&&Rect&FindPositionForNewNodeBottomLeft&(int&width,&int&height,&ref&int&bestY,&ref&int&bestX)
&&&&&&&&Rect&bestNode&=&new&Rect();
&&&&&&&&//memset(bestNode,&0,&sizeof(Rect));
&&&&&&&&bestY&=&int.MaxV
&&&&&&&&for&(int&i&=&0;&i&&&freeRectangles.C&++i)
&&&&&&&&&&&&//&Try&to&place&the&rectangle&in&upright&(non-flipped)&orientation.
&&&&&&&&&&&&if&(freeRectangles[i].width&&=&width&&&&freeRectangles[i].height&&=&height)
&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&int&topSideY&=&(int)freeRectangles[i].y&+&
&&&&&&&&&&&&&&&&if&(topSideY&&&bestY&||&(topSideY&==&bestY&&&&freeRectangles[i].x&&&bestX))
&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&bestNode.x&=&freeRectangles[i].x;
&&&&&&&&&&&&&&&&&&&&bestNode.y&=&freeRectangles[i].y;
&&&&&&&&&&&&&&&&&&&&bestNode.width&=&
&&&&&&&&&&&&&&&&&&&&bestNode.height&=&
&&&&&&&&&&&&&&&&&&&&bestY&=&topSideY;
&&&&&&&&&&&&&&&&&&&&bestX&=&(int)freeRectangles[i].x;
&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&}
&&&&&&&&&&&&if&(allowRotations&&&&freeRectangles[i].width&&=&height&&&&freeRectangles[i].height&&=&width)
&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&int&topSideY&=&(int)freeRectangles[i].y&+&
&&&&&&&&&&&&&&&&if&(topSideY&&&bestY&||&(topSideY&==&bestY&&&&freeRectangles[i].x&&&bestX))
&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&bestNode.x&=&freeRectangles[i].x;
&&&&&&&&&&&&&&&&&&&&bestNode.y&=&freeRectangles[i].y;
&&&&&&&&&&&&&&&&&&&&bestNode.width&=&
&&&&&&&&&&&&&&&&&&&&bestNode.height&=&
&&&&&&&&&&&&&&&&&&&&bestY&=&topSideY;
&&&&&&&&&&&&&&&&&&&&bestX&=&(int)freeRectangles[i].x;
&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&}
&&&&&&&&return&bestN
&&&&Rect&FindPositionForNewNodeBestShortSideFit&(int&width,&int&height,&ref&int&bestShortSideFit,&ref&int&bestLongSideFit)
&&&&&&&&Rect&bestNode&=&new&Rect();
&&&&&&&&//memset(&bestNode,&0,&sizeof(Rect));
&&&&&&&&bestShortSideFit&=&int.MaxV
&&&&&&&&for&(int&i&=&0;&i&&&freeRectangles.C&++i)
&&&&&&&&&&&&//&Try&to&place&the&rectangle&in&upright&(non-flipped)&orientation.
&&&&&&&&&&&&if&(freeRectangles[i].width&&=&width&&&&freeRectangles[i].height&&=&height)
&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&int&leftoverHoriz&=&Mathf.Abs((int)freeRectangles[i].width&-&width);
&&&&&&&&&&&&&&&&int&leftoverVert&=&Mathf.Abs((int)freeRectangles[i].height&-&height);
&&&&&&&&&&&&&&&&int&shortSideFit&=&Mathf.Min(leftoverHoriz,&leftoverVert);
&&&&&&&&&&&&&&&&int&longSideFit&=&Mathf.Max(leftoverHoriz,&leftoverVert);
&&&&&&&&&&&&&&&&if&(shortSideFit&&&bestShortSideFit&||&(shortSideFit&==&bestShortSideFit&&&&longSideFit&&&bestLongSideFit))
&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&bestNode.x&=&freeRectangles[i].x;
&&&&&&&&&&&&&&&&&&&&bestNode.y&=&freeRectangles[i].y;
&&&&&&&&&&&&&&&&&&&&bestNode.width&=&
&&&&&&&&&&&&&&&&&&&&bestNode.height&=&
&&&&&&&&&&&&&&&&&&&&bestShortSideFit&=&shortSideF
&&&&&&&&&&&&&&&&&&&&bestLongSideFit&=&longSideF
&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&}
&&&&&&&&&&&&if&(allowRotations&&&&freeRectangles[i].width&&=&height&&&&freeRectangles[i].height&&=&width)
&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&int&flippedLeftoverHoriz&=&Mathf.Abs((int)freeRectangles[i].width&-&height);
&&&&&&&&&&&&&&&&int&flippedLeftoverVert&=&Mathf.Abs((int)freeRectangles[i].height&-&width);
&&&&&&&&&&&&&&&&int&flippedShortSideFit&=&Mathf.Min(flippedLeftoverHoriz,&flippedLeftoverVert);
&&&&&&&&&&&&&&&&int&flippedLongSideFit&=&Mathf.Max(flippedLeftoverHoriz,&flippedLeftoverVert);
&&&&&&&&&&&&&&&&if&(flippedShortSideFit&&&bestShortSideFit&||&(flippedShortSideFit&==&bestShortSideFit&&&&flippedLongSideFit&&&bestLongSideFit))
&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&bestNode.x&=&freeRectangles[i].x;
&&&&&&&&&&&&&&&&&&&&bestNode.y&=&freeRectangles[i].y;
&&&&&&&&&&&&&&&&&&&&bestNode.width&=&
&&&&&&&&&&&&&&&&&&&&bestNode.height&=&
&&&&&&&&&&&&&&&&&&&&bestShortSideFit&=&flippedShortSideF
&&&&&&&&&&&&&&&&&&&&bestLongSideFit&=&flippedLongSideF
&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&}
&&&&&&&&return&bestN
&&&&Rect&FindPositionForNewNodeBestLongSideFit&(int&width,&int&height,&ref&int&bestShortSideFit,&ref&int&bestLongSideFit)
&&&&&&&&Rect&bestNode&=&new&Rect();
&&&&&&&&//memset(&bestNode,&0,&sizeof(Rect));
&&&&&&&&bestLongSideFit&=&int.MaxV
&&&&&&&&for&(int&i&=&0;&i&&&freeRectangles.C&++i)
&&&&&&&&&&&&//&Try&to&place&the&rectangle&in&upright&(non-flipped)&orientation.
&&&&&&&&&&&&if&(freeRectangles[i].width&&=&width&&&&freeRectangles[i].height&&=&height)
&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&int&leftoverHoriz&=&Mathf.Abs((int)freeRectangles[i].width&-&width);
&&&&&&&&&&&&&&&&int&leftoverVert&=&Mathf.Abs((int)freeRectangles[i].height&-&height);
&&&&&&&&&&&&&&&&int&shortSideFit&=&Mathf.Min(leftoverHoriz,&leftoverVert);
&&&&&&&&&&&&&&&&int&longSideFit&=&Mathf.Max(leftoverHoriz,&leftoverVert);
&&&&&&&&&&&&&&&&if&(longSideFit&&&bestLongSideFit&||&(longSideFit&==&bestLongSideFit&&&&shortSideFit&&&bestShortSideFit))
&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&bestNode.x&=&freeRectangles[i].x;
&&&&&&&&&&&&&&&&&&&&bestNode.y&=&freeRectangles[i].y;
&&&&&&&&&&&&&&&&&&&&bestNode.width&=&
&&&&&&&&&&&&&&&&&&&&bestNode.height&=&
&&&&&&&&&&&&&&&&&&&&bestShortSideFit&=&shortSideF
&&&&&&&&&&&&&&&&&&&&bestLongSideFit&=&longSideF
&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&}
&&&&&&&&&&&&if&(allowRotations&&&&freeRectangles[i].width&&=&height&&&&freeRectangles[i].height&&=&width)
&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&int&leftoverHoriz&=&Mathf.Abs((int)freeRectangles[i].width&-&height);
&&&&&&&&&&&&&&&&int&leftoverVert&=&Mathf.Abs((int)freeRectangles[i].height&-&width);
&&&&&&&&&&&&&&&&int&shortSideFit&=&Mathf.Min(leftoverHoriz,&leftoverVert);
&&&&&&&&&&&&&&&&int&longSideFit&=&Mathf.Max(leftoverHoriz,&leftoverVert);
&&&&&&&&&&&&&&&&if&(longSideFit&&&bestLongSideFit&||&(longSideFit&==&bestLongSideFit&&&&shortSideFit&&&bestShortSideFit))
&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&bestNode.x&=&freeRectangles[i].x;
&&&&&&&&&&&&&&&&&&&&bestNode.y&=&freeRectangles[i].y;
&&&&&&&&&&&&&&&&&&&&bestNode.width&=&
&&&&&&&&&&&&&&&&&&&&bestNode.height&=&
&&&&&&&&&&&&&&&&&&&&bestShortSideFit&=&shortSideF
&&&&&&&&&&&&&&&&&&&&bestLongSideFit&=&longSideF
&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&}
&&&&&&&&return&bestN
&&&&Rect&FindPositionForNewNodeBestAreaFit&(int&width,&int&height,&ref&int&bestAreaFit,&ref&int&bestShortSideFit)
&&&&&&&&Rect&bestNode&=&new&Rect();
&&&&&&&&//memset(&bestNode,&0,&sizeof(Rect));
&&&&&&&&bestAreaFit&=&int.MaxV
&&&&&&&&for&(int&i&=&0;&i&&&freeRectangles.C&++i)
&&&&&&&&&&&&int&areaFit&=&(int)freeRectangles[i].width&*&(int)freeRectangles[i].height&-&width&*&
&&&&&&&&&&&&//&Try&to&place&the&rectangle&in&upright&(non-flipped)&orientation.
&&&&&&&&&&&&if&(freeRectangles[i].width&&=&width&&&&freeRectangles[i].height&&=&height)
&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&int&leftoverHoriz&=&Mathf.Abs((int)freeRectangles[i].width&-&width);
&&&&&&&&&&&&&&&&int&leftoverVert&=&Mathf.Abs((int)freeRectangles[i].height&-&height);
&&&&&&&&&&&&&&&&int&shortSideFit&=&Mathf.Min(leftoverHoriz,&leftoverVert);
&&&&&&&&&&&&&&&&if&(areaFit&&&bestAreaFit&||&(areaFit&==&bestAreaFit&&&&shortSideFit&&&bestShortSideFit))
&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&bestNode.x&=&freeRectangles[i].x;
&&&&&&&&&&&&&&&&&&&&bestNode.y&=&freeRectangles[i].y;
&&&&&&&&&&&&&&&&&&&&bestNode.width&=&
&&&&&&&&&&&&&&&&&&&&bestNode.height&=&
&&&&&&&&&&&&&&&&&&&&bestShortSideFit&=&shortSideF
&&&&&&&&&&&&&&&&&&&&bestAreaFit&=&areaF
&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&}
&&&&&&&&&&&&if&(allowRotations&&&&freeRectangles[i].width&&=&height&&&&freeRectangles[i].height&&=&width)
&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&int&leftoverHoriz&=&Mathf.Abs((int)freeRectangles[i].width&-&height);
&&&&&&&&&&&&&&&&int&leftoverVert&=&Mathf.Abs((int)freeRectangles[i].height&-&width);
&&&&&&&&&&&&&&&&int&shortSideFit&=&Mathf.Min(leftoverHoriz,&leftoverVert);
&&&&&&&&&&&&&&&&if&(areaFit&&&bestAreaFit&||&(areaFit&==&bestAreaFit&&&&shortSideFit&&&bestShortSideFit))
&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&bestNode.x&=&freeRectangles[i].x;
&&&&&&&&&&&&&&&&&&&&bestNode.y&=&freeRectangles[i].y;
&&&&&&&&&&&&&&&&&&&&bestNode.width&=&
&&&&&&&&&&&&&&&&&&&&bestNode.height&=&
&&&&&&&&&&&&&&&&&&&&bestShortSideFit&=&shortSideF
&&&&&&&&&&&&&&&&&&&&bestAreaFit&=&areaF
&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&}
&&&&&&&&return&bestN
&&&&///&Returns&0&if&the&two&intervals&i1&and&i2&are&disjoint,&or&the&length&of&their&overlap&otherwise.
&&&&int&CommonIntervalLength&(int&i1start,&int&i1end,&int&i2start,&int&i2end)
&&&&&&&&if&(i1end&&&i2start&||&i2end&&&i1start)
&&&&&&&&&&&&return&0;
&&&&&&&&return&Mathf.Min(i1end,&i2end)&-&Mathf.Max(i1start,&i2start);
&&&&int&ContactPointScoreNode&(int&x,&int&y,&int&width,&int&height)
&&&&&&&&int&score&=&0;
&&&&&&&&if&(x&==&0&||&x&+&width&==&binWidth)
&&&&&&&&&&&&score&+=&
&&&&&&&&if&(y&==&0&||&y&+&height&==&binHeight)
&&&&&&&&&&&&score&+=&
&&&&&&&&for&(int&i&=&0;&i&&&usedRectangles.C&++i)
&&&&&&&&&&&&if&(usedRectangles[i].x&==&x&+&width&||&usedRectangles[i].x&+&usedRectangles[i].width&==&x)
&&&&&&&&&&&&&&&&score&+=&CommonIntervalLength((int)usedRectangles[i].y,&(int)usedRectangles[i].y&+&(int)usedRectangles[i].height,&y,&y&+&height);
&&&&&&&&&&&&if&(usedRectangles[i].y&==&y&+&height&||&usedRectangles[i].y&+&usedRectangles[i].height&==&y)
&&&&&&&&&&&&&&&&score&+=&CommonIntervalLength((int)usedRectangles[i].x,&(int)usedRectangles[i].x&+&(int)usedRectangles[i].width,&x,&x&+&width);
&&&&&&&&return&
&&&&Rect&FindPositionForNewNodeContactPoint&(int&width,&int&height,&ref&int&bestContactScore)
&&&&&&&&Rect&bestNode&=&new&Rect();
&&&&&&&&//memset(&bestNode,&0,&sizeof(Rect));
&&&&&&&&bestContactScore&=&-1;
&&&&&&&&for&(int&i&=&0;&i&&&freeRectangles.C&++i)
&&&&&&&&&&&&//&Try&to&place&the&rectangle&in&upright&(non-flipped)&orientation.
&&&&&&&&&&&&if&(freeRectangles[i].width&&=&width&&&&freeRectangles[i].height&&=&height)
&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&int&score&=&ContactPointScoreNode((int)freeRectangles[i].x,&(int)freeRectangles[i].y,&width,&height);
&&&&&&&&&&&&&&&&if&(score&&&bestContactScore)
&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&bestNode.x&=&(int)freeRectangles[i].x;
&&&&&&&&&&&&&&&&&&&&bestNode.y&=&(int)freeRectangles[i].y;
&&&&&&&&&&&&&&&&&&&&bestNode.width&=&
&&&&&&&&&&&&&&&&&&&&bestNode.height&=&
&&&&&&&&&&&&&&&&&&&&bestContactScore&=&
&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&}
&&&&&&&&&&&&if&(allowRotations&&&&freeRectangles[i].width&&=&height&&&&freeRectangles[i].height&&=&width)
&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&int&score&=&ContactPointScoreNode((int)freeRectangles[i].x,&(int)freeRectangles[i].y,&height,&width);
&&&&&&&&&&&&&&&&if&(score&&&bestContactScore)
&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&bestNode.x&=&(int)freeRectangles[i].x;
&&&&&&&&&&&&&&&&&&&&bestNode.y&=&(int)freeRectangles[i].y;
&&&&&&&&&&&&&&&&&&&&bestNode.width&=&
&&&&&&&&&&&&&&&&&&&&bestNode.height&=&
&&&&&&&&&&&&&&&&&&&&bestContactScore&=&
&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&}
&&&&&&&&return&bestN
&&&&bool&SplitFreeNode&(Rect&freeNode,&ref&Rect&usedNode)
&&&&&&&&//&Test&with&SAT&if&the&rectangles&even&intersect.
&&&&&&&&if&(usedNode.x&&=&freeNode.x&+&freeNode.width&||&usedNode.x&+&usedNode.width&&=&freeNode.x&||
&&&&&&&&&&&&usedNode.y&&=&freeNode.y&+&freeNode.height&||&usedNode.y&+&usedNode.height&&=&freeNode.y)
&&&&&&&&&&&&return&false;
&&&&&&&&if&(usedNode.x&&&freeNode.x&+&freeNode.width&&&&usedNode.x&+&usedNode.width&&&freeNode.x)
&&&&&&&&&&&&//&New&node&at&the&top&side&of&the&used&node.
&&&&&&&&&&&&if&(usedNode.y&&&freeNode.y&&&&usedNode.y&&&freeNode.y&+&freeNode.height)
&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&Rect&newNode&=&freeN
&&&&&&&&&&&&&&&&newNode.height&=&usedNode.y&-&newNode.y;
&&&&&&&&&&&&&&&&freeRectangles.Add(newNode);
&&&&&&&&&&&&}
&&&&&&&&&&&&//&New&node&at&the&bottom&side&of&the&used&node.
&&&&&&&&&&&&if&(usedNode.y&+&usedNode.height&&&freeNode.y&+&freeNode.height)
&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&Rect&newNode&=&freeN
&&&&&&&&&&&&&&&&newNode.y&=&usedNode.y&+&usedNode.
&&&&&&&&&&&&&&&&newNode.height&=&freeNode.y&+&freeNode.height&-&(usedNode.y&+&usedNode.height);
&&&&&&&&&&&&&&&&freeRectangles.Add(newNode);
&&&&&&&&&&&&}
&&&&&&&&if&(usedNode.y&&&freeNode.y&+&freeNode.height&&&&usedNode.y&+&usedNode.height&&&freeNode.y)
&&&&&&&&&&&&//&New&node&at&the&left&side&of&the&used&node.
&&&&&&&&&&&&if&(usedNode.x&&&freeNode.x&&&&usedNode.x&&&freeNode.x&+&freeNode.width)
&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&Rect&newNode&=&freeN
&&&&&&&&&&&&&&&&newNode.width&=&usedNode.x&-&newNode.x;
&&&&&&&&&&&&&&&&freeRectangles.Add(newNode);
&&&&&&&&&&&&}
&&&&&&&&&&&&//&New&node&at&the&right&side&of&the&used&node.
&&&&&&&&&&&&if&(usedNode.x&+&usedNode.width&&&freeNode.x&+&freeNode.width)
&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&Rect&newNode&=&freeN
&&&&&&&&&&&&&&&&newNode.x&=&usedNode.x&+&usedNode.
&&&&&&&&&&&&&&&&newNode.width&=&freeNode.x&+&freeNode.width&-&(usedNode.x&+&usedNode.width);
&&&&&&&&&&&&&&&&freeRectangles.Add(newNode);
&&&&&&&&&&&&}
&&&&&&&&return&true;
&&&&void&PruneFreeList&()
&&&&&&&&for&(int&i&=&0;&i&&&freeRectangles.C&++i)
&&&&&&&&&&&&for&(int&j&=&i&+&1;&j&&&freeRectangles.C&++j)
&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&if&(IsContainedIn(freeRectangles[i],&freeRectangles[j]))
&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&freeRectangles.RemoveAt(i);
&&&&&&&&&&&&&&&&&&&&--i;
&&&&&&&&&&&&&&&&&&&&break;
&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&if&(IsContainedIn(freeRectangles[j],&freeRectangles[i]))
&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&freeRectangles.RemoveAt(j);
&&&&&&&&&&&&&&&&&&&&--j;
&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&}
&&&&bool&IsContainedIn&(Rect&a,&Rect&b)
&&&&&&&&return&a.x&&=&b.x&&&&a.y&&=&b.y
&&&&&&&&&&&&&&&a.x&+&a.width&&=&b.x&+&b.width
&&&&&&&&&&&&&&&a.y&+&a.height&&=&b.y&+&b.
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:354665次
积分:4430
积分:4430
排名:第7043名
原创:11篇
转载:560篇
评论:13条
(1)(6)(3)(6)(1)(1)(12)(4)(9)(4)(2)(20)(6)(1)(2)(11)(27)(4)(4)(5)(4)(4)(12)(3)(22)(2)(1)(17)(5)(3)(4)(9)(1)(16)(5)(6)(4)(18)(51)(13)(8)(50)(23)(12)(8)(5)(7)(8)(18)(7)(11)(6)(17)(11)(7)(6)(5)(28)(5)
(window.slotbydup = window.slotbydup || []).push({
id: '4740881',
container: s,
size: '200,200',
display: 'inlay-fix'}

我要回帖

更多关于 unity制作游戏过程 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信