In Week 7, I started looking for an example of an enemy script. I struggled a little on what to search for. Luckily, our Lecturer suggested a couple of phrases for me to try out. In his second suggested search, I found an ideal enemy tutorial:
Figure 1: Unity simple 2D Enemy AI Follow Tutorial (MoreBBlakeyyy 2022)
It took a while to get working, but eventually the enemies were moving towards the player, just like in the tutorial. It was then a case of implementing my idea of having different speeds for different colours. I was surprised at quickly I got this to work; due to the script being attached to each enemy, all I had to do was find the colour of the enemy, and change a single variable in the enemy movement code. The result was that different coloured enemies were moving at different speeds.
Figure 2: Enemies Approaching the Player in my Unity Project.
The hardest thing to do was to actually come up with a tidy calculation that would determine the speed based on the RGB values of the enemy. Fortunately, I found a simple solution. The RGB values had either Green, Red, or Blue set to 1, so all I had to do was a simple scalar product to assign them to the correct speeds. I wasn’t sure what the product would look like, so I did some testing on notepad first.
After some trial and error, I realised [3, 2, 1] worked if I just floored all the RGB values within the colours first.
My colours were [1, 0.25, 0.25], [0.25, 1, 0.25] and [0.25, 0.25, 1] for Red, Green and Blue, respectively.
0.25 floors to 0, and 1 floors to 1, so the resulting vectors are [1,0,0], [0,1,0] and [0,0,1].
For each of the resulting vectors, we then cross-multiply with [3, 2, 1] and sum the results, obtaining 3 for Red, 2 for Green and 1 for Blue. It’s then just a case of pairing the correct speeds with those outputs.
I also made sure the enemy stops moving towards a player that is white.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class EnemyScript : MonoBehaviour
{
// Declare Enemy Physics/Movement Variables
public GameObject Player;
private Color enemyColor;
private float calcColor;
private float runSpeed;
private Dictionary<float, float> enemyID = new Dictionary<float, float>();
private float distance;
private PlayerScript playerScript;
void Start()
{
playerScript = FindObjectOfType<PlayerScript>();
enemyColor = gameObject.GetComponent<SpriteRenderer>().color;
calcColor = 3 * Mathf.Floor(enemyColor.r) + 2 * Mathf.Floor(enemyColor.g) + 1 * Mathf.Floor(enemyColor.b);
enemyID = new Dictionary<float, float>
{
{ 3, 3f },
{ 2, 2f },
{ 1, 4f },
};
enemyID.TryGetValue(calcColor, out runSpeed);
}
void Update()
{
if (playerScript.activeColor != playerScript.colorWhite)
{
distance = Vector2.Distance(transform.position, Player.transform.position);
Vector2 direction = Player.transform.position - transform.position;
transform.position = Vector2.MoveTowards(this.transform.position, Player.transform.position, runSpeed * Time.deltaTime);
}
}
}
Figure 3: Enemy Script
Next, I needed to make a collision event so I could trigger code (such as game over) when the player and enemy collide. I found it quite difficult to get it working. I needed to add colliders to both players and enemies, and add OnCollisionEnter2D(Collision2D collision) events. I added them in both player and enemy scripts. It still wouldn’t work.
void OnCollisionEnter2D(Collision2D collision)
{
if (collision.gameObject.CompareTag("Enemy"))
{
// Game Over Event
gameObject.SetActive(false);
FindObjectOfType<GameManager>().GameOver();
}
}
Figure 4: On Collision Event triggering Game Over.
One issue was I forgot the 2D part in the event, but the other thing was collision layers, which I eventually learned after googling. I found the Unity documentation on the subject; and then made sure the enemies were assigned with the enemy layer, and the player was assigned to the player layer.

Figure 4: Collision Layers
I made another layer for when it was white, which would not collide with the enemy, and adapted the player colour switching code to take that into account.
Figure 5: Collision with the Enemy triggering Game Over in my Unity Project.
Next week, I will look at implementing teleporting and conditionally moving through walls.