Difference between revisions of "Creating A New Consequence"

From RPG Creation Kit
Jump to navigation Jump to search
(Created page with "Consequences are one of the many useful elements of the RPG Creation Kit, although everything (and more) that can be done with consequence can be done with [https://silvematt.com/URPGCreationKitDocumentation/index.php/Scripting Scripting] as well, Consequences represents a useful alternative to do rapidly build and test some things. There are many built-in useful consequences, but you may need your own, in this article we're going to see how we can create a new Conseque...")
 
Line 3: Line 3:
There are many built-in useful consequences, but you may need your own, in this article we're going to see how we can create a new Consequence that will allow us to spawn an Item In World at certain coordinates, having this new consequence callable from any elements the [https://silvematt.com/URPGCreationKitDocumentation/index.php/Events_And_Consequences Events & Consequences] support.
There are many built-in useful consequences, but you may need your own, in this article we're going to see how we can create a new Consequence that will allow us to spawn an Item In World at certain coordinates, having this new consequence callable from any elements the [https://silvematt.com/URPGCreationKitDocumentation/index.php/Events_And_Consequences Events & Consequences] support.


Just a note, setting up a new consequence is not trivial nor hard, but you should think twice before doing that, Consequences are for very general calls or functions that you should be sure will be called extensively and with many different parameters (like the "Alert Message" consequence), if you want to make a functionality that is probably going to be called just once, you should make a [https://silvematt.com/URPGCreationKitDocumentation/index.php/Scripting Script] for that.
Just a note, setting up a new consequence is not trivial nor hard, but you should think twice before doing that, Consequences are for very general calls or functions that you should be sure will be called extensively and with many different parameters (like the "Alert Message" consequence), if you want to make a functionality that is probably going to be called just once or a bunch of times, you should make a [https://silvematt.com/URPGCreationKitDocumentation/index.php/Scripting Script] for that, as it is '''way''' easier to make and setup than a consequence is.
==Editing Consequence.cs==
==Defining the New Consequence==
The first thing to do is to define the new Consequence, we have to do that in the "'''Consequence.cs'''" script.
The first thing to do is to define the new Consequence, we have to do that in the "'''Consequence.cs'''" script.


Line 23: Line 23:
You may have noticed inside this class that all the data you're prompted to set when configuring consequences is declared here, you may also have noticed that there are already definitions for types '''Item''' and '''Vector3''', and we've essentially added something that was already there, but with a different name.
You may have noticed inside this class that all the data you're prompted to set when configuring consequences is declared here, you may also have noticed that there are already definitions for types '''Item''' and '''Vector3''', and we've essentially added something that was already there, but with a different name.


I want to make a note here, if some property with of a type is already defined in the Consequence class, and you need that type for your new consequence data, '''you should probably use the existing one instead of creating a new property.''' This is because in C# unassigned properties still takes memory when an instance of a Class is created, and you could easily bloat the Consequence class if you decide to create a lot of new consequences. For example, I could have used the already defined: '''''public Vector3 coordinates''''' and '''''public Item itemInInventory''''' and spared few bytes. In that case, I would only have had to create an extra Vector3 for the rotation. However, this should not be an issue until it becomes an issue, if you add your new fields for each consequence you are going to make you'd probably be fine, still, it was worth mentioning that as I also did that for some of the built-in consequences. For this article, I'm going to keep things as they are and keep the new properties we've just added.
I want to make a note here, if some property with of a type is already defined in the Consequence class, and you need that type for your new consequence data, '''you should probably use the existing one instead of creating a new property.''' This is because in C# unassigned properties still takes memory when an instance of a Class is created, and you could easily bloat the Consequence class if you decide to create a lot of new consequences. For example, I could have used the already defined: '''''public Vector3 coordinates''''' and '''''public Item itemInInventory''''' and spared few bytes. In that case, I would only have had to create an extra Vector3 for the rotation (because we need '''two''' vectors to configure at the same time). However, this should not be an issue until it becomes an issue, if you add your new fields for each consequence you are going to make you'd probably be fine, still, it was worth mentioning it as I also did that for some of the built-in consequences. For this article, I'm going to keep things as they are and keep the new properties we've just added.


Once we did that, we are going to make them appear in the Consequence editors.
Once we did that, we are going to make them appear in the Consequence editors.
Line 35: Line 35:


[[File:CANC 03.png|link=https://silvematt.com/URPGCreationKitDocumentation/index.php/File:CANC%2003.png|817x817px]]
[[File:CANC 03.png|link=https://silvematt.com/URPGCreationKitDocumentation/index.php/File:CANC%2003.png|817x817px]]
Save the script and reach for any element that implements the [[Events And Consequences|Events]], you will see that if you try to add a consequence now, both your '''New''' category and '''Spawn ItemInWorld''' will appear and be selectable.
[[File:CANC 04.png|578x578px]]
However, if selected, it will show no data because we have to define what needs to be drawn in case this consequence is selected.
We do that in the '''OnGUI()''' method on the "'''ConsequenceEditor.cs"''' script, if you take a quick look at it, you may be able to figure out what is going on, reach for the bottom of the ''if(...) else if(...)'' chain, around line ''454'' and let's add a new case that will cover '''if our new consequence is selected:'''
[[File:CANC 05.png|784x784px]]
From this point, I'm literally going to copy-paste the code just above what I've added and make the '''EditorGUI''' draw my new properties, if you have trouble understanding that, this will help you: [https://docs.unity3d.com/ScriptReference/PropertyDrawer.html Unity - Scripting API: PropertyDrawer (unity3d.com)]
[[File:CANC 06.png|784x784px]]
Once you've done that, the Consequence editor will be setup:
[[File:CANC 07.png]]
However, executing this consequence will do nothing, as we've not defined what needs to be done with this data when this consequence is triggered.
== Define the Execution of the Consequence ==

Revision as of 00:22, 23 December 2022

Consequences are one of the many useful elements of the RPG Creation Kit, although everything (and more) that can be done with consequence can be done with Scripting as well, Consequences represents a useful alternative to do rapidly build and test some things.

There are many built-in useful consequences, but you may need your own, in this article we're going to see how we can create a new Consequence that will allow us to spawn an Item In World at certain coordinates, having this new consequence callable from any elements the Events & Consequences support.

Just a note, setting up a new consequence is not trivial nor hard, but you should think twice before doing that, Consequences are for very general calls or functions that you should be sure will be called extensively and with many different parameters (like the "Alert Message" consequence), if you want to make a functionality that is probably going to be called just once or a bunch of times, you should make a Script for that, as it is way easier to make and setup than a consequence is.

Defining the New Consequence

The first thing to do is to define the new Consequence, we have to do that in the "Consequence.cs" script.

Reach the enum "Consequences Types" and add at the bottom your new consequence:

CANC 01.png

That will acknowledge that the consequence exists, next, we should define the data that you will need to insert upon configuring the new consequence, in my case, I will have:

  • itemToSpawn (type: Item).
  • itemPos (type: Vector3).
  • itemRot (type: Vector3).

And the list may go on, you may want to add the Item ID, configure the Amount of items the instantiated Item In World will have, and so on and so forth, for this example, I will limit to these three things, but you can do as you want.

The Data is defined in the public class Consequence, near the bottom of the script, so reach it and let's add said data at the bottom of the class:

CANC 02.png

You may have noticed inside this class that all the data you're prompted to set when configuring consequences is declared here, you may also have noticed that there are already definitions for types Item and Vector3, and we've essentially added something that was already there, but with a different name.

I want to make a note here, if some property with of a type is already defined in the Consequence class, and you need that type for your new consequence data, you should probably use the existing one instead of creating a new property. This is because in C# unassigned properties still takes memory when an instance of a Class is created, and you could easily bloat the Consequence class if you decide to create a lot of new consequences. For example, I could have used the already defined: public Vector3 coordinates and public Item itemInInventory and spared few bytes. In that case, I would only have had to create an extra Vector3 for the rotation (because we need two vectors to configure at the same time). However, this should not be an issue until it becomes an issue, if you add your new fields for each consequence you are going to make you'd probably be fine, still, it was worth mentioning it as I also did that for some of the built-in consequences. For this article, I'm going to keep things as they are and keep the new properties we've just added.

Once we did that, we are going to make them appear in the Consequence editors.

Drawing the Consequence in the Editor

Drawing the consequence in the editor is accomplished by a custom PropertyDrawer, named "ConsequenceDrawer", open the file "ConsequenceDrawer.cs" and follow along.

The first thing we're going to do is adding the consequence to the menu you use to select which consequence you want to add, for doing that, reach around line 483 and look for the code that adds a GenericMenu and many new items, you will probably recognize these.

Let's add at the bottom our new consequence, remember to edit the highlighted parts in yellow:

CANC 03.png


Save the script and reach for any element that implements the Events, you will see that if you try to add a consequence now, both your New category and Spawn ItemInWorld will appear and be selectable.

CANC 04.png

However, if selected, it will show no data because we have to define what needs to be drawn in case this consequence is selected.

We do that in the OnGUI() method on the "ConsequenceEditor.cs" script, if you take a quick look at it, you may be able to figure out what is going on, reach for the bottom of the if(...) else if(...) chain, around line 454 and let's add a new case that will cover if our new consequence is selected:

CANC 05.png

From this point, I'm literally going to copy-paste the code just above what I've added and make the EditorGUI draw my new properties, if you have trouble understanding that, this will help you: Unity - Scripting API: PropertyDrawer (unity3d.com)

CANC 06.png

Once you've done that, the Consequence editor will be setup:

CANC 07.png

However, executing this consequence will do nothing, as we've not defined what needs to be done with this data when this consequence is triggered.

Define the Execution of the Consequence