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