untiy 为预制体动态加载光照贴图

unity版本为2021.8
预制体不能携带光照贴图信息,只能我们自己准备了
多方查找加自己摸索终于找到了适合新版本的解决方案,直接贴代码

将这个脚本挂到预制体的最上级

using System.Collections;
using System.Collections.Generic;
using UnityEditor;
using UnityEngine;[System.Serializable]
public struct RendererInfo
{public Renderer renderer;//网格物体  网格和地形的光照信息是分开的public Terrain terrain;//地形public int lightmapIndex;public Vector4 lightmapScaleScaleOffset;
}
//记录光照贴图的信息
public class PrefabLightmapData : MonoBehaviour
{public RendererInfo[] m_RendererInfo;public Texture2D[] m_Lightmaps_light;//颜色贴图public Texture2D[] m_Lightmaps_dir;//方向贴图public Texture2D[] m_Lightmaps_shadowmask;//阴影贴图private void Awake() {RebuildLight();}public void RebuildLight(){if (m_RendererInfo == null || m_RendererInfo.Length == 0) return;LightmapData[] lightmapDataArray = new LightmapData[m_Lightmaps_light.Length];for (int i = 0; i < m_Lightmaps_light.Length; i++){LightmapData lightmapData = new LightmapData();if (i < m_Lightmaps_light.Length) lightmapData.lightmapColor = m_Lightmaps_light[i];if (i < m_Lightmaps_dir.Length) lightmapData.lightmapDir = m_Lightmaps_dir[i];if (i < m_Lightmaps_shadowmask.Length) lightmapData.shadowMask = m_Lightmaps_shadowmask[i];lightmapDataArray[i] = lightmapData;}//为预制体的物体应用光照贴图ApplyRendererInfo(m_RendererInfo);LightmapSettings.lightmaps = lightmapDataArray;//将光照贴图应用到Untiy}//应用光照贴图信息到重建的预制体private void ApplyRendererInfo(RendererInfo[] rendererInfoArray){for (int i = 0; i < rendererInfoArray.Length; i++){RendererInfo rendererInfo = rendererInfoArray[i];if (rendererInfo.renderer != null){rendererInfo.renderer.lightmapIndex = rendererInfo.lightmapIndex;rendererInfo.renderer.lightmapScaleOffset = rendererInfo.lightmapScaleScaleOffset;}else if (rendererInfo.terrain != null){rendererInfo.terrain.lightmapIndex = rendererInfo.lightmapIndex;rendererInfo.terrain.lightmapScaleOffset = rendererInfo.lightmapScaleScaleOffset;}}}
}
//自定义inspector面板
[CustomEditor(typeof(PrefabLightmapData))]
public class PrefabLightmapData_Inspector : Editor
{//重写OnInspectorGUI类(刷新Inspector面板)public override void OnInspectorGUI(){//继承基类方法base.OnInspectorGUI();PrefabLightmapData myScript = (PrefabLightmapData)target;//绘制ButtonRect rect = new Rect(0, 0,100,50);if (GUILayout.Button("重新构建烘焙光照")){myScript.RebuildLight();}}
}

在使用下方的脚本完成烘焙后,脚本将自动记录所有模型和地形的烘焙信息,并在运行后自动重建光照贴图,如果我们需要在不运行时查看光照贴图效果,可以手动点击“重新构建烘焙光照”的按钮
在这里插入图片描述

