无法将组件“动画”添加到testObj,因为此类组件已添加到游戏对象中

时间:2019-11-14 05:09:27

标签: c# unity3d

我想将脚本的Update()函数中的AddoCompornent“ Animation”添加到testObj。

我编写并执行了以下代码,但出现错误。

using UnityEngine;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.IO;
using System;

public class unityRecieve : MonoBehaviour
{
    // Start is called 
    void Start()
    {
    }

    // Update is called once per frame
    void Update()
    {
        GameObject obj = GameObject.Find("testObj");
        obj.AddComponent<Animation>();
    }
}

错误详细信息如下。

Can't add component 'Animation' totestObj because such a component is already added to the game object!

如果已经将动画组件添加到游戏对象中,如何跳过该处理?

我需要动态地重命名“ testObj”,所以我想在Update()函数中而不是在Startup()函数中处理它。

我想在使用以下if语句检查Animation组件是否已经添加到testObj之后添加组件。但是,如果使用以下方法,则会发生错误。我不知道正确的方法。

using UnityEngine;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.IO;
using System;

public class unityRecieve : MonoBehaviour
{
    public Animation animation;

    // Start is called 
    void Start()
    {
    }

    // Update is called once per frame
    void Update()
    {
        GameObject obj = GameObject.Find("testObj");
        animation = GetComponent<Animation>(obj);
        if(animation == null)
        {
            obj.AddComponent<Animation>();
        }
    }
}

1 个答案:

答案 0 :(得分:1)

我会说异常消息是不言自明的。


您当然可以简单地使用

if(!obj.GetComponent<Animation>())
    obj.AddComponent<Animation>();

但是,正如评论中提到的,FindGetComponent都是非常昂贵的呼叫,并且应该从不使用{{1} }。通常,您应尽可能避免使用它们。


例如,另一种可能是

无效Update()     {         if(isInitialized)返回;

Update

但这也效率很低。您应该只一次并且仅在收到UDP命令时执行此操作。


我仍然不明白为什么你不能

  • 默认情况下,通过Inspector 添加组件 var obj = GameObject.Find("testObj"); obj.AddComponent<Animation>(); isInitialized = true; } 添加到Animation甚至在启动应用程序之前
  • 创建一个已经附加了GameObject的预制件(通过检查器添加组件
  • 仅在Animation一次使用Find并将其引用存储在字段中

  • 通常已经通过检查器在字段中引用了Start