C# 使用对象';s网格作为粒子系统的发射器

C# 使用对象';s网格作为粒子系统的发射器,c#,unity3d,crash,C#,Unity3d,Crash,我有一些基本火焰效果的场景。其最大粒子数为20,并且屏幕上一次活动的实例不超过4-5个。我甚至检查了探查器,但内存使用量最大约为150MB 考虑到这些因素,所有这些都可以在编辑器中正常运行,但在构建中,一旦粒子变得可见,游戏每次都会崩溃。我在虚拟Nexus平板电脑上测试了这个。我使用的是Unity 2017.1.1 内置游戏也会在PC上崩溃(使用同一台PC为PC制作了最终版本)。但奇怪的是,我显示的代码运行良好。它只是从MeshFilter获取网格,将其作为发射器添加到粒子系统中。由于这发生在唤

我有一些基本火焰效果的场景。其最大粒子数为20,并且屏幕上一次活动的实例不超过4-5个。我甚至检查了探查器,但内存使用量最大约为150MB

考虑到这些因素,所有这些都可以在编辑器中正常运行,但在构建中,一旦粒子变得可见,游戏每次都会崩溃。我在虚拟Nexus平板电脑上测试了这个。我使用的是Unity 2017.1.1

内置游戏也会在PC上崩溃(使用同一台PC为PC制作了最终版本)。但奇怪的是,我显示的代码运行良好。它只是从
MeshFilter
获取网格,将其作为发射器添加到粒子系统中。由于这发生在
唤醒
中,并且级别实际开始运行,因此代码不会给出错误。仅当网格实际用于粒子系统时,才会出现此问题

我能够将问题追溯到以下几行:

var mf = 
transform.parent.gameObject.GetComponentFromParentRecursive<MeshFilter>();

if (mf != null && mf.mesh != null)
{
    var sh2 = system.shape;
    sh2.mesh = mf.mesh;
    return;
}


public static class GetComponentRecursive
{
    /// <summary>
    /// Returns the first Component (T) found on the parent or its children
    /// = the gameobjects on the same level as this is called on.
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="g"></param>
    /// <returns></returns>
    public static T GetComponentFromParentRecursive<T>(this GameObject g)
        where T : Component
    {
        if(g.transform.parent.GetComponent<T>() != null)
        {
            return g.transform.parent.GetComponent<T>();
        }
        else
        {
            foreach (Transform c in g.transform.parent.transform)
            {
                if(c.GetComponent<T>() != null)
                {
                    return c.GetComponent<T>();
                }
            }
        }
        return null;
    }
}
var mf=
transform.parent.gameObject.GetComponentFromParentRecursive();
if(mf!=null&&mf.mesh!=null)
{
var sh2=system.shape;
sh2.mesh=mf.mesh;
返回;
}
公共静态类GetComponentRecursive
{
/// 
///返回在父级或其子级上找到的第一个组件(T)
///=与此调用处于同一级别的游戏对象。
/// 
/// 
/// 
/// 
公共静态T GetComponentFromParentRecursive(此游戏对象g)
其中T:组件
{
如果(g.transform.parent.GetComponent()!=null)
{
返回g.transform.parent.GetComponent();
}
其他的
{
foreach(g.Transform.parent.Transform中的转换c)
{
如果(c.GetComponent()!=null)
{
返回c.GetComponent();
}
}
}
返回null;
}
}
请记住,
GetComponentFromParentRecursive
有效,可以用于精灵,不会造成任何伤害。当我注释掉前几行时,它没有崩溃(只是失去了功能)

你知道为什么这会导致崩溃吗?只有内置的游戏

编辑:

当禁用
Unity
过滤器时,我想我可能得到了一些东西。它有一个
NullPointerException
和许多
W/ResourceType:获取资源编号的名称时没有包标识符