重写烘焙,烘焙完成后自动准备重建光照贴图所需要的信息

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public static class BackeLightMap
{[UnityEditor.MenuItem("Tools/光照/烘焙光照贴图")]private 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 = Object.FindObjectsOfType<PrefabLightmapData>();foreach (var prefabInScene in prefabs){GameObject scenePrefab = prefabInScene.gameObject;List<RendererInfo> rendererInfos = new List<RendererInfo>();//重建光照贴图时需要的信息List<Texture2D> lightmaps_light = new List<Texture2D>();//所有的光照贴图List<Texture2D> lightmaps_dir = new List<Texture2D>();//所有的光照贴图List<Texture2D> lightmaps_shadowmask = new List<Texture2D>();//所有的光照贴图GenerateLightmapInfo(scenePrefab, rendererInfos, lightmaps_light, lightmaps_dir, lightmaps_shadowmask);//获取当前物体的光照贴图信息和光照贴图//为光照贴图信息和光照贴图赋值prefabInScene.m_RendererInfo = rendererInfos.ToArray();prefabInScene.m_Lightmaps_light = lightmaps_light.ToArray();prefabInScene.m_Lightmaps_dir = lightmaps_dir.ToArray();prefabInScene.m_Lightmaps_shadowmask = lightmaps_shadowmask.ToArray();//替换掉已经保存的预制体GameObject sourcePrefab = UnityEditor.PrefabUtility.GetPrefabParent(prefabInScene) as GameObject;//GameObject sourcePrefab = UnityEditor.PrefabUtility.GetCorrespondingObjectFromSource(scenePrefab);if (sourcePrefab != null){UnityEditor.PrefabUtility.ReplacePrefab(scenePrefab, sourcePrefab);}}}//点击按钮生成光照贴图信息private static void GenerateLightmapInfo(GameObject root, List<RendererInfo> rendererInfoList, List<Texture2D> lightmaps_light, List<Texture2D> lightmaps_dir, List<Texture2D> lightmaps_shadowmask){//找到这个物体的所有网格MeshRenderer[] renderers = root.GetComponentsInChildren<MeshRenderer>();//遍历网格foreach (MeshRenderer meshRenderer in renderers){if (meshRenderer.lightmapIndex != -1){//收集光照贴图信息RendererInfo rendererInfo = new RendererInfo();rendererInfo.renderer = meshRenderer;rendererInfo.lightmapIndex = meshRenderer.lightmapIndex;rendererInfo.lightmapScaleScaleOffset = meshRenderer.lightmapScaleOffset;//收集光照贴图//颜色贴图Texture2D lightmap_light = LightmapSettings.lightmaps[meshRenderer.lightmapIndex].lightmapColor;AddLightMapToCheach(lightmaps_light, lightmap_light);//方向贴图Texture2D lightmap_dir = LightmapSettings.lightmaps[meshRenderer.lightmapIndex].lightmapDir;AddLightMapToCheach(lightmaps_dir, lightmap_dir);//shadowmaskTexture2D lightmap_shadowmask = LightmapSettings.lightmaps[meshRenderer.lightmapIndex].shadowMask;AddLightMapToCheach(lightmaps_shadowmask,lightmap_shadowmask);//光照信息rendererInfoList.Add(rendererInfo);}}//找到这个物体的所有网格Terrain[] terrains = root.GetComponentsInChildren<Terrain>();//遍历网格foreach (Terrain terrain in terrains){if (terrain.lightmapIndex != -1){//收集光照贴图信息RendererInfo rendererInfo = new RendererInfo();rendererInfo.terrain = terrain;rendererInfo.lightmapIndex = terrain.lightmapIndex;rendererInfo.lightmapScaleScaleOffset = terrain.lightmapScaleOffset;//收集光照贴图//颜色贴图Texture2D lightmap_light = LightmapSettings.lightmaps[terrain.lightmapIndex].lightmapColor;AddLightMapToCheach(lightmaps_light, lightmap_light);//方向贴图Texture2D lightmap_dir = LightmapSettings.lightmaps[terrain.lightmapIndex].lightmapDir;AddLightMapToCheach(lightmaps_dir, lightmap_dir);//shadowmaskTexture2D lightmap_shadowmask = LightmapSettings.lightmaps[terrain.lightmapIndex].shadowMask;AddLightMapToCheach(lightmaps_shadowmask, lightmap_shadowmask);//光照信息rendererInfoList.Add(rendererInfo);}}}//将一个光照贴图添加进缓存private static void AddLightMapToCheach(List<Texture2D> list,Texture2D texture){if (texture == null) return;int index = list.IndexOf(texture);//查找已有的集合里有没有这个元素,如果没有,返回-1if (index == -1){list.Add(texture);}}
}

工具栏里会出现烘焙按钮,点击烘焙光照贴图,不要再用Unity自己的烘焙了,为场景中所有挂载了PrefabLightmapData 的预制体烘焙光照
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/10026.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

美颜SDK是什么?深度学习技术在直播美颜SDK中的应用探析

美颜SDK的出现为直播、视频通话等应用提供了强大的美颜功能。接下来&#xff0c;我们将一同探讨美颜SDK的概念&#xff0c;以及深度学习技术在直播美颜SDK中的应用。 一、什么是美颜SDK&#xff1f; 美颜SDK是一种软件开发工具包&#xff0c;旨在为开发者提供便捷而强大的美颜…

四大误区:中台产品时设计你中招了几个?

01 误区一&#xff1a;管理系统分析工具数字化中台 传统企业在经营管理过程中会根据业务或管理需求&#xff0c;不断添加和升级诸如OA、CRM等不同类别的管理系统。 为了更好地响应前台的业务需求&#xff0c;有些企业成立了新的或扩大、加强了原有的技术部门&#xff0c;由…

C#上位机1ms级高精度定时任务

precisiontimer 安装扩展包 添加引用 完整代码 using PrecisionTiming;using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; us…

WinSCP软件出错:连接被意外关闭了

问题描述&#xff1a; WinSCP 登录 M3568 的 linux系统&#xff0c;提示 列出’/home/root’的目录项时出错&#xff0c;连接被意外关闭 具体提示如下图所示&#xff0c;列出’/home/root’的目录项时出错。 连接被意外关闭了 服务器发送命令的退出状态255 原因及解决&#xf…

notepad++安装 hex-editor插件

打开notepad 点击插件 搜索 hex-editor,点击右侧 安装install 安装成功后&#xff0c;在已安装插件中就有显示了

spring boot参数验证注解@NotNull、@NotBlank和@NotEmpty区别

目录 前言说明举例 前言 使用spring boot参数验证是常常会使用NotNull、NotBlank和NotEmpty三个判断是否不为空的注解&#xff0c;中文都有不能为空的意思&#xff0c;大部分使用者都傻傻分清它们之间到底有什么区别。今天就让咱们来一起探索它们之间的不同吧。 说明 注解名…

【数据库】数据库指令

一。数据库打开 1.命令行 2.进入mysql mysql -uroot -p密码 3.退出 exit&#xff1b; 二。针对数据库的操作 1.创建数据库&#xff08;有分号&#xff09; create database student; 2.使用数据库 use student 3.删除数据库&#xff08;有分号&#xff09; drop database…

数据库调优-数据库优化

数据库优化 如何发现复杂的SQL有问题&#xff1f; 一个个去explain吗&#xff1f;你有没有这样的困惑&#xff0c;开发代码运行顺畅丝滑&#xff0c;上生产了却卡的一逼&#xff1f; 哈哈&#xff0c;相信大家都会遇到这样的问题&#xff01; sql 复制代码 # 举个栗子&…

4. 从感知机到神经网络

目录 1. 从感知机到神经网络 2. 最简单的神经网络 3. 激活函数的引入 1. 从感知机到神经网络 之前章节我们了解了感知机&#xff0c;感知机可以处理与门、非与门、或门、异或门等逻辑运算&#xff1b;不过在感知机中设定权重的工作是由人工来做的&#xff0c;而设定合适的&a…

【将Maven源改为国内阿里云镜像源】

目录 一、如何配置Maven镜像源&#xff1f; 二、Idea中的Maven配置 ​三、项目与你本地仓库和中央仓库的联系 一、如何配置Maven镜像源&#xff1f; 1、打开你的Maven用户设置文件(settings.xml)。默认情况下&#xff0c;该文件存在于你的用户目录下的.m2文件夹中。如果你没…

Kafka 执行命令超时异常: Timed out waiting for a node assignment

Kafka 执行命令超时异常&#xff1a; Timed out waiting for a node assignment 问题描述&#xff1a; 搭建了一个kafka集群环境&#xff0c;在使用命令行查看已有topic时&#xff0c;报错如下&#xff1a; [rootlocalhost bin]# kafka-topics.sh --list --bootstrap-server…

《机器学习by周志华》学习笔记-决策树-01

本书中的「决策树」有时指学习方法,有时指学得的树。 1、基本流程 1.1、概念 基本流程,亦称「判定树」 决策树(decision tree),是一种常见的机器学习方法。以二分类任务为例,我们希望从给定训练数据集学得一个模型,用以对新样例进行分离。 以二分类任务为例,可看作对…

一图看懂 | 蓝卓煤炭行业解决方案

煤炭是我国能源保障的“压舱石,也是国民经济中重要的支柱产业之一无论是发电、建材、造纸、冶金、化工等工业领域都离不开煤炭近年来&#xff0c;在“双碳”及能源安全双重背景下推动智能化技术与煤炭产业的融合发展提升煤矿安全生产能力的重要性与日俱增智慧矿山的建设已逐渐成…

CentOS 7安装配置docker

CentOS 7、8安装、配置docker 这里宿主机的型号选择是centos7.9.2009的版本 1.宿主机关闭防火墙和selinux&#xff0c;配置ipv4 #设置SELinuxdisabled vim /etc/selinux/config SELinuxdisabled 查看防火墙状态&#xff1a;firewall-cmd --state 关闭防火墙&#xff1a;syst…

selenium爬取TapTap评论

上一篇写的beautifulsoup和request爬取出的结果有误。首先&#xff0c;TapTap网页以JS格式解析&#xff0c;且评论并没有“下一页”&#xff0c;而是每次加载到底部就要进行等待重新加载。我们需要做的&#xff0c;是模仿浏览器的行为&#xff0c;所以这里我们用Selenium的方式…

2024年数维杯B题完整代码和思路论文讲解与分析

2024数维杯数学建模完整代码和成品论文已更新&#xff0c;获取↓↓↓↓↓ https://www.yuque.com/u42168770/qv6z0d/bgic2nbxs2h41pvt?singleDoc# 2024数维杯数学建模B题45页论文和代码已完成&#xff0c;代码为全部问题的代码 论文包括摘要、问题重述、问题分析、模型假设、…

【项目实战】使用Github pages、Hexo如何10分钟内快速生成个人博客网站

文章目录 一.准备工作1.安装git2.安装node安装 cnpm 3.使用 GitHub 创建仓库&#xff0c;并配置 GitHub Pages0.Github Pages是什么1. 在 GitHub 上创建一个新仓库2. 创建您的静态网站3. 启用 GitHub Pages4. 等待构建完成5. 访问您的网站 二. Hexo1.什么是Hexo2.安装Hexo1. 安…

Maven 插件使用

1.spring-boot-maven-plugin 我们直接使用 maven package &#xff08;maven自带的package打包功能&#xff09;&#xff0c;打包Jar包的时候&#xff0c;不会将该项目所依赖的Jar包一起打进去&#xff0c;在使用java -jar命令启动项目时会报错&#xff0c;项目无法正常启动。…

开源相机管理库Aravis例程学习(七)——chunk-parser

开源相机管理库Aravis例程学习&#xff08;七&#xff09;——chunk-parser 简介例程代码函数说明arv_camera_create_chunk_parserarv_camera_set_chunksarv_chunk_parser_get_integer_value 简介 本文针对官方例程中的&#xff1a;05-chunk-parser做简单的讲解。并介绍其中调…

kali linux更新卡在libc6:amd64 (2.37-15)

适配于linux的windows子系统&#xff0c;wsl2&#xff0c;安装kali linux&#xff0c;运行 sudo apt update 卡在&#xff1a;Setting up libc6:amd64 (2.37-15) … 关机重启、重新修复执行也不行 解决办法&#xff1a;kill当前apt进程或者关机重启kali-linux&#xff0c;然…