【问题标题】:Unity3D RawImage(UI) InstantiateUnity3D RawImage(UI) 实例化
【发布时间】:2015-10-16 20:36:56
【问题描述】:

当我将预制件实例化为 GameObject 时,没有问题。但是当将预制件实例化为 RawImage 时,会出现 NullReferenceException 问题。 (如果你需要知道 Prefab 是 RawImage)

这是我的代码:

using UnityEngine;
using System.Collections;
using UnityEngine.UI;

public class Insstantia : MonoBehaviour
{
    public GameObject img;

    public void Instan()
    {
        RawImage[] myObject = new RawImage[8];
        RectTransform[] rt = new RectTransform[8];

        for (int i = 0; i < 8; i++)
        {
            myObject[i] = Instantiate(img, new Vector3(800 * i, 0, 0), Quaternion.identity) as RawImage;
            rt[i] = myObject[i].GetComponent<RectTransform>();
            myObject[i].transform.SetParent(gameObject.transform, false);

            rt[i].anchorMin = new Vector2(0.05875f, 0);
            rt[i].anchorMax = new Vector2(0.94375f, 1);
        }
    }
 }

【问题讨论】:

    标签: user-interface unity3d instantiation


    【解决方案1】:

    这是因为您将 GameObject 预制件转换为组件类型 (RawImage),这是可能的,因为 Component 类型继承自 Object 类型。

    所以当你尝试在这一行获取一个组件时:

    rt[i] = myObject[i].GetComponent<RectTransform>();
    

    一个 NullReferenceExceptiion 被抛出,因为“img”游戏对象已被强制转换为一个组件类型的对象,因此 RectTransform 组件不存在。

    尝试将您的公共 GameObject img 字段更改为:

    public RawImage img;
    

    【讨论】:

    • 我怀疑这会解决问题,实例化创建一个游戏对象。 RawImage 是附加到游戏对象的组件。但是,当您将 myObject[] 更改为 GameObject 而不是 RawImage 时,另一种方法将起作用
    • 刚刚测试过,它似乎可以工作,当然,通过将公共字段更改为公共 RawImage img 然后转换为 RawImage,这是 OP 试图做的 :)跨度>
    • 他将需要更改更多的强制转换,因为 RectTransform 没有附加到 RawImage,而是附加到实例化对象
    • 感谢您的快速解答。我不需要资源文件夹。我的数据通过 json 请求来自网络,我正在使用 Vuforia Cloud Reco。对不起我的英语不好
    【解决方案2】:

    您的问题是您正在尝试将GameObject 转换为Component。实例化命令将为您创建一个游戏对象,在这种情况下,它是您的预制件,并附有一个组件。

    要解决此问题,您只需存储 GameObject 而不是组件,如果您需要 RawImage 组件,请以与 RectTransform 相同的方式获取它。

    public GameObject[] myObject = new GameObject[8];
    

    而不是

    public RawImage[] myObject = new RawImage[8];
    

    (别忘了将转换调用从 as RawImage 更改为 as GameObject

    如果您指的是实际图像,而不是组件。您可能想看看 Resources.Load 而不是使用 Instantiate。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-02-16
      • 2014-05-27
      • 1970-01-01
      • 1970-01-01
      • 2017-07-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多