Jump to content
Unity Insider Forum
Sign in to follow this  
AgentCodeMonkey

RPG Basics - Abilities - Teil 2

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

Edited by AgentCodeMonkey
  • Like 2

Share this post


Link to post
Share on other sites

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.

Share this post


Link to post
Share on other sites
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.

Share this post


Link to post
Share on other sites

Das ist aber auch mächtig krummer Code, das hier wäre äquivalent:

var _ability = UnityEngine.Object.Instantiate(Resources.Load<Ability>(_abilityName));

Aber ansonsten so wie beschrieben: Ein Ability-Objekt wird aus den Resources geladen und dann geklont.

Share this post


Link to post
Share on other sites

Join the conversation

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

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

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

Loading...
Sign in to follow this  

×
×
  • Create New...