Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Can';t添加组件';动画';totestObj,因为这样的组件已经添加到游戏对象中_C#_Unity3d - Fatal编程技术网

C# Can';t添加组件';动画';totestObj,因为这样的组件已经添加到游戏对象中

C# Can';t添加组件';动画';totestObj,因为这样的组件已经添加到游戏对象中,c#,unity3d,C#,Unity3d,我想在脚本的Update()函数中将组件“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 v

我想在脚本的Update()函数中将组件“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>();
    }
}
如果动画组件已经添加到游戏对象中,我如何跳过处理

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

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

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>();
        }
    }
}
使用UnityEngine;
Net系统;
使用System.Net.Sockets;
使用系统文本;
使用System.IO;
使用制度;
公共类单位歧视:单一行为
{
公共动画;
//开始被称为
void Start()
{
}
//每帧调用一次更新
无效更新()
{
GameObject obj=GameObject.Find(“testObj”);
动画=获取组件(obj);
如果(动画==null)
{
obj.AddComponent();
}
}
}

我想说,异常消息是不言自明的


当然,您可以简单地使用

if(!obj.GetComponent<Animation>())
    obj.AddComponent<Animation>();
但这也是相当低效的。您只需在收到UDP命令时执行一次


我还是不明白你为什么不能

  • 默认情况下,在启动应用程序之前,通过Inspector add组件将
    动画添加到
    游戏对象中
  • 创建一个已经附加了
    动画的预制(通过Inspector Add组件)
  • Start
    中仅使用
    Find
    一次,并将对它的引用存储在字段中

  • 一般来说,已经通过Inspector在字段中引用了
    obj


您不了解该信息的哪些方面?你为什么每一帧都这么做?将代码移动到
开始
方法。。。或者,如果您需要
更新
,请使用
bool
只更新一次
Find
非常慢,不应该使用太多*在
Update
中,您可以使用
GetComponent
再次检查组件是否已添加。。它非常慢,不应在
更新中使用。。。您在这里的具体用例是什么?我想为使用UDP通信在外部应用程序中输入的对象创建动画。标志将用于检查这是否是第一个循环,并且在Update()函数中只执行一次“Find”。如果在外部应用程序中更改了对象名称,请再次运行“查找”。但重命名后,它是新对象还是仅重命名它?我的意思是,为什么对象的引用更改只能得到一个新名称?为什么要再次添加组件?事实上,你为什么不创建一个对象/一个预置,它从一开始就已经有了
动画师
?如果我自己使用这个,我可以自己修改脚本。但是我想把这段代码分发给很多看不懂代码的人。当这种情况发生时,我希望对象名称会根据使用它的人而改变。我只想添加一个组件。对不起,伙计,可能是我,但我仍然不明白它的全部目的是什么?你不能从一开始就在字段中引用相应的对象吗?或者,在重命名对象的代码中,您似乎已经有了相应的引用,因此是否要在其中添加
动画制作程序
?目前我只看到您使用带有硬编码名称的
Find
。。如何/何时/何地更改?我假设一个代码通过UDP每秒数十次以字符串数据形式接收智能手机倾斜信息。它包含对象名。所以,当我收到UDP时,它不可能只有一次。我不知道有预设。当我在Unity中播放时,动画被临时添加到组件中。然而,当Unity停止时,组件消失了,我陷入了麻烦。
if(!obj.GetComponent<Animation>())
    obj.AddComponent<Animation>();
    var obj = GameObject.Find("testObj");
    obj.AddComponent<Animation>();
    isInitialized = true;
}