首页 > 解决方案 > 我无法加载预制件并将其转换为类型

问题描述

我在运行时生成一组预制件。这些预制件是一个简单的文本 UI 对象,带有动画师来创建出现在游戏对象上方的“浮动”数字。

当我初始化预制件时,我可以让它们从 Resources 文件夹中正确加载,但是一旦我把它们放进去,我就无法将它们从泛型更改UnityEngine.Object为我的FloatingText类型。

我尝试使用一系列方法来投射对象,但似乎没有任何效果。我尝试使用GetComponent,但要么通过调用错误抛出异常,要么返回空值。

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

public class FloatingTextController : MonoBehaviour 
{
    private static FloatingText popupText;
    private static GameObject canvas;

    public static void Initialize()
    {
        canvas = GameObject.Find("Canvas");
        UnityEngine.Object temp = Resources.Load("Prefabs/PopupTextParent") as UnityEngine.Object;
        GameObject popupTextGameObject = temp as GameObject;
        if (!popupText) popupText = popupTextGameObject.GetComponent<FloatingText>();
    }

    public static void CreateFloatingText(string text, Transform location)
    {
        FloatingText instance = Instantiate(popupText);
        Vector2 screenPosition = Camera.main.WorldToScreenPoint(location.position);
        instance.transform.SetParent(canvas.transform, false);
        instance.transform.position = screenPosition;
        instance.SetText(text);
    }
}

上面的代码是我的浮动文本控制器对象。错误到达时发生popupText = popupTextGameObject.GetComponent<FloatingText>();

我错过了什么?

标签: c#unity3d

解决方案


这里有很多错误的地方。

  1. 如果控制器类是静态的,为什么要使用 MB。我没有看到任何非静态成员。
  2. 您正在从资源中加载预制文件并尝试获取组件。你不能这样做。您需要实例化预制件并获取组件的实例。您不能以任何方式使用预制文件中的组件。使用公共字段来获取预制件的参考,您不需要Resources.Load().
  3. 您正在寻找的是GetComponent<T>(). 您不能简单地将 Game Object 转换为 Monobehaviour 类型。
  4. 然后在你的第二个函数中CreateFloatingText你想要实例化一个组件对象而不是一个游戏对象。又不能那样做。你用AddComponent.

总而言之,尚不清楚您要做什么,尤其是为什么要以这种方式做。谷歌如何使用预制件并实例化它们以正确地做到这一点。


推荐阅读