问题描述

开发环境是Unity 2019.4版本
粒子特效在Editor下显示没有问题,打包后大部分的粒子特效都没问题,但少量粒子特效里的Mesh没有显示。

同时出问题的粒子特效会报下面的Warning

No mesh data available for mesh Plane002 on particle system dg2 (4). Make sure Read/Write Enabled is set in the importer to work on the particle system renderer

问题分析

通过打开Mesh的Read/Write Enabled,问题可以解决,但为什么其他的粒子特效就OK呢?项目中很多粒子特效用到的Mesh也没有打开Read/Write Enabled

Editor和打包后的环境最大的不同是,打包后是加载的AB包来实例化粒子特效的,通过直接在Editor里加载打包后的AB包测试,确定就是AB包的问题。
通过分析出问题和没出问题的粒子特效所在的AB包,发现没出问题的粒子特效,其Mesh是和粒子系统是打在同一个AB包里的,而出问题的那些粒子特效,其Mesh是独立打成AB包的,问题可能就是出在这里。

在Unity的论坛里找到答案,原因是Unity在Build的时候会自动把粒子系统关联的Mesh打开其Read/Write Enabled设置,但如果粒子系统和其关联的Mesh被分开打AB包了,Unity则无法获取这个依赖,从而无法自动打开Read/Write Enabled,所以需要手动设置。

解决方案

看具体项目,解决方案有很多,可以确保粒子系统和其Mesh都打在同一个AB包中,也可以手动把出问题Mesh的Read/Write Enabled打开。
由于我现在的项目,AB包是通过依赖分析自动生成的,所以无法保证粒子系统和其Mesh都打在同一个AB包中。还好项目的资源比较规范,粒子系统用到的Mesh都放在同一个文件夹下,只要写一个AssetPostprocessor就可以确保所有Mesh的Read/Write Enabled都打开,简单的例子如下:

class ParticleSystemModelPostprocessor : AssetPostprocessor{    private void OnPreprocessModel()    {        // 只处理粒子特效的Mesh        if (assetPath.StartWith("Assets/Res/PS/Model")) {            var importer = assetImporter as ModelImporter;            importer.isReadable = true;        }    }}

本文来自博客园,作者:agoo做独立游戏,转载请注明原文链接:https://www.cnblogs.com/agoo-indie/p/16768218.html