“Agile” : my first Unity3D mini game

Here is a first mini game I developed using Unity3D during the past few days.
It’s pretty much a mix between a FPS and a platformer game.
The 2 first levels are more tutorials than real challenges but you’ll have to be “Agile” to achieve a good score on level 3! ^^

Don’t expect too much visually, as I only used basic primitives for level design.
You can try the Web Player version (130 Ko) here.
Can’t wait for your feedbacks!

not bad for your first one, although i dont like level three

Nice start! I enjoyed the gameplay…it reminded me of Mirror’s Edge quite a bit. I can see how there could be a lot of potential in the type of puzzles you create. The graphics aren’t too bad for how basic they are…fits the style. But yeah, I like it, considering I really enjoy Mirror’s Edge, Portal, etc…those type of games.

Seriously good. I loved how responsive the controls were but I’m of the opinion a First Person view is just madness for a platformer. Took a second before I realised the directional input affects wall jump strength, might be worth adding another GUI text in to explain it, once I discovered that I got a final time of 1127.

Really good test demo, can’t wait to see more.

very nice, lvl 3… eh work on level design now.

Thanks guys for those first feedbacks! Didn’t expect it to be so quick :-o

Thanks! Could you be more specific about the things you didn’t like in level3?
Did you find it too difficult at this stage of the game?
I’m quit sure the “Now tricky!” part must be pretty discouraging for a first playthrough… :roll:

Thanks for your support!
The" jumpable walls" idea came more from War§ow than Mirror’s Edge but I must admit the analogy crossed my mind during “game design” :smile:
About portal analogy, I started testing a feature where player could make pop new walls from projectiles (“DBZ capsule” like system) but the feeling was not so good, I’ve chosen not to show it in the first version… maybe later if I manage to make it feel right.

Thanks also and GG for your score! :smile:
I think I’ll stick to the FPS view for now as I don’t have any reliable asset for a 3rd person version…
But I totally agree it’s an hardcore way of playing.

You’re definitely right concerning the wall jump explanation, I’m missing something to introduce it to the player.
Maybe GUI text is not enough (even if I think it’s working pretty well for the other features)…
The main idea is to jump toward wall, change look direction to where you want to go and then jump again.
The look direction before second jump is very important and I don’t think it’s clear enough.
Will work on that point before everything else.

Thanks! This was really just a rough level design to test the game mechanism, I’ll try to do something solid in next version.

Keep you posted!..

Nice start!

The only part I felt frustrating was the “Now Tricky!” part. I was in a good flow all the game, until I reach that part.
I got stuck and frustrated for a minute trying to walljump those 2 walls. I succeeded after that, but in this area you require a player’s skill that wasn’t required before. I felt this tutorial part too extreme, since it’s an Agile game and I think you usually don’t want players to get stuck for a while. Maybe lowering the upper platform a bit is enough to teach the player that new move and then you can require walljumps to higher platforms.

Got it, the tricky part is definitely too tricky XD

Just as i was about to beat lvl 3 i jumped so high that i fell off the level…

ah my high score was 69… hahah :stuck_out_tongue:

Btw, a suggestion for harder levels, moving walls!

Very fun game indeed.

But i found it annoying sometimes too.

A third person with a smart camera (like, when walljumping, the camera goes to a good static angle, or something) would help a lot. In first person i often had to watch the floor so i knew where to jump, if i watched the next platform i often pressed jump too late or early. But if i watch floor i cant see where i have to land :stuck_out_tongue:

Also walljumping is better if i jump sideways, but that way sometimes i jump one more because i cant seee where to stop, and with no wall to support my jump good, i fall back between the two wall.

Maybe it would be too easy, but it would be good if i could use the arrows, when i’m in air. :stuck_out_tongue: and, jump once even if i am not collideing with anything. Like, a timer for it: if i collided with wall in the last .5 sec and i didnt jump in .5 sec, i can jump. Or something like that.

I liked it, though perhaps you should add some checkpoints.

My Final Score was 0.

Reminds me of an old learning project that I made. If you want some of my prefabs, Ill gladly post a package.

