Os materiais didáticos aqui disponibilizados estão licenciados através de Creative Commons Atribuição-SemDerivações-SemDerivados CC BY-NC-ND. Você possui a permissão para visualizar e compartilhar, desde que atribua os créditos do autor. Não poderá alterá-los e nem utilizá-los para fins comerciais.
Atribuição-SemDerivações-SemDerivados
CC BY-NC-ND
Cursos / Jogos Digitais / Desenvolvimento com Motores de Jogos I / Aula
Por fim, precisamos de uma pequena alteração no método Break, uma vez que o chão dos buracos atua diretamente com esse método. Caso o personagem vá quebrar, a barra de vida deve ser completamente zerada, independentemente de seu valor anterior. Fazemos isso alterando o valor da propriedade Color do FillRect, componente do Slider que vimos em aulas anteriores. O código completo do novo PlayerController, incluindo as alterações no método Break, podem ser vistos na Listagem 5.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class PlayerController : MonoBehaviour {
private bool jumping = false;
private bool grounded = false;
private bool doubleJump = false;
private bool doubleJumping = false;
private bool movingRight = true;
private bool active = true;
private Rigidbody2D rigidBody;
private Animator ani;
public Transform groundCheck;
public LayerMask layerMask;
public float acceleration = 100f;
public float maxSpeed = 10f;
public float jumpSpeed = 500f;
private float startingHealth = 100f;
private float currentHealth;
private Slider healthBar;
// Use this for initialization
void Awake () {
rigidBody = GetComponent<Rigidbody2D> ();
ani = GetComponent<Animator>();
healthBar = FindObjectOfType<Slider>();
currentHealth = startingHealth;
healthBar.value = currentHealth;
}
// Update is called once per frame
void Update() {
if (active) {
if (grounded) {
doubleJump = true;
}
if (Input.GetButtonDown("Jump")) {
if (grounded) {
jumping = true;
doubleJump = true;
} else if (doubleJump) {
doubleJumping = true;
doubleJump = false;
}
}
}
}
//Called in fixed time intervals, frame rate independent
void FixedUpdate() {
if (active) {
float moveH = Input.GetAxis ("Horizontal");
ani.SetFloat("speed", Mathf.Abs(moveH));
grounded = Physics2D.OverlapBox (groundCheck.position, (new Vector2 (1.3f, 0.2f)), 0f, layerMask);
ani.SetBool("grounded", grounded);
ani.SetFloat("vertSpeed", rigidBody.velocity.y);
if (moveH < 0 && movingRight) {
Flip();
} else if (moveH > 0 && !movingRight) {
Flip();
}
rigidBody.velocity = new Vector3 (maxSpeed * moveH, rigidBody.velocity.y, 0);
if (jumping) {
rigidBody.AddForce(new Vector2(0f, jumpSpeed));
jumping = false;
}
if (doubleJumping) {
rigidBody.velocity = new Vector2 (rigidBody.velocity.x, 0);
rigidBody.AddForce(new Vector2(0f, jumpSpeed));
doubleJumping = false;
}
}
}
void Flip() {
movingRight = !movingRight;
transform.localScale = new Vector3((transform.localScale.x * -1), transform.localScale.y, transform.localScale.z);
}
public bool isGrounded () {
return grounded;
}
public void Break () {
active = false;
//rigidBody.bodyType = RigidbodyType2D.Static;
ani.SetBool("active", false);
ani.Play("Break");
FindObjectOfType<GameController>().Break();
healthBar.fillRect.GetComponentInChildren<Image>().color = new Color(0,0,0,0);
}
public void LevelEnd () {
active = false;
rigidBody.bodyType = RigidbodyType2D.Static;
ani.SetBool("active", false);
ani.Play("CelebrationRoll");
FindObjectOfType<GameController>().LevelEnd();
}
public float HealthChange (float value) {
if (currentHealth + value < startingHealth) {
currentHealth += value;
} else {
currentHealth = startingHealth;
}
healthBar.value = currentHealth;
if (currentHealth <= 0) {
Break();
}
return currentHealth;
}
}
Versão 5.3 - Todos os Direitos reservados