This tutorial continues on from the previous tutorials on setting up a fall detector, adding checkpoints, adding the ability to respawn the player, and adding a Level Manager to control respawning in a 2D game.
In this tutorial, we will use the Level Manager to control respawns and we will add a delay to respawns. Watch the video below and then scroll down for the sample code.
Sample code
Here is the sample C# code for the PlayerController script.
using UnityEngine; using System.Collections; public class PlayerController : MonoBehaviour { public float speed = 5f; public float jumpSpeed = 8f; private float movement = 0f; private Rigidbody2D rigidBody; public Transform groundCheckPoint; public float groundCheckRadius; public LayerMask groundLayer; private bool isTouchingGround; private Animator playerAnimation; public Vector3 respawnPoint; public LevelManager gameLevelManager; // Use this for initialization void Start () { rigidBody = GetComponent<Rigidbody2D> (); playerAnimation = GetComponent<Animator> (); respawnPoint = transform.position; gameLevelManager = FindObjectOfType<LevelManager> (); } // Update is called once per frame void Update () { isTouchingGround = Physics2D.OverlapCircle (groundCheckPoint.position, groundCheckRadius, groundLayer); movement = Input.GetAxis ("Horizontal"); if (movement > 0f) { rigidBody.velocity = new Vector2 (movement * speed, rigidBody.velocity.y); transform.localScale = new Vector2(0.1483552f,0.1483552f); } else if (movement < 0f) { rigidBody.velocity = new Vector2 (movement * speed, rigidBody.velocity.y); transform.localScale = new Vector2(-0.1483552f,0.1483552f); } else { rigidBody.velocity = new Vector2 (0,rigidBody.velocity.y); } if(Input.GetButtonDown ("Jump") && isTouchingGround){ rigidBody.velocity = new Vector2(rigidBody.velocity.x,jumpSpeed); } playerAnimation.SetFloat ("Speed", Mathf.Abs (rigidBody.velocity.x)); playerAnimation.SetBool ("OnGround", isTouchingGround); } void OnTriggerEnter2D(Collider2D other){ if (other.tag == "FallDetector") { gameLevelManager.Respawn(); } if (other.tag == "Checkpoint") { respawnPoint = other.transform.position; } } }
Here is the sample C# code for the LevelManager script.
using UnityEngine; using System.Collections; using UnityEngine.UI; public class LevelManager : MonoBehaviour { public float respawnDelay; public PlayerController gamePlayer; // Use this for initialization void Start () { gamePlayer = FindObjectOfType<PlayerController> (); } // Update is called once per frame void Update () { } public void Respawn(){ StartCoroutine ("RespawnCoroutine"); } public IEnumerator RespawnCoroutine(){ gamePlayer.gameObject.SetActive (false); yield return new WaitForSeconds (respawnDelay); gamePlayer.transform.position = gamePlayer.respawnPoint; gamePlayer.gameObject.SetActive (true); } }
Next tutorial: Particle systems in 2D Unity games