我想将脚本的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>();
}
}
}
答案 0 :(得分:1)
我会说异常消息是不言自明的。
您当然可以简单地使用
if(!obj.GetComponent<Animation>())
obj.AddComponent<Animation>();
但是,正如评论中提到的,Find
和GetComponent
都是非常昂贵的呼叫,并且应该从不使用{{1} }。通常,您应尽可能避免使用它们。
例如,另一种可能是
无效Update() { if(isInitialized)返回;
Update
但这也效率很低。您应该只一次并且仅在收到UDP命令时执行此操作。
我仍然不明白为什么你不能
var obj = GameObject.Find("testObj");
obj.AddComponent<Animation>();
isInitialized = true;
}
添加到Animation
甚至在启动应用程序之前GameObject
的预制件(通过检查器添加组件)仅在Animation
中一次使用Find
并将其引用存储在字段中
通常已经通过检查器在字段中引用了Start