我无法加载预制件并按其类型进行铸造

时间:2019-09-04 10:53:28

标签: c# unity3d

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

初始化预制件时,可以从Resources文件夹中正确加载预制件,但是一旦将其插入,就无法将它们从通用UnityEngine.Object更改为FloatingText类型。

我尝试使用一系列方法强制转换对象,但似乎无济于事。我尝试使用GetComponent,但要么因调用错误引发Exception要么返回空值。

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);
    }
}

上面的代码是我的Floating Text Controller对象。错误到达popupText = popupTextGameObject.GetComponent<FloatingText>();

时发生

我想念什么?

1 个答案:

答案 0 :(得分:2)

这里有很多错误。

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

总而言之,目前尚不清楚您要做什么,尤其是为什么要以这种方式进行。 Google如何使用预制件并实例化它们以正确执行。