- Parts 1 & 2 - 2D Player Movement and Touch Input
- Part 3 - Art and Animations for our Player
- Part 4 - Enemy Movement
- Part 5a - Player Damage and Death
In part 5b of this Unity3D tutorial we add a way for the player to kill the enemy. The player will be able to jump on top of an enemy to kill it and bounce up.
Twitter: https://twitter.com/Devination3D
Time Breakdown:
0:33 - Adding the Hurt function to our Enemy
1:47 - Check contact point(s) between Enemy and Player
4:04 - Visualizing our contact points and normals in game
5:13 - Changing player colliders to work properly
6:25 - Explaination of how we will check to see if the Player or the Enemy should get hurt
7:50 - Demonstration of Enemy kill code working
8:08 - Adding small jump force when killing an Enemy
9:04 - Demonstration of pop up code working
1:47 - Check contact point(s) between Enemy and Player
4:04 - Visualizing our contact points and normals in game
5:13 - Changing player colliders to work properly
6:25 - Explaination of how we will check to see if the Player or the Enemy should get hurt
7:50 - Demonstration of Enemy kill code working
8:08 - Adding small jump force when killing an Enemy
9:04 - Demonstration of pop up code working
Check out the videos above to hear the explanation and see the code in action
PlayerController.cs
/*/
* 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();
myBody = this.GetComponent();
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();
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();
}
}
}
}
}
Enemy.cs
/*/
* 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 Enemy : MonoBehaviour
{
public LayerMask enemyMask;
public float speed = 1;
Rigidbody2D myBody;
Transform myTrans;
float myWidth;
void Start ()
{
myTrans = this.transform;
myBody = this.GetComponent();
myWidth = this.GetComponent().bounds.extents.x;
}
void FixedUpdate ()
{
//Check to see if there's ground in front of us before moving forward
Vector2 lineCastPos = myTrans.position - myTrans.right * myWidth;
Debug.DrawLine(lineCastPos, lineCastPos + Vector2.down);
bool isGrounded = Physics2D.Linecast(lineCastPos, lineCastPos + Vector2.down, enemyMask);
//If theres no ground, turn around
if(!isGrounded)
{
Vector3 currRot = myTrans.eulerAngles;
currRot.y += 180;
myTrans.eulerAngles = currRot;
}
//Always move forward
Vector2 myVel = myBody.velocity;
myVel.x = -myTrans.right.x * speed;
myBody.velocity = myVel;
}
public void Hurt()
{
Destroy(this.gameObject);
}
}