C# 如何在Unity中播放特定克隆游戏对象的粒子?
我现在正在做一个简单的统一游戏。有一些圆锥体从天上掉下来,玩家需要控制一个立方体来躲避它们。当圆锥体撞击立方体时,它会降低立方体的HP并发射一些粒子。这是我的剧本: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
public class move : MonoBehaviour{
ParticleSystem particle;
static move instance;
void Start()
{
particle = FindObjectOfType<ParticleSystem>();
instance = this;
}
public static void PlayParticles()
{
instance.particle.Play();
}
}
第一个脚本附加到圆锥体预设,第二个脚本附加到立方体。但问题是,当一个圆锥体撞击立方体时,其他圆锥体发射粒子,而不是撞击立方体的圆锥体。
我怎样才能解决这个问题?
非常感谢您的帮助
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();
}
}
}
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
附加到了什么?