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

时间:2021-02-16 17:08:09

标签: unity3d particle-system

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

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);
    }
}

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

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

1 个答案:

答案 0 :(得分:0)

<块引用>

我错过了什么才能玩单爆

要么完全停止刚体:

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

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

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