This tutorial is outdated, you can find the latest version here: GitHub
The subclass sandbox pattern describes a basic idea, while not having a lot of detailed mechanics. You will need the pattern when you have several similar subclasses. If you have to make a tiny change, then change the base class, while all subclasses shouldn't have to be touched. So the base class has to be able to provide all of the operations a derived class needs to perform.
We will here use the same code as in the book, but translated to C#. You will just need two scripts: a GameController and a Superpower script, which will include several classes. In your final game you should probably have one class per script, but we will here save space!
This is the GameController class:
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
namespace SubclassSandbox
{
public class GameController : MonoBehaviour
{
//A list that will store all superpowers
List<Superpower> superPowers = new List<Superpower>();
void Start()
{
superPowers.Add(new SkyLaunch());
superPowers.Add(new GroundDive());
}
void Update()
{
//Activate each superpower each update
for (int i = 0; i < superPowers.Count; i++) { superPowers[i].Activate(); } } } }
And these are the Superpower classes
using UnityEngine;
using System.Collections;
using System;
namespace SubclassSandbox
{
//This is the base class
public abstract class Superpower
{
//This is the sandbox method that a subclass has to have its own version of
public abstract void Activate();
//All of the operations a derived class needs to perform - called from Activate()
protected void Move(float speed)
{
Debug.Log("Moving with speed " + speed);
}
protected void PlaySound(string coolSound)
{
Debug.Log("Playing sound " + coolSound);
}
protected void SpawnParticles()
{
}
}
//Subclasses
public class SkyLaunch : Superpower
{
//Has to have its own version of Activate()
public override void Activate()
{
//Add operations this class has to perform
Move(10f);
PlaySound("SkyLaunch");
SpawnParticles();
}
}
public class GroundDive : Superpower
{
//Has to have its own version of Activate()
public override void Activate()
{
//Add operations this class has to perform
Move(15f);
PlaySound("GroundDive");
SpawnParticles();
}
}
}
If you add the GameController script to an empty gameobject in Unity and press play, you will see nothing exciting except a few lines in the console window. But as said before, this design pattern describes a basic idea.