Worms Style Power Bar
Following on from the Football kick power bar example, I was asked by reader Adam to provide an example that shows off shooting by charging up power rather than timing, so I present this example script for your perusal! as usual throw me any questions you may have about it. To make things simpler, i’ve also uploaded the script here as some lines are too wide to fit this site’s column effectively- http://www.pasteit4me.com/2050001
Video Explanation
-
-
//set the maximum width of the bar to be used for the maths function below
-
var fullWidth : float = 256;
-
-
//create a private variable (not shown in inspector) to store the current set power
-
private var thePower : float;
-
-
//create a boolean flag we can use to stop and start the addition to power
-
var increasing : boolean = false;
-
-
//create a boolean flag we can use to stop the player shooting during the shot
-
var shooting : boolean = false;
-
-
//speed to increment the bar
-
var barSpeed : float = 25;
-
-
//create a slot to assign my cannonball prefab to.
-
var ball : Rigidbody;
-
-
//create a blast particle slot to assign particle emitter to
-
var blastPart : ParticleEmitter;
-
-
//create a light slot to assign a light prefab for when the blast occurs
-
var cannonLight : Light;
-
-
//create a slot to assign an empty game object as the point to spawn from
-
var spawnPos : Transform;
-
-
// create a number to multiply the force by as the value of up to 256 may not be enough to
-
// effectively shoot a ball forward
-
var shotForce : float = 5;
-
-
//a prefab of some crates to shoot at
-
var crates : GameObject;
-
-
//audio for the blast
-
var cannonBlast : AudioClip;
-
-
//create a private variable to store currently created stack of crates
-
private var currentCrates : GameObject;
-
-
function Start(){
-
//set the power bar to zero at start
-
guiTexture.pixelInset.width = 0;
-
//create the target crate stack, and set currentCrates variable to represent this stack
-
var someCrates : GameObject = Instantiate(crates, Vector3(10, 15, -8), transform.rotation);
-
currentCrates = someCrates;
-
}
-
-
function Update () {
-
-
//if we are not currently shooting and Jump key is pressed down
-
if(!shooting && Input.GetButtonDown("Jump")){
-
//play the sound set on the audio source
-
audio.Play();
-
//set the increasing part of Update() below to start adding power
-
increasing=true;
-
}
-
-
// detect if Jump key is released and then call the Shoot function, passing current
-
// value of 'thePower' variable into its 'power' argument
-
if(!shooting && Input.GetButtonUp("Jump")){
-
//reset increasing to stop charge of the power bar
-
increasing = false;
-
//call the custom function below with current value of thePower fed to its argument
-
Shoot(thePower);
-
}
-
-
if(increasing){
-
//add to thePower variable using Time.deltaTime multiplied by barSpeed
-
thePower += Time.deltaTime * barSpeed;
-
//stop (or 'fight') thePower from exceeding fullWidth using Clamp
-
thePower = Mathf.Clamp(thePower, 0, fullWidth);
-
-
//set the width of the GUI Texture equal to that power value
-
guiTexture.pixelInset.width = thePower;
-
-
//set the pitch of the audio tone to the power var but step it down with division
-
audio.pitch = thePower/30;
-
}
-
}
-
-
// start the 'Shoot' custom function, and establish a
-
// float argument to recieve 'thePower' when function is called
-
function Shoot(power : float){
-
//stop shooting occuring whilst currently shooting with this boolean flag
-
shooting = true;
-
-
//create a particle burst
-
var pBlast : ParticleEmitter = Instantiate(blastPart, spawnPos.position, spawnPos.rotation);
-
//base blast amount on power argument, and divide it to diminish power
-
pBlast.maxEmission = power/4;
-
-
//create a light to act as a flash for the blast, base its range & intensity
-
//upon the power variable and destroy it after 0.1 seconds
-
var canLight : Light = Instantiate(cannonLight, spawnPos.position, spawnPos.rotation);
-
canLight.intensity = power/7;
-
canLight.range=power/7;
-
Destroy(canLight.gameObject, 0.1);
-
-
//stop the audio source on this object to cut off the tone build up to launch
-
audio.Stop();
-
-
//play the sound of the cannon blast in a new object to avoid interfering
-
//with the current sound assignment and loop setup
-
AudioSource.PlayClipAtPoint(cannonBlast, transform.position);
-
-
//create a ball, assign the newly created ball to a var called pFab
-
var pFab : Rigidbody = Instantiate(ball, spawnPos.position, spawnPos.rotation);
-
-
//find the forward direction of the object assigned to the spawnPos variable
-
var fwd : Vector3 = spawnPos.forward;
-
pFab.AddForce(fwd * power * shotForce);
-
Destroy(pFab.gameObject, 4);
-
-
//pause before resetting everything
-
yield WaitForSeconds(4);
-
-
//reset the bar GUI width and our main power variable
-
guiTexture.pixelInset.width = 0;
-
thePower = 0;
-
-
//destroy the existing crates and spawn a new stack
-
Destroy(currentCrates);
-
var someCrates : GameObject = Instantiate(crates, Vector3(8, 15, -11), transform.rotation);
-
currentCrates = someCrates;
-
-
//allow shooting to occur again
-
shooting = false;
-
}










