If you have been following my previous two posts about reflecting and refracting a laser beam in unity. You must have been wondering, how will the player win the game. What is the challenge. Well, this game is supposed to be a dynamic puzzle game, where the player(s) should use all available resources in the level (Mirrors and Lenses) to make the laser hit a target object. The condition here is that ALL objects in the scene must be used. In this article as well I will talk about randomizing the position of the laser and target every time the level starts
Lets break down the first problem:
- We need to have a game object in the scene that is marked as a target with a box collider.
- When the laser beam collides with either a mirror or a lens, we need to add the game object’s instance ID into a dictionary. The reason I am using a dictionary is because I want to make sure that every object is added only once (laser may hit the same object twice).
- If the laser beam collides with an object marked as “Target” then we need to start checking whether the player won or not.
- To check whether the player has won or not, a Game Manager object needs to know how many usable objects are in the scene (Mirrors and Lenses) and compare it with the count of objects added to the dictionary. If they are equal, then the player wins. If not, the game continues!
Coding the solution is also straight forward. First I declared the dictionary as follows:
In the CheckHit() function, I did two things:
- Added the Mirror of laser to the dictionary when the laser collides with it
- Added a condition to check for a win when the laser hits an object tagged as Target
As you can see in figure 2, the CheckWin() function is called from the GameManager Object and passed the number of objects added to the dictionary. The game manager then will compare that number with the total number of objects in the scene and declare a win if the number of objects is equal to the number of used objects in the scene.
With that done, the player will be able to have a challenge to win the level. However, so far the game is pretty static, the laser is always located at the same place, so does the target. How about randomizing the position in which the laser and the target are spawned so we can make the game a bit more dynamic and interesting?
This problem is easy to solve. What I did is that I created multiple empty GameObjects in the level:
Then I assign all those locations into an array of Transforms in the GameManager Object:
When the GameManager object starts, I randomly pick two different positions from the array and insatiate both the laser and target prefab into those positions.
As you can see from figure 6, I am getting two random positions from the array for the laser and the target. The reason why I have a while loop in the functions is to make sure that both location are not the same. When this is done, I insatiate both objects to the transforms and child them to the transforms in order to align them to their rotation as well.
With that, we have a functioning game that changes every time the level starts.