- Home /
GUI displayed only when firing
I have this weapon script that i am using per weapon...This is the M16 version. I am trying to display in GUI the BulletsLeft and Clips amounts...it is only showing up when i am firing and i would like to keep it displayed all the time, per different weapon, so i can insert a GUItexture background.
Or how do i call the variables bulletsLeft and clips from this script in an other script wich is displayed all the time?
Here is the script currently //m16.js
var range = 100.0;
var fireRate = 0.05;
var force = 9.5;
var damage = 20;
var bulletsPerClip = 40;
var clips = 6;
var reloadTime = 2.4;
private var hitParticles : ParticleEmitter;
var muzzleFlash : Renderer;
var bulletSound : AudioClip;
private var bulletsLeft : int = 0;
private var nextFireTime = 0.1;
private var m_LastFrameShot = -1;
function Start ()
{
hitParticles = GetComponentInChildren(ParticleEmitter);
// We don't want to emit particles all the time, only when we hit something.
if (hitParticles)
hitParticles.emit = false;
bulletsLeft = bulletsPerClip;
}
function LateUpdate()
{
if (muzzleFlash)
{
// We shot this frame, enable the muzzle flash
if (m_LastFrameShot == Time.frameCount)
{
muzzleFlash.transform.localRotation =
Quaternion.AngleAxis(Random.Range(0, 90), Vector3.forward);
muzzleFlash.enabled = true;
if (audio)
{
if (!audio.isPlaying)
audio.Play();
audio.loop = false;
}
}
// We didn't, disable the muzzle flash
else
{
muzzleFlash.enabled = false;
enabled = false;
// Play sound
if (audio)
{
audio.loop = false;
}
}
}
}
function OnGUI () {
GUI.Label (Rect (560, 500, 100, 30),"AMMO: " + bulletsLeft);
GUI.Label (Rect (630, 500, 100, 30),"CLIPS: " + clips);
}
function Fire ()
{
if (bulletsLeft == 0)
return;
// If there is more than one bullet between the last and this frame
// Reset the nextFireTime
if (Time.time - fireRate > nextFireTime)
nextFireTime = Time.time - Time.deltaTime;
// Keep firing until we used up the fire time
while( nextFireTime < Time.time && bulletsLeft != 0)
{
FireOneShot();
AudioSource.PlayClipAtPoint(bulletSound, transform.position);
nextFireTime += fireRate;
}
}
function FireOneShot ()
{
var direction = transform.TransformDirection(Vector3.forward);
var hit : RaycastHit;
// Did we hit anything?
if (Physics.Raycast (transform.position, direction, hit, range))
{
// Apply a force to the rigidbody we hit
if (hit.rigidbody)
hit.rigidbody.AddForceAtPosition(force * direction, hit.point);
// Place the particle system for spawing out of place where we hit the surface!
// And spawn a couple of particles
if (hitParticles)
{
hitParticles.transform.position = hit.point;
hitParticles.transform.rotation =
Quaternion.FromToRotation(Vector3.up, hit.normal);
hitParticles.Emit();
}
// Send a damage message to the hit object
hit.collider.SendMessageUpwards("ApplyDamage", damage,
SendMessageOptions.DontRequireReceiver);
}
bulletsLeft--;
// Register that we shot this frame,
// so that the LateUpdate function enabled the muzzleflash renderer for one frame
m_LastFrameShot = Time.frameCount;
enabled = true;
// Reload gun in reload Time
if (bulletsLeft == 0)
Reload();
}
function Reload () {
// Wait for reload time first - then add more bullets!
yield WaitForSeconds(reloadTime);
// We have a clip left reload
if (clips > 0)
{
clips--;
bulletsLeft = bulletsPerClip;
}
}
function GetBulletsLeft () {
return bulletsLeft;
}
[Edit by Berenger : If you want people to help you, try to format your code properly so the error will be easily visible. Removing the irrelevant parts will help to.]
Thanks for the advice on posting questions!@Berenger appreciated
Answer by bubblegumsoldier · Jun 13, 2012 at 10:28 PM
I would guess that this script is launched by another script only when pressing the fire button...
Please watch for another script...
Otherwise you could create a new script called ShowGUI.js:
var bulletsLeft :int; var clips :int; var script :m16; //the type is the name of your script //just attach your code there in the inspector
function Update(){ bulletsLeft = script.bulletsLeft; //it was called like this wasn't it? clips = script.clips; }
function OnGUI(){ GUI.Label (Rect (560, 500, 100, 30),"AMMO: " + bulletsLeft); GUI.Label (Rect (630, 500, 100, 30),"CLIPS: " + clips); }
and in your code - just delete the OnGUI function - Don't forget to attach your script to the new scripts' variable 'script'
Hope I could help ;D
@bubblegum soldier, i am trying to display the active weapon's stats. i may have to redo the entire chain as you indicated. It might not be far off either if i can find how to call active weapon only and display. In an other weapon script. hmmm Perhaps if i can attached multiple scripts to ShowGUI. Not sure yet
Your answer
![](https://koobas.hobune.stream/wayback/20220613072727im_/https://answers.unity.com/themes/thub/images/avi.jpg)