qq_44736946 2021-01-29 16:57 采纳率: 0%
浏览 86

Unity 同一个脚本摧毁一个gameobject的时候把其他的也摧毁了?

MissingReferenceException: The object of type 'ParticleSystem' has been destroyed but you are still trying to access it.
Your script should either check if it is null or you should not destroy the object.
UnityEngine.ParticleSystem.Play () (at <b15e40864454407eae445b174d810200>:0)
RubyController.ChangeHealth (System.Int32 amount) (at Assets/Scripts/RubyController.cs:129)
HealthCollectible.OnTriggerEnter2D (UnityEngine.Collider2D other) (at Assets/Scripts/HealthCollectible.cs:17)



吃草莓回血但是吃第二个草莓的时候出错了


几个草莓是同一个prefab, 挂的是同一个脚本

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

public class HealthCollectible : MonoBehaviour
{
    public AudioClip collectedClip;
    
    void OnTriggerEnter2D(Collider2D other)
    {
        RubyController controller = other.GetComponent<RubyController>();

        if (controller != null)
        {
            if (controller.health < controller.maxHealth)
            {
            	controller.ChangeHealth(1);
            	Destroy(gameObject);
            
            	controller.PlaySound(collectedClip);
            }
        }

    }
}




似乎是Destroy的时候把其他的草莓也摧毁了? 怎么办

  • 写回答

1条回答 默认 最新

  • 你知我知皆知 2024-07-24 13:41
    关注

    以下回答参考 皆我百晓生券券喵儿 等免费微信小程序相关内容作答,并由本人整理回复。

    在 Unity 中,如果你尝试在没有正确管理的情况下删除游戏对象(GameObject),可能会导致一系列问题。例如,在你的例子中,你尝试在 OnTriggerEnter2D 方法中直接删除 HealthCollectible 游戏对象,这可能导致其他游戏对象的生命周期被破坏。

    为了解决这个问题,你需要确保在触发器事件处理完成后,所有相关的 GameObject 都已经被销毁或移除。一种方法是在触发器事件后调用 Destroy()RemoveFromParent() 方法来清理这些游戏对象。以下是一个示例:

    void OnTriggerEnter2D(Collider2D other)
    {
        RubyController controller = other.GetComponent<RubyController>();
        
        // Check if controller exists and health is less than max health
        if (controller != null && controller.health < controller.maxHealth)
        {
            controller.ChangeHealth(1);
            
            // Clean up after the event
            Destroy(gameObject); // Or RemoveFromParent()
            controller.PlaySound(collectedClip);
        }
    }
    

    在这个例子中,我们首先检查 controller 是否存在和健康值是否小于最大健康值。然后,我们在 ChangeHealth() 方法后调用了 Destroy(gameObject) 来删除 HealthCollectible 游戏对象。这样可以确保当触发器事件发生时,游戏对象会被正确地清理掉。

    另外,注意将 Destroy(gameObject) 改为 RemoveFromParent() 可以避免一些不必要的性能开销,并且更容易理解。但请注意,使用 RemoveFromParent() 会导致游戏对象从父物体上移除,这意味着它不再属于任何父物体。如果可能的话,建议优先考虑使用 Destroy(),因为它不会影响游戏对象的生命周期。

    评论

报告相同问题?

悬赏问题

  • ¥15 angular项目错误
  • ¥20 需要帮我远程操控一下,运行一下我的那个代码,我觉得我无能为力了
  • ¥20 有偿:在ubuntu上安装arduino以及其常用库文件。
  • ¥15 请问用arcgis处理一些数据和图形,通常里面有一个根据点划泰森多边形的命令,直接划的弊端是只能执行一个完整的边界,但是我们有时候会用到需要在有很多边界内利用点来执行划泰森多边形的命令
  • ¥30 在wave2foam中执行setWaveField时遇到了如下的浮点异常问题,请问该如何解决呢?
  • ¥750 关于一道数论方面的问题,求解答!(关键词-数学方法)
  • ¥200 csgo2的viewmatrix值是否还有别的获取方式
  • ¥15 Stable Diffusion,用Ebsynth utility在视频选帧图重绘,第一步报错,蒙版和帧图没法生成,怎么处理啊
  • ¥15 请把下列每一行代码完整地读懂并注释出来
  • ¥15 寻找公式识别开发,自动识别整页文档、图像公式的软件