AutoSort

Tijdens Project EYA moest ik een game maken over iets wat mij fascineerde. Mijn fascinatie ligt bij Automatisering. Het maken van een complexe fabriek en het dan automatisch zien gaan is een heel goed gevoel. De game heeft 3 tutorial levels en 3 regulieren. Ik had niet meer tijd voor levels. Het doel van de game is om in een fabriekshal connecties te maken. Dus de rode doos moet naar de rode vrachtwagen. In de game zijn verschillende machines om te gebruiken. Het doel is om zo goedkoop mogelijk het level te halen.


Project Info:

Solo Project
Project tijd: HKU Jaar 1 Periode 3-4 (2024)
Engine: Unity
Code Languages: C#
Design Patterns: Observer, Singleton & FlyWeight

Alle machines zitten aan een beltsystem vast. De beltpaths worden van achter naar voren geupdate. Dit zodat items achter elkaar bewegen en niet constant een gat maken. Beltpaths kunnen gesplitst worden en gemerged worden. Als meerdere beltpaths naar elkaar verwijzen (en deze zijn niet gemerged) wordt er door de game geprobeerd om goede voorrang te verlenen, zodat de movement op de beltpaths nog steeds smooth is. De game heeft de volgende machines: Belt, Launcher, Pusher, Side Sorter. (Als ik meer tijd had had ik hanging belts gemaakt.)

Dit is hoe het BeltSysteem er in de editor uit ziet. Door de visualisatie is het makkelijk om te zien hoe belts aan elkaar vast zitten.


    public void MergeBelts(BeltPath mainBelt, BeltPath beltToAdd)
    {
        for (int i = 0; i < beltToAdd.GetBelts().Count; i++)
        {
            BaseMachine belt = beltToAdd.GetBelts()[i];
            belt.SetBeltPath(mainBelt);
            mainBelt.AddBelt(belt);
        }

        beltPaths.Remove(beltToAdd);
    }

    public void UnMergeBelts(BeltPath mainBelt, BaseMachine removedBelt)
    {
        int indexBelt = mainBelt.GetBelts().IndexOf(removedBelt);
        if (indexBelt == mainBelt.GetBelts().Count - 1 || indexBelt == 0)
        {
            mainBelt.RemoveBelt(removedBelt);

            if (mainBelt.GetBelts().Count == 0)
            {
                beltPaths.Remove(mainBelt);
            }
        }
        else
        {
            BeltPath newPath = new BeltPath();

            for (int i = mainBelt.GetBelts().Count - 1; i >= indexBelt + 1; i--)
            {
                BaseMachine belt = mainBelt.GetBelts()[i];
                newPath.AddBeltInFront(belt);
                belt.SetBeltPath(newPath);
                mainBelt.RemoveBelt(belt);
            }

            mainBelt.RemoveBelt(removedBelt);
        }
    }

Merge belts en Unmerge belts

Het tutorialsysteem van de game is een best uitgebreid systeem (al zeg ik hetzelf). Hij maakt gebruik van een list waar allerlei verschillende classes in kunnen (Met dank aan Valentijn). Ik wou een tutorial system in de game, maar ik wou niet de tutorial hardcoden. Ik had online gezocht naar informatie, maar ik kwam alleen maar unity tutorials of hardcoded voorbeelden tegen. Het tutorial system heeft verschillende actions die je kan toevoegen. Deze acties kan je dan ook instellen. In totaal 9 acties. Verschillende dingen worden dus gevolgd door de acties. Deze worden aangestuurd vanuit de EventManager. Zo kan je de placement objecten ophalen, UI pressed events ophalen en interacties volgen.

Verschillende turorial acties

    private void NextStep()
    {
        if (tutorialIndex >= 0) tutorialInfo.list[tutorialIndex].DisableAction();
        tutorialIndex++;

        if (tutorialIndex >= tutorialInfo.list.Count)
        {
            tutorialIndex = 0;
            tutorialWindow.SetActive(false);
            tutorialRunning = false;
            return;
        }

        tutorialInfo.list[tutorialIndex].SetupAction();
        UpdateProgressText(0);

        tutorialWindow.SetActive(true);
        tutorialRunning = true;
    }

//Base action class
public abstract class TutorialAction 
{
    [HideInInspector] public string actionName;
    [SerializeField, TextArea(1, 20)] private string tutorialText;

    public string GetMessage() => tutorialText;

    public abstract void SetupAction();
    public abstract bool ValidateAction();
    public abstract void DisableAction();
}

Tutorial NextStep functie waarin de volgende tutorial stap wordt gedaan en Action baseclass. (Als ik het nu zou doen zou ik een callback doen als de actie een update krijgt I.P.V. checken vanuit de manager.)