Unity 粒子系统 - 击中时的单个播放粒子

问题描述

好的,我有一个预制的粒子,如下图左侧所示。

Comparison

左侧是弹丸代码的结​​果:

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

[RequireComponent(typeof(Collider2D))]
[RequireComponent(typeof(Rigidbody2D))]
[RequireComponent(typeof(SpriteRenderer))]
public class Projectile : MonoBehavIoUr
{
    [Serializefield] float veLocity;
    [Serializefield] float acceleration;
    new Collider2D collider;
    Rigidbody2D rb;
    SpriteRenderer sr;
    [Serializefield] LayerMask targetLayer;
    [Serializefield] float lifetime;
    [Serializefield] float damage;
    [Serializefield] ParticleSystem HitEffect;

    public event Action<Projectile,Collider2D> OnHit;

    public Color Color
    {
        get
        {
            return sr.color;
        }
        set
        {
            sr.color = value;
        }
    }


    // Start is called before the first frame update
    void Start()
    {
        collider = GetComponent<Collider2D>();
        rb = GetComponent<Rigidbody2D>();
        sr = GetComponent<SpriteRenderer>();

        collider.isTrigger = false;
    }

    // Update is called once per frame
    void Update()
    {
        lifetime -= Time.deltaTime;
        if (lifetime <=0)
        {
            Destroy(this.gameObject);
        }
    }

    public void SetTargetMask(LayerMask _mask)
    {
        targetLayer = _mask;
    }
    public void Setdamage(float amount)
    {
        this.damage = amount;
    }

    protected virtual void OnCollisionEnter2D(Collision2D other)
    {
        var _hitEffect = Instantiate(HitEffect.gameObject,transform).GetComponent<ParticleSystem>();
        if (!_hitEffect.isPlaying) _hitEffect.Play();
        rb.veLocity = Vector2.zero;
        collider.isTrigger = true;
        sr.enabled = false;
        damageable othersdamage;
        other.gameObject.TryGetComponent<damageable>(out othersdamage);
        //Debug.Log("dmg not null: " + (othersdamage != null)  + "; presumed layer:" + other.gameObject.layer + "; actual layer:" + targetLayer.value);
        if (othersdamage != null && other.gameObject.layer == targetLayer.value)
        {
            OnHit?.Invoke(this,other.collider);
            othersdamage.Handledamage(damage);
        }
        Destroy(this.gameObject,HitEffect.main.duration);
    }
}

所以,我们的想法是让粒子在每个接触点出现在左侧,播放和消失。 相反,我有一个非动画粒子,它在击中目标后会漂浮起来。

我缺少什么才能播放单个爆炸,以及如何让子粒子正确播放。

解决方法

我错过了什么才能玩单爆

要么完全停止刚体:

rb.angularVelocity = Vector2.zero;
rb.velocity = Vector2.zero;

或者,取消投射物的命中效果,并在延迟后摧毁它

_hitEffect.transform.SetParent(null);
Destroy(_hitEffect.gameObject,afterDelay);