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