- Home /
Accessing Enemy lifebar prefab
I created a guitexture, made it prefab and attached it, as a child, to an enemy. I want to be able to access it, and use it as a lifebar that appears when you make that enemy your target, but I've having trouble doing so. Do I need to instantiate the prefab first or do I need to find the child of the parent object?
At some point, I need to access the pixelInset to change the length of the bar. There must be some things I haven't learned yet. Other than the Burgzerg arcade, any other in-depth tutorials?
Thanks!
Answer by aldonaletto · Aug 23, 2012 at 01:00 AM
You must not child GUITexture (nor GUIText) to a 3D world object: as a child, it will follow the parent position - but transform.position has a different meaning for these items: it's expressed in viewport coordinates, which range from 0 to 1, thus any small parent movement will kick the GUITexture out of screen. You should instead link the GUITexture to the enemy or vice-versa via script using a reference variable, and calculate its position in screen with Camera.WorldToViewportPoint.
If you want to have a health bar for each enemy, instantiate the enemy and place the health bar instantiation code in the enemy script: it may instantiate the health bar prefab and keep it disabled when not needed - something like this:
Enemy script:
var health: float; // enemy health var maxHealth: float = 100; // full health value var hBarWidth: float = 150; // health bar width in pixels var offset: float = 2; // bar vertical offset above enemy (world units) var hBarPrefab: GUITexture; // drag the bar prefab here in the enemy prefab private var hGuiTex: GUITexture; // link to the health bar
function Start(){ hGuiTex = Instantiate(hBarPrefab); // create the health bar hGuiTex.enabled = false; // make it invisible health = maxHealth; // enemy comes to the world full of health }
function Update(){ if (hGuiTex.enabled){ // if health bar visible... // calculate its size: hGuiTex.pixelInset.width = hBarWidth health / maxHealth; // find the 3D bar position offset units above enemy: var pos3D = transform.position + Vector3.up offset; // convert it to viewport coordinates and set bar position: hGuiTex.transform.position = Camera.main.WorldToViewportPoint(pos3D); } }
function EnableBar(onOff: boolean){ hGuiTex.enabled = onOff; }
function OnDestroy(){ // send health bar to hell with the enemy: Destroy(hGuiTex.gameObject); }
When you select some enemy as a target, use any reference to it with SendMessage to enable/disable its health. Supposing for instance that the variable curTarget holds a reference to the currently selected enemy (player script):
private var curTarget: Transform; private var oldTarget: Transform;
function Update(){ if (curTarget != oldTarget){ // if target changed... // if there exists an oldTarget, disable its bar: if (oldTarget) oldTarget.SendMessage("EnableBar", false); // enable curTarget health bar: curTarget.SendMessage("EnableBar", true); oldTarget = curTarget; // update oldTarget } }
Your answer
Follow this Question
Related Questions
Issues with instantiated prefabs 1 Answer
Spawning a prefab at another object's location 3 Answers
Issue Instantiating prefab in C# 0 Answers
How do I make a clone of a prefab appear on the correct layer? [5.2.2f1] 1 Answer
Prefabs instantiated from an array are keeping their public int value 1 Answer