Do you like my tutorials?

Then consider supporting me on Ko-fi

Talking about Spring Ninja game, C#, Game development and Unity3D.

Here we go with the second step of the Spring Ninja prototype made with Unity.

This is what we are going to get at the end of the post:

You know how play: press and hold the mouse to charge, release to jump. The game is an endless runner so you will always find plenty of poles where to jump on.

You don’t need to add or edit any prefab to the project you created in the first step, but to improve gameplay is highly recommended you check “Fixed Angle” in the Rigidbody 2D inspector to keep your “ninja” in a fixed angle and prevent it to fall down too often.

Then here are the four scripts, with new/modified lines highlighted: MainScript:

using UnityEngine;
using System.Collections;

public class MainScript : MonoBehaviour {

	// all these variables will be declared in the inspector
	public GameObject ninjaObject; // the ninja prefab	
	public GameObject poleObject; // the pole prefab
	public GameObject powerBarObject; // the pole bar prefab
	public float jumpForce; // jump force - vertical only
	public float maxJumpForce; // maximum vertical jump force
	private bool isCharging = false; // is the ninja charging the jump?
	private float minPoleGap = 1.5f; // min distance between two poles
	private float maxPoleGap = 2.5f; // max distance between two poles 

	// function executed when the script is launched
	void Start () {
		// placing the ninja prefab on the stage
		Instantiate(ninjaObject);
		// placing the pole prefabs on the stage
		placePole (-2.5f);
	}

	void placePole(float posX){
		// if the pole is not too far, then place it
		if(posX<10f){
			// adding the prefab to the stage
			Instantiate(poleObject);
			// position the pole prefab
			poleObject.transform.position = new Vector2(posX,-1.5f-Random.value*2.5f);
			// determining next pole position
			posX += minPoleGap+Random.value*(maxPoleGap-minPoleGap);
			// try to place another pole
			placePole (posX);
		}
	}

	// function executed at each frame
	void Update () {
		// mouse button down and ninja is not charging and not jumping/falling - that is its y velocity is zero?
		if (Input.GetButtonDown("Fire1") && GameObject.FindWithTag("Player").GetComponent<Rigidbody2D>().velocity.y==0 && !isCharging) {
			// let's place the power bar on the stage
			GameObject powerBar = Instantiate(powerBarObject) as GameObject;
			// now the player is charging
			isCharging = true;
			// once the player is charging, check if there's enough poles
			GameObject[] poles = GameObject.FindGameObjectsWithTag("Pole");
			float maxPoleDistance = 0;
			foreach (GameObject pole in poles){
				// looking for the rightmost pole
				maxPoleDistance = Mathf.Max(maxPoleDistance,pole.transform.position.x);
			}
			// if the rightmost pole is not too far, try to place another pole.
			if(maxPoleDistance<10f){
				placePole (maxPoleDistance+minPoleGap+Random.value*(maxPoleGap-minPoleGap));
			}
		}
		// mouse button released and the ninja is charging but not jumping/falling - that is its y velocity is zero?
		if (Input.GetButtonUp("Fire1") && GameObject.FindWithTag("Player").GetComponent<Rigidbody2D>().velocity.y==0 && isCharging) {
			// player is no longer charging
			isCharging = false;
			// get the game object tagged as "Power"
			GameObject powerObject = GameObject.FindWithTag("Power");
			// inside the object tagged as "Power", get PowerScript script
			PowerScript script = powerObject.GetComponent("PowerScript") as PowerScript;
			// destoy the power bar
			Destroy(GameObject.FindWithTag("Power"));
			// find the object tagged as "Player" and send "Jump" message, with the proper force
			GameObject.FindWithTag("Player").SendMessage("Jump",maxJumpForce*script.chargePower+50);
		}
	}

}

PoleScript:

using UnityEngine;
using System.Collections;

public class PoleScript : MonoBehaviour {
	
	void Start () {
		// tagging the object as Pole
		gameObject.tag = "Pole";
	}

	void Update(){
		// getting the real position, in pixels, of the pole on the stage
		Vector2 stagePos = Camera.main.WorldToScreenPoint(transform.position);
		// if the pole leaves the stage...
		if (stagePos.x < -20){
			Destroy(gameObject);
		}
	}

	void scroll(){
		// assigning pole an horizontal speed
		GetComponent<Rigidbody2D>().velocity = new Vector2(-3f, 0f);
	}

	void stop(){
		// assigning pole an horizontal speed
		GetComponent<Rigidbody2D>().velocity = new Vector2(0f, 0f);
	}
}

PowerScript:

using UnityEngine;
using System.Collections;

public class PowerScript : MonoBehaviour {

	public float chargePower = 0;

	void Start () {
		// tagging the object as "Power"
		tag = "Power";
		// horizontally scaling the object to zero
		transform.localScale = new Vector2(0f,1f);
	}

	void Update () {
		// adding chargePower the elapsed time until it reaches 1
		chargePower = Mathf.Min(chargePower+Time.deltaTime,1f);
		// setting local scale accordingly
		transform.localScale = new Vector2(chargePower,1f);
		// finally updating its position to give the feeling it's growing from left to right
		transform.position = new Vector2(-3.0f+chargePower/2, 2.15f);
	}
}

And finally NinjaScript:

using UnityEngine;
using System.Collections;

public class NinjaScript : MonoBehaviour {

	void Start () {
		// placing the ninja
		transform.position = new Vector2(-2.5f, 2f);
		// tagging it as "Player"
		tag = "Player";
	}

	void Update(){
		// checking if the ninja falls down the stage, in this case restart the game
		Vector2 stagePos = Camera.main.WorldToScreenPoint(transform.position);
		if (stagePos.y < 0){
			Application.LoadLevel(Application.loadedLevel);
		}
		transform.position = new Vector2(-2.5f,transform.position.y);
	}

	void Jump(float jumpForce){
		// adding a vertical force to make the ninja jump
		GetComponent<Rigidbody2D>().AddForce(new Vector2(0f, jumpForce));
		// get all objects tagged with "Pole"
		GameObject[] poles = GameObject.FindGameObjectsWithTag("Pole");
		foreach (GameObject pole in poles){
			// send them all "scroll" message
			pole.SendMessage("scroll");
		}
	}

	void OnCollisionEnter2D(){
		// get all objects tagged with "Pole"
		GameObject[] poles = GameObject.FindGameObjectsWithTag("Pole");
		foreach (GameObject pole in poles){
			// send them all "scroll" message
			pole.SendMessage("stop");
		}
	}
}

And our Spring Ninja prototype made with Unity is completed. Download the source code of the entire project.

Never miss an update! Subscribe, and I will bother you by email only when a new game or full source code comes out.