unity 烘焙场景的创建、保存和使用(附demo项目)

这是一个入门教程,demo项目:

practice4.unitypackage
https://pan.baidu.com/s/1tnDv3sDUzMlk1YnSmJV29w 密码:1234

1.打开Unity,新建一个场景

2.打开Light窗口:

unity 烘焙场景的创建、保存和使用(附demo项目)_第1张图片

如下图红框处设置参数:

 unity 烘焙场景的创建、保存和使用(附demo项目)_第2张图片

 调整导入的模型参数:

1.导入本地materials,并apply:

unity 烘焙场景的创建、保存和使用(附demo项目)_第3张图片

 2.打勾,并apply:

unity 烘焙场景的创建、保存和使用(附demo项目)_第4张图片

 把模型拖拽到Hierarchy窗口,右键对象,点击下图方框处:

unity 烘焙场景的创建、保存和使用(附demo项目)_第5张图片

勾选对象的static属性: 

 unity 烘焙场景的创建、保存和使用(附demo项目)_第6张图片

设置灯光的属性:

unity 烘焙场景的创建、保存和使用(附demo项目)_第7张图片

 回到Light窗口,点击按钮开始烘焙:

unity 烘焙场景的创建、保存和使用(附demo项目)_第8张图片

等待几分钟即可烘焙好:

原图:

unity 烘焙场景的创建、保存和使用(附demo项目)_第9张图片 烘焙后效果图:

unity 烘焙场景的创建、保存和使用(附demo项目)_第10张图片

 但是这个模型只能放在当前场景使用,要想在别的场景也能使用,就需要制作预设。

首先拖拽对象到资源窗口创建预设,并给预设附一个PrefabLightmapData脚本,上面的demo项目里有,代码如下:

using UnityEngine;
using System.Collections.Generic;

public class PrefabLightmapData : MonoBehaviour {
	[System.Serializable]
	struct RendererInfo {
		public Renderer renderer;
		public int lightmapIndex;
		public Vector4 lightmapOffsetScale;
	}

	[SerializeField]
	RendererInfo[] m_RendererInfo;
	[SerializeField]
	Texture2D[] m_Lightmaps;

	void Awake() {
		if (m_RendererInfo == null || m_RendererInfo.Length == 0)
			return;

		var lightmaps = LightmapSettings.lightmaps;
		var combinedLightmaps = new LightmapData[lightmaps.Length + m_Lightmaps.Length];

		lightmaps.CopyTo(combinedLightmaps, 0);
		for (int i = 0; i < m_Lightmaps.Length; i++) {
			combinedLightmaps[i + lightmaps.Length] = new LightmapData();
			combinedLightmaps[i + lightmaps.Length].lightmapColor = m_Lightmaps[i];
		}

		ApplyRendererInfo(m_RendererInfo, lightmaps.Length);
		LightmapSettings.lightmaps = combinedLightmaps;
	}


	static void ApplyRendererInfo(RendererInfo[] infos, int lightmapOffsetIndex) {
		for (int i = 0; i < infos.Length; i++) {
			var info = infos[i];
			info.renderer.lightmapIndex = info.lightmapIndex + lightmapOffsetIndex;
			info.renderer.lightmapScaleOffset = info.lightmapOffsetScale;
		}
	}

#if UNITY_EDITOR
	[UnityEditor.MenuItem("Assets/Bake Prefab Lightmaps")]
	static void GenerateLightmapInfo() {
		if (UnityEditor.Lightmapping.giWorkflowMode != UnityEditor.Lightmapping.GIWorkflowMode.OnDemand) {
			Debug.LogError("ExtractLightmapData requires that you have baked you lightmaps and Auto mode is disabled.");
			return;
		}
		UnityEditor.Lightmapping.Bake();

		PrefabLightmapData[] prefabs = FindObjectsOfType();

		foreach (var instance in prefabs) {
			var gameObject = instance.gameObject;
			var rendererInfos = new List();
			var lightmaps = new List();

			GenerateLightmapInfo(gameObject, rendererInfos, lightmaps);

			instance.m_RendererInfo = rendererInfos.ToArray();
			instance.m_Lightmaps = lightmaps.ToArray();

			var targetPrefab = UnityEditor.PrefabUtility.GetPrefabParent(gameObject) as GameObject;
			if (targetPrefab != null) {
				//UnityEditor.Prefab
				UnityEditor.PrefabUtility.ReplacePrefab(gameObject, targetPrefab);
			}
		}
	}

	static void GenerateLightmapInfo(GameObject root, List rendererInfos, List lightmaps) {
		var renderers = root.GetComponentsInChildren();
		foreach (MeshRenderer renderer in renderers) {
			if (renderer.lightmapIndex != -1) {
				RendererInfo info = new RendererInfo();
				info.renderer = renderer;
				info.lightmapOffsetScale = renderer.lightmapScaleOffset;

				Texture2D lightmap = LightmapSettings.lightmaps[renderer.lightmapIndex].lightmapColor;
				info.lightmapIndex = lightmaps.IndexOf(lightmap);
				if (info.lightmapIndex == -1) {
					info.lightmapIndex = lightmaps.Count;
					lightmaps.Add(lightmap);
				}

				rendererInfos.Add(info);
			}
		}
	}
#endif

}

 然后点击菜单栏的下图按钮:

unity 烘焙场景的创建、保存和使用(附demo项目)_第11张图片

 等待几分钟后,烘焙好了,并且这个预设保存了烘焙信息,也可以放到别的场景使用了,但是要注意的是,一个场景只能烘焙一样东西,你要是想烘焙另一个东西,就必须新建一个场景烘焙完得到预设。这是因为每次烘焙场景都生成一张烘焙图,这个图对应了场景的光照,并保存起来:

unity 烘焙场景的创建、保存和使用(附demo项目)_第12张图片

重复在一个场景烘焙,会覆盖这张图,那么原本烘焙的东西就白费了。

另外,把模型的比例调大,可以获得分辨率更加高的烘焙结果。

另外:

Lighting窗口中的Bounces的大小代表环境光在场景中的最大漫反射次数,所以这个树枝越大,没有被直接照射的部位就会越亮,阴影的轮廓也会越模糊。

 

制作完预设后,要想在别的场景使用,还需要拖拽Lighting Data 给该场景:

unity 烘焙场景的创建、保存和使用(附demo项目)_第13张图片

Lighting Data 所属文件夹的位置与scene文件在同一个子目录上:

unity 烘焙场景的创建、保存和使用(附demo项目)_第14张图片

你会发现烘焙的效果还可以和场景中的光照叠加:

unity 烘焙场景的创建、保存和使用(附demo项目)_第15张图片效果更加逼真啦。 

 

你可能感兴趣的:(C#和unity,烘焙,unity,保存,lightmap,prefab)