如何在玩家死亡时添加粒子系统?

时间:2016-02-11 18:52:50

标签: c# unityscript particle-system

我已经有了死亡动画。我想要一个粒子系统particleRed与死亡动画一起开始。我有一个私有变量particleRed,我已经在唤醒函数中启动它。

我现在该怎么办?

    using UnityEngine;
    using System.Collections;
    using UnityStandardAssets.CrossPlatformInput;

    public class CharacterController2D : MonoBehaviour {
    // player controls
    [Range(0.0f, 10.0f)] // create a slider in the editor and set limits on moveSpeed
    public float moveSpeed = 3f;

    public float jumpForce = 600f;

    // player health
    public int playerHealth = 1;

    // LayerMask to determine what is considered ground for the player
    public LayerMask whatIsGround;

    // Transform just below feet for checking if player is grounded
    public Transform groundCheck;

    // player can move?
    // we want this public so other scripts can access it but we don't want to show in editor as it might confuse designer
    [HideInInspector]
    public bool playerCanMove = true;

    // SFXs
    public AudioClip coinSFX;
    public AudioClip deathSFX;
    public AudioClip fallSFX;
    public AudioClip jumpSFX;
    public AudioClip victorySFX;


    // private variables below

    // store references to components on the gameObject
    Transform _transform;
    Rigidbody2D _rigidbody;
    Animator _animator;
    AudioSource _audio;
    ParticleSystem particleRed;

    // hold player motion in this timestep
    float _vx;
    float _vy;

    // player tracking
    bool facingRight = true;
    bool isGrounded = false;
    bool isRunning = false;
    bool _canDoubleJump = false;

    // store the layer the player is on (setup in Awake)
    int _playerLayer;

    // number of layer that Platforms are on (setup in Awake)
    int _platformLayer;

    void Awake () {
        // get a reference to the components we are going to be changing and store a reference for efficiency purposes
        _transform = GetComponent<Transform> ();

        _rigidbody = GetComponent<Rigidbody2D> ();
        if (_rigidbody==null) // if Rigidbody is missing
            Debug.LogError("Rigidbody2D component missing from this gameobject");

        _animator = GetComponent<Animator>();
        if (_animator==null) // if Animator is missing
            Debug.LogError("Animator component missing from this gameobject");

        _audio = GetComponent<AudioSource> ();
        if (_audio==null) { // if AudioSource is missing
            Debug.LogWarning("AudioSource component missing from this gameobject. Adding one.");
            // let's just add the AudioSource component dynamically
            _audio = gameObject.AddComponent<AudioSource>();
        }
        particleRed = GetComponent<ParticleSystem>();

        // determine the player's specified layer
        _playerLayer = this.gameObject.layer;

        // determine the platform's specified layer
        _platformLayer = LayerMask.NameToLayer("Platform");
    }

    // this is where most of the player controller magic happens each game event loop
    void Update()
    {
        // exit update if player cannot move or game is paused
        if (!playerCanMove || (Time.timeScale == 0f))
            return;

        // determine horizontal velocity change based on the horizontal input
        _vx = CrossPlatformInputManager.GetAxisRaw ("Horizontal");

        // Determine if running based on the horizontal movement
        if (_vx != 0) 
        {
            isRunning = true;
        } else {
            isRunning = false;
        }

        // set the running animation state
        _animator.SetBool("Running", isRunning);

        // get the current vertical velocity from the rigidbody component
        _vy = _rigidbody.velocity.y;

        // Check to see if character is grounded by raycasting from the middle of the player
        // down to the groundCheck position and see if collected with gameobjects on the
        // whatIsGround layer
        isGrounded = Physics2D.Linecast(_transform.position, groundCheck.position, whatIsGround);  

        // Allow Double Jump after grounded
        if (isGrounded) 
        {
            _canDoubleJump = true;
        }
        // Set the grounded animation states
        _animator.SetBool("Grounded", isGrounded);

        if (isGrounded && CrossPlatformInputManager.GetButtonDown ("Jump")) { // If grounded AND jump button pressed, then allow the player to jump
            DoJump ();
        } else if (_canDoubleJump && CrossPlatformInputManager.GetButtonDown ("Jump")) 
        {
            DoJump();
            // double jumo can be possible once
            _canDoubleJump = false;
        }

        // If the player stops jumping mid jump and player is not yet falling
        // then set the vertical velocity to 0 (he will start to fall from gravity)
        if(CrossPlatformInputManager.GetButtonUp("Jump") && _vy>0f)
        {
            _vy = 0f;
        }

        // Change the actual velocity on the rigidbody
        _rigidbody.velocity = new Vector2(_vx * moveSpeed, _vy);

        // if moving up then don't collide with platform layer
        // this allows the player to jump up through things on the platform layer
        // NOTE: requires the platforms to be on a layer named "Platform"
        Physics2D.IgnoreLayerCollision(_playerLayer, _platformLayer, (_vy > 0.0f)); 

    }

    // Checking to see if the sprite should be flipped
    // this is done in LateUpdate since the Animator may override the localScale
    // this code will flip the player even if the animator is controlling scale
    void LateUpdate()
    {
        // get the current scale
        Vector3 localScale = _transform.localScale;

        if (_vx > 0) // moving right so face right
        {
            facingRight = true;
        } else if (_vx < 0) { // moving left so face left
            facingRight = false;
        }

        // check to see if scale x is right for the player
        // if not, multiple by -1 which is an easy way to flip a sprite
        if (((facingRight) && (localScale.x<0)) || ((!facingRight) && (localScale.x>0))) {
            localScale.x *= -1;
        }

        // update the scale
        _transform.localScale = localScale;
    }

    // if the player collides with a MovingPlatform, then make it a child of that platform
    // so it will go for a ride on the MovingPlatform
    void OnCollisionEnter2D(Collision2D other)
    {
        if (other.gameObject.tag=="MovingPlatform")
        {
            this.transform.parent = other.transform;
        }
    }

    // if the player exits a collision with a moving platform, then unchild it
    void OnCollisionExit2D(Collision2D other)
    {
        if (other.gameObject.tag=="MovingPlatform")
        {
            this.transform.parent = null;
        }
    }

    //make the player jump
    void DoJump()
    {
        // reset current vertical motion to 0 prior to jump
            _vy = 0f;
        // add a force in the up direction
        _rigidbody.AddForce (new Vector2 (0, jumpForce));
        // play the jump sound
        PlaySound(jumpSFX);
    }
    // do what needs to be done to freeze the player
    void FreezeMotion() {
        playerCanMove = false;
        _rigidbody.isKinematic = true;
    }

    // do what needs to be done to unfreeze the player
    void UnFreezeMotion() {
        playerCanMove = true;
        _rigidbody.isKinematic = false;
    }

    // play sound through the audiosource on the gameobject
    void PlaySound(AudioClip clip)
    {
        _audio.PlayOneShot(clip);
    }

    // public function to apply damage to the player
    public void ApplyDamage (int damage) {
        if (playerCanMove) {
            playerHealth -= damage;

            if (playerHealth <= 0) { // player is now dead, so start dying
                PlaySound(deathSFX);

                StartCoroutine (KillPlayer ());

            }
        }
    }

    // public function to kill the player when they have a fall death
    public void FallDeath () {
        if (playerCanMove) {
            playerHealth = 0;
            PlaySound(fallSFX);

            StartCoroutine (KillPlayer ());

        }

    }

    // coroutine to kill the player
    IEnumerator KillPlayer()
    {
        if (playerCanMove)
        {
            // freeze the player
            FreezeMotion();

            // play the death animation
            _animator.SetTrigger("Death");

            // After waiting tell the GameManager to reset the game
            yield return new WaitForSeconds(2.0f);

            if (GameManager.gm) // if the gameManager is available, tell it to reset the game
                GameManager.gm.ResetGame();
            else // otherwise, just reload the current level
                Application.LoadLevel(Application.loadedLevelName);
        }
    }

    public void CollectCoin(int amount) {
        PlaySound(coinSFX);

        if (GameManager.gm) // add the points through the game manager, if it is available
            GameManager.gm.AddPoints(amount);
    }

    // public function on victory over the level
    public void Victory() {
        PlaySound(victorySFX);
        FreezeMotion ();
        _animator.SetTrigger("Victory");

        if (GameManager.gm) // do the game manager level compete stuff, if it is available
            GameManager.gm.LevelCompete();
    }

    // public function to respawn the player at the appropriate location
    public void Respawn(Vector3 spawnloc) {
        UnFreezeMotion();
        playerHealth = 1;
        _transform.parent = null;
        _transform.position = spawnloc;
        _animator.SetTrigger("Respawn");
    }

    public void EnemyBounce ()
    {
        DoJump ();
    }
}

2 个答案:

答案 0 :(得分:0)

我建议制作一个空的游戏对象预制件来保存粒子系统。然后,当您想要使用粒子系统时,只需实例化该对象即可。这是我发现它最容易实现的方式,而且功能多样。另一种方法是,你可以让空游戏对象成为玩家的孩子,然后在你想要使用它时激活它。第二种方式并不理想,但也会完成工作。

答案 1 :(得分:0)

对于已添加到gameObject的ParticleSystem组件,通过取消选中组件上的enabled复选框,将enabled属性设置为false。

然后在KillPlayer函数中

particleRed.enabled = true;

此外,您可以通过将其设置为false来确保在唤醒功能中禁用它。