- Parts 1 & 2 - 2D Player Movement and Touch Input
- Part 3 - Art and Animations for our Player
- Part 4 - Enemy Movement
In part 5a of this Unity3D tutorial we add Player Damage and Death. The player will take damage from touching enemies but become invincible for a short time afterwards. If the player takes 3 hits, then the player dies and the level restarts.
Twitter: https://twitter.com/Devination3D
Time Breakdown:
0:55 - Fixing a couple of issues with the enemy
3:00 - Setting up the damage animation for our player
4:56 - Setting up the script for player damage
9:16 - Adding our level to the build settings so we can restart the game on death
10:12 - Playing the hurt animation when we take damage
16:12 - Making the player ignore collision with the enemy after getting hurt
19:50 - Demonstration of player damage working as intended
3:00 - Setting up the damage animation for our player
4:56 - Setting up the script for player damage
9:16 - Adding our level to the build settings so we can restart the game on death
10:12 - Playing the hurt animation when we take damage
16:12 - Making the player ignore collision with the enemy after getting hurt
19:50 - Demonstration of player damage working as intended
Check out the videos above to hear the explanation and see the code in action
/*/
* Script by Devin Curry
* www.Devination.com
* www.youtube.com/user/curryboy001
* Please like and subscribe if you found my tutorials helpful :D
* Twitter: https://twitter.com/Devination3D
/*/
using UnityEngine;
using System.Collections;
public class PlayerController : MonoBehaviour
{
public static PlayerController instance;
//Movement
public float speed = 10, jumpVelocity = 10;
public LayerMask playerMask;
public bool canMoveInAir = true;
//Combat
public int health = 3;
public float invincibleTimeAfterHurt = 2;
[HideInInspector]
public Collider2D[] myColls;
Transform myTrans, tagGround;
Rigidbody2D myBody;
bool isGrounded = false;
float hInput;
AnimatorController myAnim;
void Start ()
{
instance = this;
myColls = this.GetComponents<Collider2D>();
myBody = this.GetComponent<Rigidbody2D>();
myTrans = this.transform;
tagGround = GameObject.Find (this.name + "/tag_ground").transform;
myAnim = AnimatorController.instance;
}
void FixedUpdate ()
{
isGrounded = Physics2D.Linecast (myTrans.position, tagGround.position, playerMask);
myAnim.UpdateIsGrounded (isGrounded);
#if !UNITY_ANDROID && !UNITY_IPHONE && !UNITY_BLACKBERRY && !UNITY_WINRT || UNITY_EDITOR
hInput = Input.GetAxisRaw("Horizontal");
myAnim.UpdateSpeed(hInput);
if(Input.GetButtonDown("Jump"))
Jump();
#endif
Move(hInput);
}
void Move(float horizonalInput)
{
if(!canMoveInAir && !isGrounded)
return;
Vector2 moveVel = myBody.velocity;
moveVel.x = horizonalInput * speed;
myBody.velocity = moveVel;
}
public void Jump()
{
if(isGrounded)
myBody.velocity += jumpVelocity * Vector2.up;
}
public void StartMoving(float horizonalInput)
{
hInput = horizonalInput;
myAnim.UpdateSpeed(horizonalInput);
}
void Hurt()
{
health--;
if (health <= 0)
Application.LoadLevel(Application.loadedLevel);
else
myAnim.TriggerHurt(invincibleTimeAfterHurt);
}
void OnCollisionEnter2D(Collision2D collision)
{
Enemy enemy = collision.collider.GetComponent<Enemy>();
if(enemy != null)
{
foreach(ContactPoint2D point in collision.contacts)
{
Debug.Log(point.normal);
Debug.DrawLine(point.point, point.point + point.normal, Color.red, 10);
if( point.normal.y >= 0.9f )
{
Vector2 velocity = myBody.velocity;
velocity.y = jumpVelocity;
myBody.velocity = velocity;
enemy.Hurt();
}
else
{
Hurt();
}
}
}
}
}