如何在已发布的Unity应用中通过脚本获取云项目名称/ID
在已发布Unity应用中获取云项目名称/ID
哎,你编辑器里那套反射代码确实只能在编辑器环境生效——因为UnityEditor命名空间下的所有类,在Unity发布应用的时候都会被完全剔除,运行时根本找不到这些类型。不过别慌,有几个靠谱的方案能帮你在已发布应用里拿到项目名称和ID:
方案1:构建时自动写入资源文件(最推荐)
这个思路是把项目信息在编辑器阶段就写入一个运行时能读取的资源,发布后直接读就行,稳定又安全。
具体步骤:
- 先创建一个存储项目信息的ScriptableObject:
using UnityEngine; [CreateAssetMenu(fileName = "ProjectCloudInfo", menuName = "Custom/Project Cloud Info")] public class ProjectCloudInfo : ScriptableObject { public string projectName; public string projectID; }
- 写个编辑器脚本,在构建前自动填充这个资源的内容(用你熟悉的反射逻辑):
using UnityEditor; using UnityEditor.Connect; using System.Reflection; using UnityEngine; public class ProjectInfoAutoSetter : MonoBehaviour { // 手动触发更新的菜单选项 [MenuItem("Tools/Update Cloud Project Info")] public static void UpdateProjectInfo() { // 加载或创建资源(路径可以自己调整) var cloudInfo = AssetDatabase.LoadAssetAtPath<ProjectCloudInfo>("Assets/Resources/ProjectCloudInfo.asset"); if (cloudInfo == null) { cloudInfo = CreateInstance<ProjectCloudInfo>(); AssetDatabase.CreateAsset(cloudInfo, "Assets/Resources/ProjectCloudInfo.asset"); } // 用反射获取云项目信息(和你之前的逻辑一致) var unityConnectType = typeof(UnityConnect); var instanceProp = unityConnectType.GetProperty("instance", BindingFlags.Public | BindingFlags.Static); var connectInstance = instanceProp.GetValue(null); var getProjectNameMethod = unityConnectType.GetMethod("GetProjectName"); cloudInfo.projectName = getProjectNameMethod.Invoke(connectInstance, null) as string; var getProjectIDMethod = unityConnectType.GetMethod("GetProjectID"); cloudInfo.projectID = getProjectIDMethod.Invoke(connectInstance, null) as string; EditorUtility.SetDirty(cloudInfo); AssetDatabase.SaveAssets(); } // 绑定到构建流程,自动触发更新 [InitializeOnLoadMethod] private static void HookBuildProcess() { BuildPlayerWindow.RegisterBuildPlayerHandler((buildOptions) => { UpdateProjectInfo(); // 继续执行默认构建流程 BuildPlayerWindow.DefaultBuildMethods.BuildPlayer(buildOptions); }); } }
- 运行时读取这个资源:
using UnityEngine; public class CloudInfoLoader : MonoBehaviour { private void Start() { var cloudInfo = Resources.Load<ProjectCloudInfo>("ProjectCloudInfo"); if (cloudInfo != null) { Debug.Log($"当前云项目名称:{cloudInfo.projectName}"); Debug.Log($"当前云项目ID:{cloudInfo.projectID}"); } } }
方案2:借助Unity云服务SDK(限特定场景)
如果你的应用已经在用Unity的某些云服务(比如Authentication、Cloud Save),部分SDK会提供运行时获取项目ID的接口。比如Unity Authentication的AuthenticationService.Instance.ProjectId——不过这个只能拿到ID,拿不到项目名称,而且必须导入对应的SDK包、启用云服务才行。
方案3:手动配置(适合小型稳定项目)
如果你的项目不会频繁切换云项目,最简单的方式就是手动把项目名称和ID写死在代码里,或者存在PlayerPrefs的初始值里,也可以在PlayerSettings的自定义字段里配置。这种方式虽然麻烦点,但胜在简单,不需要额外的编辑器逻辑。
重要提醒:别尝试在发布后的应用里反射Unity的内部运行时类,这类类没有公开API的稳定性保证,Unity版本一更新可能就用不了,甚至可能违反服务条款。
内容的提问来源于stack exchange,提问作者Tengku Fathullah
相关产品推荐
相关产品推荐

