Unity动态生成的ArcGISMapViewComponent无法被其他类找到问题求解
Unity 跨类访问动态添加的ArcGISMapViewComponent空引用问题解决方案
问题根本原因是Unity脚本执行顺序不固定,你在Start()中添加组件的逻辑,执行时机可能晚于ReadStringInput()的调用时机,导致访问时组件还未被实例化。你可以根据业务场景选择以下任意方案解决:
方案1:调整脚本执行顺序(最简单,适配无特殊时序要求的场景)
- 打开Unity编辑器菜单
Edit > Project Settings > Script Execution Order - 将负责添加
ArcGISMapViewComponent组件的脚本拖入时序列表,设置它的执行顺序值小于调用ReadStringInput()方法的脚本的顺序值,保证添加组件的逻辑先执行
方案2:将组件添加逻辑移到Awake()(成本最低,适配大部分场景)
Unity中Awake()方法的执行时机早于所有脚本的Start()方法,只要挂载脚本的游戏对象启动时处于激活状态,就能保证组件优先被创建:
// 在你原来写Start()的脚本里修改 void Awake() { // 把原来写在Start里的组件添加逻辑移到此处 var arcGISMapViewComponent = gameObject.AddComponent<ArcGISMapViewComponent>(); }
方案3:全局存储组件实例+访问前非空校验(适配ReadStringInput可能被任意时机调用的场景)
先在添加组件的脚本中做全局存储:
// 挂载到添加ArcGISMapViewComponent的游戏对象上的脚本 public class MapViewHolder : MonoBehaviour { public static ArcGISMapViewComponent Instance { get; private set; } void Awake() { Instance = gameObject.AddComponent<ArcGISMapViewComponent>(); } }
在调用ReadStringInput的类中加等待逻辑,组件未生成时延迟执行:
using System; using UnityEngine; // 调用ReadStringInput的类 public class YourInputHandler : MonoBehaviour { public void ReadStringInput(string s) { if (MapViewHolder.Instance == null) { // 组件未生成时启动协程等待 StartCoroutine(WaitForMapComponent(() => { // 组件生成后执行你的业务逻辑 ProcessInput(s, MapViewHolder.Instance); })); return; } // 组件已生成直接执行逻辑 ProcessInput(s, MapViewHolder.Instance); } private IEnumerator WaitForMapComponent(Action onReady) { // 每帧检查组件是否生成,直到生成后再执行回调 while (MapViewHolder.Instance == null) { yield return null; } onReady?.Invoke(); } private void ProcessInput(string input, ArcGISMapViewComponent mapComponent) { // 在这里写你需要操作mapComponent的业务代码 } }
方案4:访问时主动兜底创建组件(适配不确定组件是否被提前创建的场景)
直接在ReadStringInput里先查找组件,不存在就当场添加,不会出现找不到的情况:
public void ReadStringInput(string s) { // 替换为你要挂载组件的目标游戏对象,也可以用GameObject.Find("对象名")获取 GameObject targetGameObject = 你的目标游戏对象; var mapComponent = targetGameObject.GetComponent<ArcGISMapViewComponent>(); // 组件不存在时当场添加 if (mapComponent == null) { mapComponent = targetGameObject.AddComponent<ArcGISMapViewComponent>(); } // 后续使用mapComponent执行你的业务逻辑 }
内容的提问来源于stack exchange,提问作者Çağatay Konuklar
相关产品推荐
相关产品推荐

