将Unity作为Android库使用时如何调用其C#函数切换360°全景天空盒
问题修复方案
核心问题排查与修复步骤
- 修正UnitySendMessage调用参数
UnityPlayer.UnitySendMessage的第一个参数要求是Unity场景中挂载了SkyboxScript脚本的游戏对象名称,不是脚本类名。比如你将脚本挂载在名为SkyboxController的空对象上,调用代码需要改为:UnityPlayer.UnitySendMessage("SkyboxController", "initiateBackground", "skybox1"); - 调整消息发送时机
你在UnityPlayerActivity的onCreate中直接发送消息时,Unity引擎尚未完成场景加载、游戏对象还未初始化完成,此时发送的消息会直接丢失。推荐两种更稳定的实现方案:方案1:延迟发送消息(修改Java侧代码)
给消息发送加200~500ms的延迟,等待Unity场景加载完成:if (ss.equals("skybox1")) { mUnityPlayer.postDelayed(new Runnable() { @Override public void run() { UnityPlayer.UnitySendMessage("SkyboxController", "initiateBackground", "skybox1"); } }, 300); } else { Toast.makeText(this, "no display", Toast.LENGTH_SHORT).show(); }方案2:Unity侧直接读取Intent参数(更稳定,无需跨端发消息)
直接在C#脚本中读取Android Activity的Intent参数,不需要调用UnitySendMessage,成功率更高:
修改后的C#代码如下:using System.Collections; using System.Collections.Generic; using UnityEngine; public class SkyboxScript : MonoBehaviour { public Material skyOne; public Material skytwo; void Start() { // 直接读取Android端传递的Intent参数 AndroidJavaClass unityPlayerClass = new AndroidJavaClass("com.unity3d.player.UnityPlayer"); AndroidJavaObject currentActivity = unityPlayerClass.GetStatic<AndroidJavaObject>("currentActivity"); AndroidJavaObject intent = currentActivity.Call<AndroidJavaObject>("getIntent"); string skyboxTag = intent.Call<string>("getStringExtra", "data"); initiateBackground(skyboxTag); } public void initiateBackground(string skybox) { if(skybox == "skybox1") { RenderSettings.skybox = skytwo; // 刷新全局光照,避免天空盒切换后不显示 DynamicGI.UpdateEnvironment(); } } } - 检查资源配置
确认在Unity编辑器的Inspector面板中,已经给SkyboxScript组件的skytwo字段赋值了对应的360全景图材质,避免空引用导致切换无效。
内容的提问来源于stack exchange,提问作者Endale Tilahun
相关产品推荐
相关产品推荐