absolutely amazing! just what i wanted, thank you Will for such a speedy reply and to get a working demo up so soon too. I’m sure many others will find this very easy to understand and helpful as well.
my hats off to you sir!
Adam
Hmm , that sound nearly blasted my ears. It keeps going up and I had my headset on for something that was set to about 10% volume giving this one a big blast. If you don’t want to be deaf. Click the top right button.
P.S. if you keep the shoot key pressed and release after reset you shoot with no power. Might wanna recode that if you copy this for usage.
ahh you got a video up too, great!
Oh and i just wanted to add you are a lucky man to have R-Type arcade machine, 1 of the defining games of my youth.
speaking of retro, wouldn’t it be great to see altered beast done in 3d as a 3rd person multiplayer game, i personally think the concept of your player character metamorph once several power ups are gained would give a good replay factor to gamers.
Anyway thanks again for getting this wealth of info up so soon for us all to learn from.
this code very useful for me!!!
but It’s too difficult to fix.. help me..
I just shoot player_collider(GameObject)
but when play unity,
————————
player_collider(clone)
player_collider(clone)
player_collider(clone)
player_collider(clone)
player_collider(clone)(clone)
player_collider(clone)(clone)
player_collider(clone)(clone)
……
——————————
I dont know what the probelm…
please help me
private var startPlayer : temp; //temp script link
//create a boolean flag we can use to stop the player shooting during the shot
var shooting : boolean = false;
var playerAngle : float = 0; //player Angle Initialization
var playerPower: float = 0; //player Power Initialization
var ShootPower : float = 50; //shoot speed
//create a slot to assign an empty game object as the point to spawn from
var spawnPos : Transform;
var player_collider : Rigidbody ;
startPlayer = FindObjectOfType(temp);
function Update ()
{
shooting = startPlayer.allTemp; //true receive temp
playerAngle = startPlayer.inputAngle; //angle receive temp
playerPower = startPlayer.inputPower; //speed receive temp
if(shooting !=false)
{
Shoot(playerPower);
}
}
function Shoot(power : float){
//stop shooting occuring whilst currently shooting with this boolean flag
shooting = false;
//create a player_collider, assign the newly created ball to a var called pFab
var pFab : Rigidbody = Instantiate(player_collider, spawnPos.position, spawnPos.rotation);
//find the forward direction of the object assigned to the spawnPos variable
var fwd : Vector3 = spawnPos.forward;
pFab.AddForce(fwd * power * ShootPower);
//pause before resetting everything
yield WaitForSeconds(4);
}
Cool nice one buddy , do you mind making all your scripts downloadable like this one ?
nice tutorial , ty !!!
but for Info your example site http://www.pasteit4me.com/2050001 is down.
I wanted to use this worm style power bar in the 3rd challenge.
feel free!