Mijn bijdrage
Player pickup and dropping
In de levels wordt er een cube gebruikt die je kan op pakken en neerleggen zodat je hoger kan komen in sommige gebieden.
Om dit zo goed mogelijk te maken heb ik inspiratie genomen van hoe portals systeem werkt.
Power cables
Een ander deel van de levels zijn de power cables. Die zorgen er voor dat er een extra uitdaging in het spel zit.
In het begin wanneer de power cabels voor het eerst worden ingeladen kijken ze voor endpoints die aanwezig zijn in de childeren.
De Endpoints zijn punten waarbij andere wires kunnen verbinden. Elke keer wanneer een wire van locatie verandert wordt er gecontroleerd of er een verbinden gemaakt kan worden.
Dit wordt gedaan doormiddel van een loop die het de start van de connecties probeerd te vinden door andere connecties.
public bool IsConnectingToSource(Wire wire)
{
Wire current = wire;
for (int i = 0; i < _wires.Count; i++)
{
// check if the current wire is a power source
if (current && current.isPowerSource)
return true;
if (current == null)
break;
// check next cable in the list
current = current._poweredBy;
}
return false;
}
Level transition
Voor een betere flow te gekrijgen heb ik een Level transitie gemaakt.
Dit werkt door eerst een tussen level te laden. Die bevat een Canvas waarin de laad animatie zit.
Game manager
Een van de problemen waar ik vaak last van heb is met Singletons. Vaak omdat de implementatie irritant is om te maken. Daarvoor heb ik een speciale Game manager class gemaakt.
Deze class verzekered dat singletons altijd aanwezig zijn.
private static readonly Type SubManagerType = typeof(ISubManager);
[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSceneLoad)]
static void StartManagement()
{
//create a new game manager
GameObject NewGameManager = new GameObject("GameManager");
NewGameManager.AddComponent();
List CreatedManagers = new List();
//filter types on who are composite of ISubManager
Type[] AssemblyTypes = Assembly.GetExecutingAssembly().GetTypes();
IEnumerable
ManagerTypes = AssemblyTypes.Where(e => IsSubmanager(SubManagerType, e));
//loop through each manager
foreach (var ManagerType in ManagerTypes)
{
//create new object with sub manager on it
GameObject ManagerGameObject = new GameObject(ManagerType.Name);
var submanager = (ISubManager)ManagerGameObject.AddComponent(ManagerType);
ManagerGameObject.transform.SetParent(NewGameManager.transform);
//first initialization round
submanager.Initialize();
CreatedManagers.Add(submanager);
}
//second initialization round
CreatedManagers.ForEach(e => e.AfterInitialize());
}