新人求教关于unity层级中layer层级的设置问题

新人,求教一个问题,关于提取unity3D格式里的文件_unity3d吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:60,865贴子:
新人,求教一个问题,关于提取unity3D格式里的文件收藏
没有工程和源代码,是那种成品的游戏的DATA文件夹里的unity3D格式的文件很喜欢游戏里的音乐,想把文件里的音频提取出来,不知道该怎么做,贴吧里的大大们帮忙指点一下,谢谢啦我是个新人,提的问题可能比较小白,还请各位见谅啊
unity3d,学习专业的游戏引擎-unity3d.达内游戏主程培训,一般要4-16周,就可掌握.变高端游戏达人-薪资翻番.unity3d费用根据培训课时定,上海官方咨询-unity3d.
兄弟,还在吗,我也有同样的问题,和你的一模一样,你的解决了吗
登录百度帐号推荐应用
为兴趣而生,贴吧更懂你。或Unity层级浅谈
版权所有,禁止匿名转载;禁止商业使用;禁止个人使用。
该文章来自用户转载
前言   用于管理本知识集所有源代码的github库此前一直以分支的形式对应不同的知识点。现在开来这样做是有点麻烦的。各位拉取之后还得迁到对应分支。我现在改为全部在master下新建项目的形式,大家拉取之后打开对应的项目就行了。原本的master分支我已经迁出一个OldMaster保留下来,似乎对应的是我的这篇文章:UGUI动态加载对话框.   好了,言归正传,我们来谈谈今天的话题,Unity中的层级(layer). 什么是Layer   层级是Unity中场景物体的一种属性。摄像机可以指明渲染层级以渲染场景中的部分物体。灯光可以指明照射层级以照亮部分物体(可以指定照亮某些层级的物体以显示阴影)。层级还能用于设置物理碰撞关系。 添加与设置Layer   添加与设置Layer都可以选中一个物体之后在Inspector面板中操作。如下图所示:
查看MainCamera的层级
查看已有层级   Unity内置了5个层级,并预留了3个层级给引擎使用。用户可以自定义序号为8至31的层级。总共有32个层级是方便用户使用int类型做位操作取得想要的层级组合。 用法实验 摄像机与灯光   我们来创建一个简单的场景,以更好的领会层级的用法。   新建一个Unity工程,默认场景中已经有一个MainCamera和一个Directional Light。新建一个Plane作为我们的地面。新建一个Cube物体为其添加Cube层级。新建一个Sphere物体为其添加Sphere层级。新建一个Capsule物体保留Default层级。保存场景为UseLayer。   指定MainCamera的Culling Mask为不拍摄Sphere,如图所示:
摄像机的拍摄层级   指定Directional Light的照射层级为不包含Cube,如图所示:
Directional Light的照射层级
  调整物体与摄像机的位置及角度,使摄像机的拍摄视锥能够包含场景中的所有物体,最终可以达到如下图的效果:
