【Unity3D】中的空引用 Null Reference Exception

本文详细解析了在Unity3D开发中常见的NullReferenceException异常,探讨了其发生的原因,包括组件未实例化或地址指针未正确设置的情况,并提供了检查与调整代码执行顺序的解决方案。

Null Reference Exception : Object reference not set to an instance of an object.

异常:空引用,对象的引用未设置到对象的实例。

出现该异常的位置:

可能是在调用组件时该组件还未实例化或未存储地址指针,需要查看是否将组件位置拽入代码公布的字段;还有注意Unity3D的生命周期,调整代码的执行顺序。

 

 

 

(若有错误和不足之处,还望指正,谢谢!)

 
 

转载于:https://www.cnblogs.com/417LDS/p/5973193.html

FATAL EXCEPTION: main Process: com.zdtx.tnt.mi, PID: 9709 java.lang.VerifyError: Verifier rejected class com.unity3d.player.UnityPlayer: boolean com.unity3d.player.UnityPlayer.getHaveAndroidWindowSupport() failed to verify: boolean com.unity3d.player.UnityPlayer.getHaveAndroidWindowSupport(): [0x4] 'this' argument 'Uninitialized Reference: java.lang.RuntimeException Allocation PC: 0' not instance of 'Reference: java.lang.Runtime' (declaration of 'com.unity3d.player.UnityPlayer' appears in /data/app/~~nciAtN-jqGlmaw0I5nNXcQ==/com.zdtx.tnt.mi-PtpwsVw-n-BAJTiglYTUAQ==/base.apk!classes6.dex) at com.unity3d.player.UnityPlayerActivity.onCreate(Unknown Source:28) at com.game.common.UnityMainActivity.onCreate(UnityMainActivity.java:30) at android.app.Activity.performCreate(Activity.java:8411) at android.app.Activity.performCreate(Activity.java:8390) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1343) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:4285) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:4517) at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:111) at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:149) at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:103) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2692) at android.os.Handler.dispatchMessage(Handler.java:109) at android.os.Looper.loopOnce(Looper.java:206) at android.os.Looper.loop(Looper.java:296) at android.app.ActivityThread.main(ActivityThread.java:9011) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:569) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:976)
最新发布
06-19
### UnityPlayer在Android环境下出现VerifyError的可能原因与解决方案 UnityPlayer在Android环境下出现`java.lang.VerifyError`错误,通常是由于以下原因之一导致的: 1. **字节码损坏**:UnityPlayer的类文件可能因磁盘问题或网络传输错误而损坏[^2]。 2. **版本不兼容**:UnityPlayer的编译环境与运行时的JVM版本不一致。例如,使用较新版本的Unity引擎生成的APK可能无法在旧版本的Android设备上正确运行[^2]。 3. **类库冲突**:如果项目中包含了多个版本的同一类库(如支持库或广告SDK),可能会导致加载的类字节码与预期不符[^2]。 4. **动态代理或AOP问题**:某些插件或工具可能对UnityPlayer的类进行了修改,但生成的字节码不符合JVM规范[^2]。 5. **字节码操作错误**:如果项目中使用了字节码操作库(如ASM或Javassist),并且这些库对UnityPlayer的类进行了错误的修改,也可能引发`VerifyError`[^2]。 针对`getHaveAndroidWindowSupport`方法的具体问题,以下是一些可能的解决方案: #### 1. 检查Unity版本与目标设备的兼容性 确保使用的Unity版本与目标Android设备的API级别兼容。如果目标设备的Android版本较低,可以尝试将Unity项目的最低API级别设置为设备支持的版本。可以通过以下步骤调整: - 在Unity编辑器中,进入`File > Build Settings > Player Settings`。 - 设置`Minimum API Level`为设备支持的最低版本。 #### 2. 清理和重新构建项目 有时,缓存中的旧字节码可能导致问题。建议执行以下操作: - 删除`/Library/`目录下的所有文件。 - 在Unity中重新构建项目。 - 确保Gradle配置正确,并清理Gradle缓存。 #### 3. 检查第三方插件冲突 如果项目中使用了第三方插件,特别是涉及AOP或字节码操作的插件,可能会导致`VerifyError`。可以尝试以下方法: - 禁用所有插件并逐步启用以定位问题插件。 - 如果插件提供了不同版本,尝试使用与Unity版本兼容的版本。 #### 4. 修改ProGuard/R8配置 如果启用了代码混淆,可能会导致`VerifyError`。可以在`proguard-project.txt`或`proguard-rules.pro`文件中添加以下规则以保留UnityPlayer相关类: ```proguard -keep class com.unity3d.player.UnityPlayer { *; } -keepclassmembers class com.unity3d.player.UnityPlayer { public <methods>; } ``` #### 5. 检查`getHaveAndroidWindowSupport`方法的实现 如果`getHaveAndroidWindowSupport`方法是由自定义代码或插件提供的,确保其字节码符合JVM规范。可以通过反编译工具(如JD-GUI)检查该方法的实现是否存在问题。 ### 示例代码 以下是一个简单的示例,用于验证UnityPlayer的窗口支持功能是否正常: ```java public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); try { Class<?> unityPlayerClass = Class.forName("com.unity3d.player.UnityPlayer"); Method getHaveAndroidWindowSupport = unityPlayerClass.getMethod("getHaveAndroidWindowSupport"); Boolean result = (Boolean) getHaveAndroidWindowSupport.invoke(null); Log.d("MainActivity", "Have Android Window Support: " + result); } catch (Exception e) { Log.e("MainActivity", "Error accessing UnityPlayer method", e); } } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值