u3draytrace lightmapss 怎么找到物品

Using external lightmaps in Unity 5.0 & Unity
I have a project in an earlier version of Unity (before Unity 5), that was lightmapped outside of Unity. I want to upgrade it for Unity 5.
I want to use external lightmaps for Unity 5.
If any of the lightmap's properties are changed via scripting and the scene is closed and re-opened again, the changes done before are not shown.
In order for the external lightmaps to be shown in the scene, there have to be several parameter values assigned from the API by script first. In Unity 4, these values were serialized automatically when the properties of the lightmap were stored with the scene file. Yet, an automated process like hitting the bake button resulted in lots of changes that were highly likely to cause merge conflicts in the scene files. In Unity 5, the properties that are needed to use external lightmaps are only serialized when there is a build. This helps to avoid the merge conflicts. Therefore, if you change one of the parameters and load the scene, the changes will not show.
Resolution
To use external lightmaps, you need to have:
your external lightmap in a folder
a script that can create a
array in which you can store your external lightmaps (You could do this by creating a public data array type to be shown in the Editor and just drag your lightmap to the slot created).
Then you need to reference the object's renderer and assign the external lightmap by accessing the lightMap's array index (). Next, you should point at a specific area within it by using the scale & offset (). Finally, you will need to serialize all the properties' information in a file and read it to reset this information by using an Editor script every time the scene is opened. You could also do this through a script.
More Information
For more information see the links below:
This article applies to Unity versions 5.x
Have more questions?程序写累了,就来玩玩酷跑小游戏吧,嘿嘿。
雨松MOMO送你一首歌曲,嘿嘿。
#你好Unity3D#Unity获取游戏对象详解(来自我的长微博)
#你好Unity3D#Unity获取游戏对象详解(来自我的长微博)
围观113011次
编辑日期: 字体:
我觉得Unity里面的Transform 和 GameObject就像两个双胞胎兄弟一样,这俩哥们很要好,我能直接找到你,你也能直接找到我。我看很多人喜欢在类里面去保存GameObject对象。解决GameObject.Find()无法获取天生activie = false的问题。
private GameO
我觉得你最好不要保存GameObject ,而是去保存Transform ,因为Transform下的方法要比GameObject多,使用频率也要高很多。
其实我心里一直有个疑问,为什么unity不把GameObject和Transform合并成一个对象。
1.GameObject.Find()
通过场景里面的名子或者一个路径直接获取游戏对象。
GameObject root = GameObject.Find(“GameObject”);
我觉得如果游戏对象没再最上层,那么最好使用路径的方法,因为有可能你的游戏对象会有重名的情况,路径用“/”符号隔开即可。
GameObject root = GameObject.Find(“GameObject/Cube”);
GameObject.Find()使用起来很方便,但是它有个缺陷如下图所示,就是如果你的这个GameObject天生acive = false的话。那么你用GameObject.Find()是永远也无法获取它的对象的。如果对象都获取不到,那么对象身上脚本啊 组件啊啥的都是获取不到的,变成了没有意义的对象。
就这个问题我查过很多资料,最终也无果。。但是我用另外一个巧妙的办法可以解决它。(后面详解)或者你也可以提前把所有的游戏对象保存在内存中。
GameObject.Find()方法在游戏中的使用频率很高。但是它也很消耗性能,你可以想想它的原理肯定也是用类似递归的形式来做的,那么我们就要尽量更少的调用GameObject.Find()方法,可以把获取的游戏对象,保存在内存里,这是再好不过的选择了。 尤其是在Update方法中不要去 Find()游戏对象!!
2 .Transform.Find()
还记得上面我说过用GameObject无法获取天生acive = false的游戏对象,如果你用Transform.Find()的话就可以很好的获取,另外Unity还提供了一个Transform.FindChind()的方法,这个方法未来会被unity废弃,大家最好就别用了,用Transform.Find()可以取代。
如下代码,我们先获取顶级对象root 。接着用Find()去找它的子节点”xxxx”的对象,无论”xxxx”对象是否active = true 都是可以直接找到对象的。
&&&&&& GameObject root = GameObject.Find("GameObject");&&&&&& &&&&&&&&& GameObject xxxx =&&root.transform.Find("xxxx").gameObject;&&&&&&&&&&xxxx.SetActive(true);
Find()方法只能直接去找子节点,如果你想找 孙节点,那么可以用”/“符号把层级关系隔开,找起来很方便。同样无论”xxxx”对象是否active = true 都是可以直接找到对象的。
&&&&GameObject cube =&&root.transform.Find("xxxx/Cube").gameObject;
值得注意的是,unity规定了比如父节点active = true 并且子节点的 active = true 都满足的情况下 才能全部显示。使用Transform.Find()可以很方便的获取游戏对象,因为有了游戏对象,那么它身上的脚本啊组件啊什么的都可以很方便的获取到。
但是Transform.Find()必须要保证你的顶级父对象的activity = true。举个例子,你做了一个场景有一些地图你在场景里面预先activie = false了, 你希望在游戏中的某个时间点把它们都打开 setActive(true)
你可以把“map”节点放在一个active = true的GameObject上,无论是关闭 或者 显示 代码中写起来都很方便。 假如你的map节点就是顶级节点,那么它一旦天生acive = false ,那么你将无法得到它的对象,更无法设置它的属性了。
GameObject root = GameObject.Find(“GameObject”);
GameObject map =
root.transform.Find(“map”).gameO
map.SetActive(true);
3. unity 还提供了几个获取游戏对象的方法,但是我个人觉得使用频率不高,这里也简单说两句。
GameObject.FindGameObjectsWithTag(“tag”)
GameObject.FindWithTag(“tag”)
根据一个标记来获取游戏对象,返回一个 或者 一个数组,我个人觉得这个两个方法没啥用,因为既然需要用到标记那么相比这个游戏对象必然是非常特殊的一个,所以我会把它存在内存中。
Object.FindObjectOfType
Object.FindObjectsOfType
Resources.FindObjectsOfTypeAll
根据一个类型返回Object,比如 GameObject 、Texture、Animation 、甚至还可以是你自己写的一个脚本 的范型。它找起来很方便,可以返回一个 或者一个数组。 我觉得这几个方法其实游戏中也没啥用,不过在编辑器中使用的确实很频繁,比如你要做批量检查场景的工具,查找场景中有没有使用某个特殊类型的对象。 或者查看内存的占用量,看看当前内存中那些Texture没有被释放掉。 等等。
还有一个方法,如果你知道自对象的索引,还可以用下面的方法来获取,参数是index的索引。
transform.GetChild(0)
找到了一个即使隐藏root节点gameObject也能进行查找的方法。
1234567891011121314151617181920212223242526
GameObject[] pAllObjects = (GameObject[])Resources.FindObjectsOfTypeAll(typeof(GameObject));
&&&&&&&& foreach (GameObject pObject in pAllObjects)&&&&&&&& {
if (pObject.transform.parent != null)&&&&&&&&&&&& {&&&&&&&&&&&&&&&&&&&& continue;&&&&&&&&&&&& }&
if (pObject.hideFlags == HideFlags.NotEditable || pObject.hideFlags == HideFlags.HideAndDontSave)&&&&&&&&&&&& {&&&&&&&&&&&&&&&& continue;&&&&&&&&&&&& }&
if (Application.isEditor)&&&&&&&&&&&& {&&&&&&&&&&&&&&&& string sAssetPath = AssetDatabase.GetAssetPath(pObject.transform.root.gameObject);&&&&&&&&&&&&&&&& if (!string.IsNullOrEmpty(sAssetPath))&&&&&&&&&&&&&&&& {&&&&&&&&&&&&&&&&&&&& continue;&&&&&&&&&&&&&&&& }&&&&&&&&&&&& }&
Debug.Log(pObject.name);&&&&&&&& }
本文固定链接:
转载请注明:
雨松MOMO提醒您:亲,如果您觉得本文不错,快快将这篇文章分享出去吧 。另外请点击网站顶部彩色广告或者捐赠支持本站发展,谢谢!
作者:雨松MOMO
专注移动互联网,Unity3D游戏开发
如果您愿意花10块钱请我喝一杯咖啡的话,请用手机扫描二维码即可通过支付宝直接向我捐款哦。
您可能还会对这些文章感兴趣!unity3d LightmapSettings.lightmaps - Unity3d技术 - 泰课在线 - 国内专业的Unity在线学习平台|Unity3d培训|Unity教程|Unity教程 Unreal 虚幻 AR|移动开发|美术CG|UI平面设计|前端开发 - Powered By EduSohosponsored links
Unity3D教程:使用Unity直接制作Lightmap
Unity3D教程:使用Unity直接制作Lightmap。在制作游戏场景的Light Map多半是在3dsmax中用Render to Texture的方式制作:
通常是先用Sky Light把AO算好: Ambient Occlusion Map,然後另外算一张除了Skylight之外的所有光源效果的Light Map,然後两张在Photoshop用Screen的方式去叠在一起,日后只要光源有变动,就调整Light Map那张就可以了。
现在又多一种选择: Unity Lightmapping Tool,使用版本Unity 3.5 (免费版),可使用于iOS。
1. 制作UV2: UV2可以在,3dsmax先算好,也可进Unity再算。(我是在Unity算 因为我的场景通常是用obj档进来 比较不会有对位的问题 但obj档只能包含1个UV)
2. 打光: 把Key Light打在你想要的地方。(使用Unity Pro还可以用GI去bake 效果更好)
3. Unity Lightmapping AO相关设定:
到Window &Lightmapping打开Light Map功能,初次使用要先选要bake的物件 并勾选Static。
使用Unity直接制作Lightmap
Ambient Occlusion效果设定:
使用Unity直接制作Lightmap
A. 强度设在1。
B. AO的有效距离 单位是m 见後面比较图。
C. 贴图的大小。(细致度)
4. Unity Lightmapping Shadow相关设定 因为Shadow是Static baking的关系,所以不用Pro版也可用 如图:
使用Unity直接制作Lightmap
5. 制作Unity Light Map贴图(Bake): 好了之后按下Bake Scene。
6. 输出。(Export Package)
除了输出已经算好Lightmap的物件外 最重要的是Lightmap要一并输出给相关人员,然後再重新到Lightmapping视窗重新指定light map就可以了。
可在场景中只能即时预览5个光源,到第6个就会看不到效果。
只测试阴影效果或Key Light效果时,(如颜色) Ambient Occlusion设为0 可加快Baking速度,将Light map resolution调小点 也可加快速度。
* 版权声明:转载时请以超链接形式标明文章原始出处和作者信息
* 本文来自:Unity3D 教程手册
* 本文链接: http://www.unitymanual.com/3892.html
用Unity烘培后的多重纹理不能直接转到Unity中,还需要一个个的手动指认Shader.在Max里建立你的模型,然后Diffuse Map贴这个模型上,导出一个Fbx文件,然后再相同的模型和相同的Diffuse Map通道上,贴好烘培图,同样导出一个Fbx文件,最终的结果是2个Fbx文件,模型是相同的,其中一个包含材质UV信息,另一个包含LightMap材 ...
Unity3D教程:Unity制作连连看教程 GameManager.cs
游戏的核心代码,产生图片,判断是否可以销毁等. [color=#008ef1][font=宋体]using UnityE[/font][/color] using System.C using System.Collections.G ...
原创文章如需转载请注明:转载自风宇冲Unity3D教程学院
Shader第四讲:制作一个美丽的地球
Vertex and Fragment Shader例子二,制作一个自动旋转的3D地球. 下载美丽的地球工程 原理是 2张贴图,一张地球图,一张云层分布图 (1)通过uv.x即纹理坐标的横 ...
转载自风宇冲Unity3D教程学院 Shader第四讲:制作一个美丽的地球
Vertex and Fragment Shader例子二,制作一个自动旋转的3D地球. 下载美丽的地球工程 原理是 2张贴图,一张地球图,一张云层分布图 (1)通过uv.x即纹理坐标的横轴与时间相乘,产生球在移动的效果 (2)通过地球和云的颜色值叠加形成 ...
Unity3d教程之导入3dMax模型产生问题的解决办法 更新时间
来源:本站整理 Unity3d 导入3dMax模型会产生的问题,按照官方的说明,将max模型导成fbx档导入untiy似乎也不行?能解决吗?答案当然是肯定的,接下来小编将分享问题的解决办法.pc141-ps教程自学网(www.pc141.com) Unity3d 3 ...

我要回帖

更多关于 raytrace lightmaps 的文章

 

随机推荐