C# 如何在Unity中播放特定克隆游戏对象的粒子?

C# 如何在Unity中播放特定克隆游戏对象的粒子?,c#,unity3d,particles,particle-system,C#,Unity3d,Particles,Particle System,我现在正在做一个简单的统一游戏。有一些圆锥体从天上掉下来,玩家需要控制一个立方体来躲避它们。当圆锥体撞击立方体时,它会降低立方体的HP并发射一些粒子。这是我的剧本: public class move : MonoBehaviour{ ParticleSystem particle; static move instance; void Start() { particle = FindObjectOfType<ParticleSystem>(); instan

我现在正在做一个简单的统一游戏。有一些圆锥体从天上掉下来,玩家需要控制一个立方体来躲避它们。当圆锥体撞击立方体时,它会降低立方体的HP并发射一些粒子。这是我的剧本:

public class move : MonoBehaviour{

ParticleSystem particle;

static move instance;

void Start()
{
    particle = FindObjectOfType<ParticleSystem>();
    instance = this;
}

public static void PlayParticles()
{
    instance.particle.Play();
}
}
第一个脚本附加到圆锥体预设,第二个脚本附加到立方体。但问题是,当一个圆锥体撞击立方体时,其他圆锥体发射粒子,而不是撞击立方体的圆锥体。 我怎样才能解决这个问题? 非常感谢您的帮助

  • 从多维数据集中删除与锥体相关的逻辑:

    专用void OnCollisionEnter(碰撞) { if(collision.gameObject.CompareTag(“cone”)) { //move.PlayParticles();//-----------删除此行 GameDirector.降低HP(0.25f); }

    }

  • 使粒子变量在检查器中可赋值-添加[SerializeField]属性。并将其分配给检查员

  • 将碰撞处理添加到cone脚本中
  • 从脚本中删除不必要的静态 大概是这样的:

    public class move : MonoBehaviour
    {
    
    [SerializeField] //------- Add attribute and do not forget to assign PS in inspector
    ParticleSystem particle;
    
    //static move instance; //----- Remove
    
    //Remove Start:
    /*
        void Start()
        {
            particle = FindObjectOfType<ParticleSystem>();
            instance = this;
        }
    */
    //Remove PlayParticles:
    /*
        public void PlayParticles()
        {
            Change:
            instance.particle.Play();
        }
    */
        //---- Add collision check
        private void OnCollisionEnter(Collision collision)
        {
            if (collision.gameObject.CompareTag("cube")) //----- Set proper tag to your cube
            {
                particle.Play();
            }
    
        }
    
    }
    
    公共类移动:单一行为
    {
    [SerializeField]/----添加属性,不要忘记在inspector中分配PS
    粒子系统粒子;
    //静态移动实例;//----删除
    //删除开始:
    /*
    void Start()
    {
    粒子=FindObjectOfType();
    实例=此;
    }
    */
    //删除播放粒子:
    /*
    公共空间粒子()
    {
    更改:
    instance.particle.Play();
    }
    */
    //----添加碰撞检查
    专用void OnCollisionEnter(碰撞)
    {
    if(collision.gameObject.CompareTag(“多维数据集”)/----为多维数据集设置适当的标记
    {
    particle.Play();
    }
    }
    }
    
  • 从多维数据集中删除与锥体相关的逻辑:

    专用void OnCollisionEnter(碰撞) { if(collision.gameObject.CompareTag(“cone”)) { //move.PlayParticles();//-----------删除此行 GameDirector.降低HP(0.25f); }

    }

  • 使粒子变量在检查器中可赋值-添加[SerializeField]属性。并将其分配给检查员

  • 将碰撞处理添加到cone脚本中
  • 从脚本中删除不必要的静态 大概是这样的:

    public class move : MonoBehaviour
    {
    
    [SerializeField] //------- Add attribute and do not forget to assign PS in inspector
    ParticleSystem particle;
    
    //static move instance; //----- Remove
    
    //Remove Start:
    /*
        void Start()
        {
            particle = FindObjectOfType<ParticleSystem>();
            instance = this;
        }
    */
    //Remove PlayParticles:
    /*
        public void PlayParticles()
        {
            Change:
            instance.particle.Play();
        }
    */
        //---- Add collision check
        private void OnCollisionEnter(Collision collision)
        {
            if (collision.gameObject.CompareTag("cube")) //----- Set proper tag to your cube
            {
                particle.Play();
            }
    
        }
    
    }
    
    公共类移动:单一行为
    {
    [SerializeField]/----添加属性,不要忘记在inspector中分配PS
    粒子系统粒子;
    //静态移动实例;//----删除
    //删除开始:
    /*
    void Start()
    {
    粒子=FindObjectOfType();
    实例=此;
    }
    */
    //删除播放粒子:
    /*
    公共空间粒子()
    {
    更改:
    instance.particle.Play();
    }
    */
    //----添加碰撞检查
    专用void OnCollisionEnter(碰撞)
    {
    if(collision.gameObject.CompareTag(“多维数据集”)/----为多维数据集设置适当的标记
    {
    particle.Play();
    }
    }
    }
    
    正如我所看到的,您(ab!)对所有事情都使用单例模式,并调用了许多应该是实例方法/属性的东西
    静态的


    因此,假设每个预置都有您的
    move
    脚本和
    ParticleSystem
    在其自身层次结构中的某个位置,您可以这样做

    public class move : MonoBehaviour
    {
        // Already reference this via the Inspector by dragging the 
        // GameObject with the ParticleSystem into this slot
        [SerializeField] private ParticleSystem particle;
    
        private void Awake()
        {
            // As fallback get it on runtime
            if(!particle) particle = GetComponentInChildren<ParticleSystem>(true);
        }
    
        // Use a normal instanced method
        public void PlayParticles()
        {
            particle.Play();
        }
    }
    

    注意:对于
    GameDirector
    来说可能是相同的,您应该有一个字段

    [SerilaizeField] private GameDirector gameDirector;
    
    或者通过Inspector引用它,或者(仅作为回退)通过

    private void Awake()
    {
        if(!gameDirector) gameDirector = FindObjectOfType<GameDirector>();
    }
    
    private void Awake()
    {
    如果(!gameDirector)gameDirector=FindObjectOfType();
    }
    
    这里的
    FindObjectOfType
    似乎是“ok”的,因为
    GameDirector
    听起来像是场景中只存在一次的东西。

    正如我所看到的,你(ab!)对所有东西都使用单例模式,并调用很多应该是实例方法/属性的东西
    静态的


    因此,假设每个预置都有您的
    move
    脚本和
    ParticleSystem
    在其自身层次结构中的某个位置,您可以这样做

    public class move : MonoBehaviour
    {
        // Already reference this via the Inspector by dragging the 
        // GameObject with the ParticleSystem into this slot
        [SerializeField] private ParticleSystem particle;
    
        private void Awake()
        {
            // As fallback get it on runtime
            if(!particle) particle = GetComponentInChildren<ParticleSystem>(true);
        }
    
        // Use a normal instanced method
        public void PlayParticles()
        {
            particle.Play();
        }
    }
    

    注意:对于
    GameDirector
    来说可能是相同的,您应该有一个字段

    [SerilaizeField] private GameDirector gameDirector;
    
    或者通过Inspector引用它,或者(仅作为回退)通过

    private void Awake()
    {
        if(!gameDirector) gameDirector = FindObjectOfType<GameDirector>();
    }
    
    private void Awake()
    {
    如果(!gameDirector)gameDirector=FindObjectOfType();
    }
    

    这里的
    FindObjectOfType
    似乎是“ok”的,因为
    GameDirector
    听起来像是场景中只存在一次

    不使用
    静态
    (滥用单例模式)?而不是使用
    FindObjectOfType
    ,而是使用
    GetComponent
    。。。您的
    ParticleSystem
    附加到了什么?不使用
    静态
    (滥用单例模式)?而不是使用
    FindObjectOfType
    ,而是使用
    GetComponent
    。。。您的
    ParticleSystem
    附加到了什么?