I only managed to get a score of 63. Maybe a better score next time.
The now tricky part is challenging. I can get it done but I am not sure if I am doing it correctly.

A shadow for the player and end caps for the platforms could help with timing jumps and running of platforms.

To go with the checkpoints should be a rescue button that repositions the player at the last reached checkpoint or maybe the last collected orb.

I like the moving walls suggestion. I could picture a cool level where there are two parallel small walls that the player has to wall jump off of repeatedly while they are travelling up. (I am picturing two elevators side by side in a shaft moving up)

You could also try adding some wall running into it. The “Tricky” level I thought was nice. The first tricky wall took me a few seconds to realize how to use, it was a nice challenge.

Here is a new version of the game including several new levels and some improves/fixes on existing ones.

I don’t think I will continue developing it as I have other projects in mind now and that was just a first try anyway.

If anyone wants to give it a try or just have a look at the code behind it, I’ll be glad to share it :wink:

Hey, again, nice game. If you don’t mind, how did you get the player to rebound off of the walls?
Do you mind if I look at the code behind that action?

Id be interested in the code behind it as well GFX47…

Here is the most important part of the code, handling player controls:

#pragma strict

public var walkMoveSpeed : float = 5.0;
public var runMoveSpeed : float = 10.0;
public var jumpSpeed : float = 8.0;
public var rebound : float = 10.0;
public var airGravity : float = 20.0;
public var wallGravity : float = 20.0;
public var maxLateralSpeed : float = 15.0;

public var jumpSound : AudioClip;

private var moveDirection = Vector3.zero;
private var grounded : boolean = false;
private var walled : boolean = false;
private var lastCollisionNormal : Vector3 = Vector3.zero;
private var jump : boolean = false;

function Update()
{
	// Jump button detection
	if (Input.GetButtonDown("Jump"))
		jump = true;
}
	
function FixedUpdate()
{
	// Move
	if (grounded || (jump  walled))
	{
		// We are grounded, so recalculate movedirection directly from axes
		moveDirection.y = 0;
		moveDirection.x = Input.GetAxis("Horizontal");
		moveDirection.z = Input.GetAxis("Vertical");
		
		// Avoids speedy diagonals
		moveDirection = moveDirection.normalized * Mathf.Max(Mathf.Abs(moveDirection.x), Mathf.Abs(moveDirection.z));

		// Move speed
		moveDirection *= Input.GetButton("Run") ? runMoveSpeed : walkMoveSpeed;

		// Local to global direction
		moveDirection = transform.TransformDirection(moveDirection);
	}

	// Jump
	if (jump  (grounded || walled))
	{
		// Vertical jump
		moveDirection.y = jumpSpeed;

		// Plays jump sound
		audio.pitch = Random.Range(0.9, 1.1);
		audio.PlayOneShot(jumpSound);

		// Rebound
		if (walled  !grounded)
			moveDirection += rebound * lastCollisionNormal;
	}

	// Apply gravity
	moveDirection.y -= (walled ? wallGravity : airGravity) * Time.deltaTime;
	
	// Max lateral speed
	var lateralMove : Vector3 = Vector3(moveDirection.x, 0, moveDirection.z);
	if (lateralMove.magnitude > maxLateralSpeed)
	{
		//Debug.Log(moveDirection.magnitude);
		lateralMove = lateralMove.normalized * maxLateralSpeed;
		moveDirection.x = lateralMove.x;
		moveDirection.z = lateralMove.z;
	}
	
	// Move the controller
	var controller : CharacterController = GetComponent(CharacterController) as CharacterController;
	var flags : CollisionFlags = controller.Move(moveDirection * Time.deltaTime);

	// Grounded / walled?
	grounded = (flags  CollisionFlags.Below) != 0;
	walled = (flags  CollisionFlags.Sides) != 0;

	// Resets jump indicator
	if (jump)
		jump = false;
}

function OnControllerColliderHit(hit : ControllerColliderHit)
{
	lastCollisionNormal = hit.normal;
}

@script RequireComponent(CharacterController)

Did it help guys?