运行效果   可以看到我们拍摄了Game视图中没有渲染Sphere物体和其影子,渲染了Cube物体却没有影子。Scene视图的摄像机是渲染所有层级物体的,可以用于比较。在Scene视图中Sphere是有影子的,说明我们的Directional Light是照射了Sphere层级的物体的。Capsule物体只用于比较。
物理检测   层级另外的用法是物理检测。点击菜单Edit-&Project Settings-&Physics.可以查看项目的物理碰撞设置:
物理层级碰撞矩阵   这里的设置将影响OnCollisionEnter等消息的发送。   而射线检测本就要去指定检测层级:
1234int layerMask = LayerMask.NameToLayer("Cube");
if (Physics.Raycast(transform.position, Vector3.forward, Mathf.Infinity, layerMask))
Debug.Log("The ray hit the Cube");
关于子物体层级的设置与讨论   在游戏中,我们经常需要动态指定物体的层级,而Unity目前没有提供指定物体子节点的层级的接口。如果只是简单的设置物体的layer属性,是无法改变物体子节点的层级的。我们需要自己实现改变子物体层级的接口。   Unity的官方社区和论坛都有人讨论这个问题。这里附上链接供大家参考: /threads/change-gameobject-layer-at-run-time-wont-apply-to-child.10091/ /questions/168084/change-layer-of-child.html /questions/26479/fast-layer-assignment.html   我参照网上的做法也写了一个测试。在刚刚的工程中新建一个场景,命名为SetLayer。新建脚本如下,并挂载MainCamera下:
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155using System.Collections.G using UnityE public class SetLayer : MonoBehaviour {
void Start()
GameObject root = Util.CreateHeirarchy();
float startTime = Time.realtimeSinceStartup
Util.SetLayerOnAll(root, LayerMask.NameToLayer("Cube"));
float totalTimeMs = (Time.realtimeSinceStartup - startTime) * 1000;
print("Set layer on all time: " + totalTimeMs + "ms");
startTime = Time.realtimeSinceS
Util.SetLayerRecusively(root, LayerMask.NameToLayer("Sphere"));
totalTimeMs = (Time.realtimeSinceStartup - startTime) * 1000;
print("Set layer on all recursive time: " + totalTimeMs + "ms");
startTime = Time.realtimeSinceS
Util.SetLayerNotRecusively(root.transform, LayerMask.NameToLayer("Cube"));
totalTimeMs = (Time.realtimeSinceStartup - startTime) * 1000;
print("Set layer on not recursive time: " + totalTimeMs + "ms");
public static class Util
public static GameObject CreateHeirarchy()
GameObject root = new GameObject();
GameObject[] children = new GameObject[100];
for (int i = 0; i & 100; i++)
GameObject child = new GameObject();
child.transform.parent = root.
children[i] =
GameObject[] grandchildren = new GameObject[1000];
for (int i = 0;i & 1000;i++)
GameObject grandchild = new GameObject();
grandchild.transform.parent = children[Random.Range(0, 99)].
grandchildren[i] =
for (int i = 0;i & 10000; i++)
GameObject greatgrandchild = new GameObject();
greatgrandchild.transform.parent = grandchildren[Random.Range(0, 999)].
public static void SetLayerOnAll(GameObject obj, int layer)
if (null == obj)
foreach (Transform trans in obj.GetComponentsInChildren(true))
trans.gameObject.layer =
public static void SetLayerRecusively(GameObject obj, int layer)
if (null == obj)
obj.layer =
foreach (Transform child in obj.transform)
SetLayerRecusively(child.gameObject, layer);
public static void SetLayerNotRecusively(Transform root, int layer)
Stack moveTargets = new Stack();
moveTargets.Push(root);
Transform currentT
while (moveTargets.Count != 0)
currentTarget = moveTargets.Pop();
currentTarget.gameObject.layer =
foreach (Transform child in currentTarget)
moveTargets.Push(child);
}   测试结果是三种写法消耗时间差不多,普遍GetComponentsInChildren更快。
结束语   如果你喜欢本文,那就点个喜欢吧。本文的github库在这里,欢迎大家fork。   文/kashiwa(简书作者)   原文链接:/p/a12   著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。 腾讯GAD游戏程序交流群:
分类:(转载)Unity3D圈
微信扫一扫
开拓游戏领域新视野
GAD游戏开发qq群:
登录后参与讨论。点击
请勿发表无意义的内容请勿发表重复内容请勿发表交易类内容禁止发表广告宣传贴请使用文明用语其它
淫秽色情政治倾向人身攻击抄袭剽窃广告刷屏恶意挖坟冒充他人其它20721人阅读
Unity3D(23)
最近看别人写的Demo,里面这个Linecast字段的LayerMask参数看了半天也没看懂
void&Update()
&&&&&&&&//&The&player&is&grounded&if&a&linecast&to&the&groundcheck&position&hits&anything&on&the&ground&layer.
&&&&&&&&grounded&=&Physics2D.Linecast(transform.position,&groundCheck.position,&1&&&&LayerMask.NameToLayer(&Ground&));&&
&&&&&&&&//&If&the&jump&button&is&pressed&and&the&player&is&grounded&then&the&player&should&jump.
&&&&&&&&if(Input.GetButtonDown(&Jump&)&&&&grounded)
&&&&&&&&&&&&jump&=&true;
后来去官网看,半天也没个例子,还是google吧,在网上看到各路大神的解释,终于明白了,LayerMask实际上是一个位码操作,在Unity3d中Layers一共有32层,这个是不能增加或者减少的:
摘自官网:
Layers&are used throughout Unity as
a way to create groups of objects that share particular characteristics (see&&for
further details). Layers are primarily used to restrict operations such as raycasting or rendering so that they are only applied to the groups of objects that are relevant. In the manager, the first eight layers are defaults used by Unity and are not editable.
However, layers from 8 to 31 can be given custom names just by typing in the appropriate text box. Note that unlike tags,
the number of layers cannot be increased.
所以那个LayerMask实际上是用Int32的32个位来表示每个层级,当这个位为1时表示使用这个层,为0时表示不用这个层。
回到上面的例子:
1&&&&LayerMask.NameToLayer(&Ground&)
这一句实际上表示射线查询只在Ground所在这个层级查找。
再来看看NameToLayer是干嘛的。
官网解释:
Given a layer name, returns the layer index as defined by either a Builtin or a User Layer in the&.
是返回的该名字所定义的层的层索引,注意是从0开始。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:236609次
积分:2114
积分:2114
排名:第14403名
原创:22篇
转载:34篇
评论:21条
(2)(11)(19)(8)(6)(2)(8)程序写累了,就来玩玩酷跑小游戏吧,嘿嘿。
雨松MOMO送你一首歌曲,嘿嘿。
#你好Unity3D#避免代码被反编译(来自我的长微博)
#你好Unity3D#避免代码被反编译(来自我的长微博)
围观46538次
编辑日期: 字体:
我最近研究发现80%以上的Unity3D游戏都没有做代码混淆。而且我觉得反编译后的代码可阅读性更加好。今天把《锁链战记》的代码和资源都反编译出来了。
1.Unity编译后最终会将代码编译在dll里面,无论是ios还是Android解开包以后都可以拿到dll,路径在Data/Managed/Assembly-CSharp.dll
2.IOS其实不用做代码混淆,应该是苹果帮我们做了,反编译以后只能看到变量名,和方法名,但是具体的方法体内的代码是万全看不到的,不过安卓不行!!!
3.所以如果要反编译某游戏的代码,一定要去找它的Android版本,然后解开包,拿出它的Assembly-CSharp.dl
4.在Windows上去下载.NET Reflector 8这个反编译dll的软件,网上一大堆,但是一定要下载最新版本。目前我没找到可以在MAC上反编译dll的软件,如果那位大神知道请一定要告诉我噢。
5.mac 上反编译,请看我的另一篇文章
把Assembly-CSharp直接拖进去。
所有的代码,类名,方法名,方法体,一清二楚。这代码,这缩进,嘿嘿。AssetbundleManager应该就是他们自己写的处理Assetbundle的下载管理类了。
如果有心的话你可以全局搜索一下”http”关键字 可能就能找到CDN或者Assetbundle的下载地址了。
如果避免自己的游戏被反编译
大家可以去搜索一下Codeguard这个插件,(网上可以找到破解版)它可以防止你的代码被反编译。它主要是改名,把你的方法名,方法体名子修改了,变量名修改了。虽然有点弱但是它的优点是比较方便,因为可以在打包的时候自动完成代码混淆的工作。不用自己去手工做混淆,我不知道有没有更好的自动混淆方法,如果那位大神知道请一定要告诉我。
另外,还有一个更高级的办法。直接找unity官方,它们有防止代码反编译的服务,绝对有效。还有一个方法 用Crypto Obfuscator for .Net 这东西可以完美混淆Unity for Android的代码,也支持打包APK 时批处理脚本完成混淆部分。但是MAC 上不支持,看了一大堆混淆.net 的方法,全部是基于windows上的。 有哪位大神知道怎么在mac上进行Andorid的混淆工作。。
本文固定链接:
转载请注明:
雨松MOMO提醒您:亲,如果您觉得本文不错,快快将这篇文章分享出去吧 。另外请点击网站顶部彩色广告或者捐赠支持本站发展,谢谢!
作者:雨松MOMO
专注移动互联网,Unity3D游戏开发
如果您愿意花10块钱请我喝一杯咖啡的话,请用手机扫描二维码即可通过支付宝直接向我捐款哦。
您可能还会对这些文章感兴趣!12513人阅读
Unity3D(14)
最近连续遇到了几个绘制图像之间相互遮挡关系不正确的问题,网上查找的信息比较凌乱,所以这里就把自己解决问题中总结的经验记录下来。
Unity中的渲染顺序自上而下大致分为三层。 最高层为Camera层,可以在Camera的depth那里设置,设置之后,图形的渲染顺序就是先绘制depth低的相机下的物体,再绘制depth高的相机下的物体,也就是说,depth高的相机会覆盖depth低的相机(具体的覆盖关系有don't clear, solid color等等几种)
比Camera层稍低一层的是sorting layer层, 随便找一个可以设置sorting layer的地方,选择sorting layer,点添加按钮,就可以看到当前所有的sorting layer,并且可以更改sorting layer的顺序,排位靠后的sorting layer会覆盖排位靠前的sorting layer。 设置好sorting layer的相互关系之后,就可以给任何一个继承于Renderer类,或者有renderer的子类作为field的对象设置sorting layer了。 注意这些sorting
layer的遮挡关系是在同一个camera的层级下的。 不同camera下的renderer渲染顺序以camera的depth为准。 有的component的sorting layer可以直接在unity editor里面设置,比如Sprite Renderer。 有的则需要用代码来设置,比如设置Particle system的sorting layer, 就需要在代码中取到 ParticleSystem.Renderer.SortingLayer 来进行设置。
比sorting layer再低一层的是sorting order, 这个数字指代的是在同一个sorting layer下的渲染顺序,用法很明显就不赘述了。
需要注意不要混淆的是gameobject的layer,和renderer的sorting layer。 gameObject的layer个人理解是一个逻辑上的分层,用于camera的culling mask等。 而renderer的sorting layer则用于渲染。只有继承与renderer或者有renderer作为filed的component才需要设置sorting layer。
另外需要指出的是,常用的NGUI的widget depth其本质也是一个sorting layer下的sorting order。 NGUI好像用的是一个叫做“UI&的sorting layer。 由此大家如果有需要,也可以自己取Hack NGUI的代码,把NGUI的sorting layer暴露出来供自己定制。
简单总结一下,决定Unity渲染关系的层级顺序是:
sorting layer
sorting order
如文章中有不正确的地方,欢迎指正。 ^_^
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:2089004次
积分:20652
积分:20652
排名:第281名
原创:179篇
转载:864篇
译文:44篇
评论:213条
(1)(1)(1)(1)(2)(5)(1)(1)(4)(12)(15)(19)(9)(3)(9)(3)(2)(7)(5)(1)(3)(14)(24)(20)(28)(14)(21)(19)(36)(26)(18)(21)(35)(49)(23)(60)(38)(33)(51)(49)(58)(44)(67)(31)(44)(70)(90)(1)

我要回帖

更多关于 unity层级 的文章

 

随机推荐