为啥 AddComponent 会添加太多脚本? [关闭]

Posted

技术标签:

【中文标题】为啥 AddComponent 会添加太多脚本? [关闭]【英文标题】:Why does AddComponent add too much scripts? [closed]为什么 AddComponent 会添加太多脚本? [关闭] 【发布时间】:2022-01-20 06:11:29 【问题描述】:

我对 Unity 很陌生,我设置了这个脚本来在我的游戏中生成单位,但由于某种原因,每当生成单位时,它会继续添加如此多的移动脚本,以至于它严重滞后于 unity,我做了什么错了吗?

代码:

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

public class Spawn : MonoBehaviour


    public Rigidbody DemoUnit;
    public Transform SpawnArea;

    void Update()
    
        if (Input.GetKeyDown(KeyCode.O))
            Instantiate (DemoUnit, SpawnArea.position, SpawnArea.rotation);
            DemoUnit.gameObject.AddComponent<Movement>();

    

【问题讨论】:

如果您有很多 Spawn 类的实例,将为每个实例执行代码。在场景检查器中检查 Spawn 实例,以便只有一个实例。 提示:您的DemoUnit.gameObject.AddComponent&lt;Movement&gt;(); 声明不是if 声明的一部分。您的缩进使它看起来像您认为的那样......但是如果您想将两个语句作为if 语句的主体,则需要使用大括号。我强烈建议对 all if 语句的主体使用大括号以避免此类问题。目前,AddComponent 将在 每次 Update 执行时被调用。 【参考方案1】:

您忘记用花括号括住 if 语句的内容。 这应该可以解决问题:

void Update()

    if (Input.GetKeyDown(KeyCode.O))
    
        Instantiate (DemoUnit, SpawnArea.position, SpawnArea.rotation);
        DemoUnit.gameObject.AddComponent<Movement>();
    

没有花括号,您的代码等效于以下代码,并且每帧都添加了组件:

void Update()

    if (Input.GetKeyDown(KeyCode.O))
        Instantiate (DemoUnit, SpawnArea.position, SpawnArea.rotation);

    DemoUnit.gameObject.AddComponent<Movement>();

此外,我相信您想将组件添加到新创建的实例而不是预制件中:

void Update()

    if (Input.GetKeyDown(KeyCode.O))
    
        var instance = Instantiate (DemoUnit, SpawnArea.position, SpawnArea.rotation);
        instance.gameObject.AddComponent<Movement>();
    

【讨论】:

以上是关于为啥 AddComponent 会添加太多脚本? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

Unity 使用SteamVR 实现物体的抓取

通过脚本(C#) Unity5添加组件脚本

不包含“AddComponent”的定义,并且 Unity 中没有可访问的扩展方法“AddComponent”错误

油猴 为啥显示没有在运行的脚本

(Unity) 如何使用泛型类型的 AddComponent

即使状态没有改变,为啥 setState 会导致太多的重新渲染错误