09-08 11:11:49.976 922-922/?W/ResourceType:获取资源号0x0000001b的名称时没有包标识符 09-08 11:11:49.995 13409-13409/? D/ActivityThread:SVC创建服务:CreateServiceData{token=android.os。BinderProxy@42549900className=com.google.android.gms.udc.service.UdcApiService packageName=com.google.android.gms intent=null} 09-08 11:11:49.998 922-927/? D/dalvikvm:GC_并发释放2918K(32059),32%释放6993K/10216K,暂停8ms+6ms,总计74ms 09-08 11:11:50.006 13409-13409/? D/ActivityThread:SVC-CREATE_处理的服务:0/CreateServiceData{token=android.os。BinderProxy@42549900className=com.google.android.gms.udc.service.UdcApiService packageName=com.google.android.gms intent=null} 09-08 11:11:50.010 13409-13409/? D/ActivityThread:SVC-BIND_处理的服务:0/BindServiceData{token=android.os。BinderProxy@42549900intent=intent{act=com.google.android.gms.udc.service.START pkg=com.google.android.gms}} 09-08 11:11:50.022 186-186/? W/MALI:MTK_AUX_ismtk格式:168:int MTK_AUX_ismtk格式(ANativeWindowBuffer_t*):格式=1 09-08 11:11:50.024 819-819/? V/WallperService:com.android.phasebeam.phasebeamWallper中的可见性更改$RenderScriptEngine@41e525e0: 1 09-08 11:11:50.025 819-819/? V/WallperService:onVisibilityChanged(true):com.android.phasebeam.phasebeamWallper$RenderScriptEngine@41e525e0 09-08 11:11:50.025 819-819/? V/WallperService:抵消com.android.phasebeam.phasebeamWallper中的更改$RenderScriptEngine@41e525e0: 0.5,0.5 09-08 11:11:50.031 922-922/? D/AbsListView:onWindowFocusChanged:hasWindowFocus=true,this=android.widget.ListView{4206ddb8 V.ED.VC…….ID 0176-576176 35; 7f0e0046 app:ID/digital_appwidget_ListView} 09-08 11:11:50.032 710-710/? D/PhoneStatusBar:SetSystemMivibility vis=c0000700掩码=ffffffff oldVal=700新值=c0000700差异=c0000000 09-08 11:11:50.034 710-710/? D/BarTransitions.PhoneStatusBarView:MODE_不透明->MODE_半透明动画=假 09-08 11:11:50.036 186-307/? I/BufferQueue:com.android.phasebeam.PhaseBeamWallpaper[queue]fps:0.05,dur:39249.01,max:39171.83,min:77.18 09-08 11:11:50.037 186-186/? I/BufferQueue:com.android.phasebeam.PhaseBeamWallpaper[release]fps:0.05,dur:39239.19,max:39160.33,min:78.86 09-08 11:11:50.039 17428-17440/? V/SurfaceView:this=vjd{42785900 V.E....ID 0,0-1280720}已调整大小:w=1280 h=720,cur w=-1 h=-1 09-08 11:11:50.040 710-710/? D/BarTransitions.PhoneStatusBarView:applyModeBackground oldMode=MODE\u不透明newMode=MODE\u半透明动画=false 09-08 11:11:50.042 710-710/? D/BarTransitions.NavigationBarView:MODE_不透明->MODE_半透明动画=真 09-08 11:11:50.042 710-710/? D/BarTransitions.NavigationBarView:applyModeBackground旧模式=模式\不透明新模式=模式\半透明动画=真 09-08 11:11:50.042 13409-13559/? D/SQLiteDatabase:beginTransaction() 09-08 11:11:50.047 922-922/? V/InputMethodManager:onWindowFocus:com.android.launcher3.AppsCustomizeTabHost{42312918 VFE…..F…..I.0,0-1280800#7f10002b app:id/apps#customize#pane}softInputMode=288 first=true flags=#d910100 09-08 11:11:50.048 922-922/? V/InputMethodManager:START-INPUT:com.android.launcher3.AppsCustomizeTabHost{42312918 VFE...F..I.0,0-1280800#7f10002b app:id/apps_customize_pane}ic=null tba=android.view.inputmethod。EditorInfo@4234f6e8controlFlags=#105 09-08 11:11:50.049 641-908/? V/InputMethodManagerService:windowGainedFocus:android.os。BinderProxy@42823bf0controlFlags=#105
if (mf.mesh.isReadable)
{
    Mesh myAwesomeNewMeshForNoApparentReason2 = new Mesh();
    myAwesomeNewMeshForNoApparentReason2.Clear();
    myAwesomeNewMeshForNoApparentReason2.name = mf.gameObject.name + "_NewMesh";
    myAwesomeNewMeshForNoApparentReason2.vertices = mf.sharedMesh.vertices;
    myAwesomeNewMeshForNoApparentReason2.triangles = mf.sharedMesh.triangles;
    myAwesomeNewMeshForNoApparentReason2.uv = mf.sharedMesh.uv;
    var sh2 = system.shape;
    sh2.mesh = myAwesomeNewMeshForNoApparentReason2;
    return;
}