Healthbar über dem Kopf eines Charakters anzeigen

So heute gibt es mal wieder ein kleines Unity3D-Script. Mit diesem JavaScript kann man eine  Energy- oder HealthBar über dem Kopf eines Charakters anzeigen lassen. Die HealthBar wird auch dann über dem Kopf des Charakters angezeigt wenn sich dieser bewegt. Diese Art der Anzeige ist z.B. dann äußerst praktisch, wenn man viele Feinde hat, derer man sich gerade entledigen muss, da man so genau sehen kann welcher der Feinde in Kürze das Zeitliche segnen wird. Um das Script nutzen zu können, sind ein paar Vorarbeiten nötig.

 


Prefab mit der GUITexture erstellen

Wir benötigen ein Prefab in dem sich die GUITexture mit der Grafik befindet die wir als EnergyBar benutzen wollen. Dazu wählen wir als erstes im Menü unter „GameObject->Create Other“ eine „GUITexture“ aus und benennen diese gleich mal um zu „EnergyBarGUI“. Wir sollten nun in der Mitte unserer Szene ein Unity3D-Logo sehen. Im Inspector geben wir hinter „Texture“ die Grafik für unsere EnergyBar und danach unter „Pixel Inset“ die Breite und Höhe der Grafik an. Nun klicken wir im Projektfenster auf „Create“ und anschließend auf „Prefab“. Das Prefab benennen wir um in „EnergyBarGUI“ und ziehen anschließend die zuvor erstelle „GUITexture“ auf das Symbol des Prefab. Die Farbe des Symbols sollte sich anschließend von Grau in Blau ändern. Wer sich keine eigene Grafik für die EnergyBar erstellen will, kann gern die Grafik links auf der Seite verwenden.

 

Script – EnemyEnergyBar.js

#pragma strict

/***************************************************************************
 * Dateiname: EnemyEnergyBar.js
 * Author: Enrico Sadlowski
 * Datum: 01.03.2012 19:47
 *
 * Beschreibung:
 * Anzeige einer EnergyBar über einem Objekt
 * Übergabe eines prefabs in dem eine GUITexture ist.
 * Angabe der maximal zulässigen Treffer
 * Angabe der Breite der EnergyBar bei 100% also wenn noch kein Treffer
 * Angabe der Höhe der EnergyBar
 *
 * Das Script erkennt die Treffer des Charakters, zählt diese und passt die
 * HealthBar an. Wenn die maximale Trefferanzahl erreicht ist werden Enemy
 * und die zugehörige EnergyBar zerstört
 * fight wird auf true gesetzt wenn der Charakter einen Schlag oder Tritt ausführt
 * und ist dazu da, mehrere Kollisionen bei einem Tritt oder Schlag auszuschließen
 **************************************************************************/  

private var myhb : GameObject;
private var hitPoints : float = 0;

var hitPointsMax : float = 20;
var healthbarWidth : float = 100;
var healthbarHeight : float = 15;
var myHealthbar : GameObject;

static var fight : boolean = false; //true wenn ein Schlag oder Tritt ausgeführt wurde

function Start()
{
  if(hitPointsMax < 0) hitPointsMax = 20;
  if(hitPoints > hitPointsMax) hitPoints = hitPointsMax;

  myhb = Instantiate(myHealthbar, transform.position, transform.rotation);
  myhb.active = false;
}

function FixedUpdate()
{
  //EnergyBar erst einblenden wenn Enemy mind. 1x getroffen wurde
  if(hitPoints > 0 && !myhb.active) myhb.active = true;

  myhb.transform.position = Camera.main.WorldToViewportPoint(transform.position);
  myhb.transform.position.x -= .07;
  myhb.transform.position.y -= -.22;
  myhb.transform.localScale = Vector3.zero;

  if(hitPoints > hitPointsMax) hitPoints = hitPointsMax;
  if(hitPoints < 0) hitPoints = 0;
  if(hitPointsMax < 0) hitPointsMax = 0;
  if(healthbarWidth < 0) healthbarWidth = 0;

  var healthpercent : float = (hitPointsMax - hitPoints) / hitPointsMax * 100;
  var hbWidth : float = healthbarWidth * healthpercent / 100;

  if(healthpercent < 0) { healthpercent = 0; }
  if(healthpercent > 0) { healthpercent = 100; }

  myhb.guiTexture.pixelInset = Rect(18, 10, hbWidth, healthbarHeight);
}

//Treffer erkennen, zählen und EnergyBar anpassen
function OnCollisionEnter (hit : Collision)
{
  if (hit.gameObject.tag == "PlayerFaust" && fight)
  {
    ++hitPoints;
    fight = false;

    if (hitPoints == hitPointsMax)
    {
      Destroy (gameObject);
      Destroy (myhb.gameObject);
    }
  }
}

Die statische Variable „fight“ setze ich in einem anderen Script auf true wenn ich z.B. die linke Maustaste zum schlagen drücke. Auf diese Weise kann verhindert werden dass ein Schlag oder nur eine Berührung des Charakters mit dem Feind Energie von diesem abzieht.

//Rechte Hand schlagen
if (Input.GetButtonDown("Fire1"))
{
  animation.Play("comboPunch_1");
  EnemyEnergyBar.fight = true;
}

Über Enrico S.

Programmierer, Webdesigner, Grafiker, Blogger, Screencaster, Arduino- und eMobility Enthusiast.

Kommentare geschlossen.