Jump to content
Unity Insider Forum

RPG Basics - Abilities - Teil 2


AgentCodeMonk

Recommended Posts

Hallo zusammen!

 

Weiter geht es mit dem AbilitySystem. Wir nehmen ein paar kleinere Änderungen vor, die uns das Leben als Spieleentwickler erleichtern werden. Da ich in Teil 1 bereits erwÄhnt habe, dass wir unsere Abilities überarbeiten werden und auf eine andere Art und Weise laden.

Die Variante, die mir persönlich am meisten zusagt, ist die der ScriptableObjects.

 

Was genau das ist kann man hier im Forum in diversen Tutorials erfahren, zB. hier! Daher will ich uns nicht lÄnger damit aufhalten ScriptableObjects zu erklÄren, sondern wie wir sie in der Praxis für unsere Abilities nutzen. Diejenigen, die ScriptableObjects bereits kennen werden eine Ahnung haben was nun passieren wird;)

 

Zuersteinmal verÄndern wir unsere Ability Klasse geringfügig:

 

using UnityEngine;
[system.Serializable]
public class Ability : ScriptableObject
{
public Ability(string _n, float _dn)
{
	this._name = _n;
	this._damageModifier = _dn;
}
public string _name = "Attack";
public int _cost = 0;
public float _coolDown = 1.5f;
public float _coolDownTimer = 0f;
public float _damageModifier = 1f;
//... type, icon, class etc
}

 

Wichtig ist, dass wir die UnityEngine Bibliothek einbinden, sonst wirds nichts mit dem ScriptableObject. Außerdem erbt Ability jetzt von ScriptableObject. Auch das ist wichtig.

Außerdem ist die Klasse nun serialisierbar... auch hier: was genau das bedeutet ist bereits in Tutorials abgedeckt. Siehe hier!

 

Die Idee ist nun folgende: ScriptableObjects lassen sich im Projekt als Assets ablegen, Ähnlich wie Prefabs. Dies ermöglicht uns einfach den Unity DragnDrop Workflow beizubehalten um so die Assets zu kopieren und zu verÄndern. Damit lassen sich in kürzester Zeit x Abilities erstellen, ganz ohne dass wir jedes mal eine neue Klasse anlegen müssen etc. Die Designer werden sich freuen!

 

Wie erstellt man nun dieses Asset? Auch dazu gibts ausführlicheres im Forum (Siehe Link oben) und ich spare mir die Details. Wir benötigen auch nur ein kleines Script, das alles weitere über die Hierachy gemacht werden kann ohne einen großen Manager zu erstellen etc. Für den Anfang reicht das auch.

 

 

Das Script:

 

using UnityEngine;
using System.Collections;
using UnityEditor;
public class CreateScriptableObjects
{
static string _path = "Assets/Abilities/Resources/";
static string _file = "Ability";
[MenuItem("RPG Generator/Create/Ability")]
public static void CreateAbility()
{
	ScriptableObject asset = ScriptableObject.CreateInstance(typeof(Ability));
	AssetDatabase.CreateAsset(asset, _path + _file + ".asset");
	EditorUtility.FocusProjectWindow();
	Selection.activeObject = asset;
}
}

 

ACHTUNG: die Ordnerhierachie müsst ihr schnell selber erstellen UND dieses Script muss in einen Ordner namens Editor! Also den auch noch schnell erstellen.

Im Menu erscheint nun ein weiterer Punkt, unter dem ihr Create/Ability findet.

Ist die Ordnerstruktur korrekt, sprich der Pfad zum Zielordner, könnt ihr nun per Klick ein Asset erstellen. Dieses Asset kann nun umbenannt werden.

Nennen wir es wieder "Mortal Strike" und wie ihr schon seht lassen sich diverse Variablen per Inspector einstellen.

_name : Mortal Strike

_coolDown : 1,3

_damageModifier : 1,5

 

Danach gibts Copypasta - einfach das Asset anklicken und Strg + D .

Jetzt noch umbennen, einstellen:

_name : Heroic Strike

_coolDown : 3.0

_damageModifier : 2,2

 

Wir haben nun 2 Abilities und auf diese Weise noch x Andere machen! Schnell und einfach.

 

Was wir nun noch machen müssen: Abilities laden und zwar nur anhand (ich erwÄhnte es eingangs) an ihrem Namen!

 

Dafür gehen wir wieder in die Player.cs und modifizieren 2 Dinge:

 

public Ability[] _abilityInit; // zu den variable packen
// dieses Array nutzen wir nur zur Initialisierung, da wir spÄter mit Instanzen und und nicht mit den Orginalen arbeiten wollen
void Start()
{
   foreach (Ability _a in _abilityInit)
	{
		AddAbility(_a._name);
	}
}

 

und folgendes

void AddAbility(string _abilityName)
{
	Ability _ability = UnityEngine.Object.Instantiate((Ability)Resources.Load(_abilityName, typeof(Ability))) as Ability;
	ABILITIES.Add(_ability._name, _ability);
}

:

 

Jetzt noch die Abilities im Inspector ins abilityInit ziehen.

 

Tada!

 

Weiter geht´s im nÄchsten Teil!

 

Dropbox Link

bearbeitet von AgentCodeMonkey
Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 7 years later...
Am 1.8.2020 um 04:54 schrieb donny:

Ist es möglich, dass jemand diese Zeile erklärt?


Ability _ability = UnityEngine.Object.Instantiate((Ability)Resources.Load(_abilityName, typeof(Ability))) as Ability;

Finde es schade, dass man auf alles genau eingeht und dann so eine Monsterzeile einfach unkommentiert lässt.

Hab mir nicht alles im Detail angeschaut, aber was er hier macht ist, er erzeugt eine Instanz aus dem Ability-Asset (ScriptableObject) mit dem Namen "_abilityName" und läd das Asset dabei über Resources.Load. Danach packt er diese Ability zu den verfügbaren Abilities des Spielers.

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 9 months later...

...oh sh*t, ich gucke hier mal rein, sehe die Überschrift und denke: das kommt mir doch bekannt vor... oooohhhhhh.... was habe ich da verbrochen 😄
Ja, krumm beschreibt es ganz gut. Code smell incoming! Das kann ja kein Mensch mehr lesen... ich verweise hier mal auf das Jahr: 2012...
...und neeeee... der "Resources"-Ordner für mich bei solchen Sachen so ziemlich gestorben. ...kann mal jemand den Kram als depracted marken? ;)
Die Abilities als SO´s würde ich jederzeit wieder machen, aber nicht im Resources-Ordner -> AssetBundles sind da mittlerweile eher meine Wahl...

Link zu diesem Kommentar
Auf anderen Seiten teilen

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Lädt...
×
×
  • Neu erstellen...