Creating Custom Items
Learn how to create and customize items for your 2D RPG using the built-in Item Creator tool.
Item System Overview
The item system supports three main categories of items:
Consumables
Items that are used up when consumed
- Health Potions
- Mana Potions
- Buff Items
- Food
Equipment
Items that can be equipped to modify stats
- Weapons
- Armor
- Accessories
- Rings
Key Items
Special items used for quests and progression
- Quest Items
- Keys
- Documents
- Currency
Using the Item Creator Tool
Step 1: Open Item Creator
- In Unity, go to
RPG Tools > Item Creator - The Item Creator window will open
- You'll see a form with various item properties
Step 2: Basic Item Properties
Fill in the fundamental properties for your item:
| Property | Description | Example |
|---|---|---|
| Item Name | Display name of the item | "Iron Sword" |
| Description | Tooltip description | "A sturdy iron blade" |
| Item Type | Category of item | Equipment |
| Icon | Sprite for UI display | sword_icon.png |
| Value | Gold value for buying/selling | 150 |
| Stack Size | Maximum stack quantity | 1 (equipment), 99 (consumables) |
Step 3: Advanced Properties
Configure additional settings:
1"comment">// Advanced item properties
2"keyword">public "keyword">class Item : ScriptableObject
3{
4 [Header("Advanced Settings")]
5 "keyword">public "keyword">bool isDroppable = true; "comment">// Can be dropped/traded
6 "keyword">public "keyword">bool isUsable = false; "comment">// Can be used from inventory
7 "keyword">public AudioClip useSound; "comment">// Sound when used
8 "keyword">public GameObject useEffect; "comment">// Particle effect when used
9
10 [Header("Rarity")]
11 "keyword">public ItemRarity rarity = ItemRarity.Common;
12
13 [Header("Level Requirements")]
14 "keyword">public "keyword">int levelRequirement = 1; "comment">// Minimum level to use
15}
Creating Consumable Items
Health Potion Example
Let's create a health potion step by step:
- Open Item Creator
- Set Item Name to "Health Potion"
- Set Item Type to "Consumable"
- Set Description to "Restores 50 HP"
- Set Value to 25 gold
- Set Stack Size to 10
- Check "Is Usable"
- Click "Create Item"
Adding Custom Effects
Create custom consumable effects by extending the Item class:
1"comment">// Custom consumable item
2[CreateAssetMenu(fileName = "New Consumable", menuName = "RPG/Items/Consumable")]
3"keyword">public "keyword">class ConsumableItem : Item
4{
5 [Header("Consumable Effects")]
6 "keyword">public "keyword">int healthRestore = 0;
7 "keyword">public "keyword">int manaRestore = 0;
8 "keyword">public StatusEffect statusEffect;
9 "keyword">public "keyword">float effectDuration = 0f;
10
11 "keyword">public "keyword">override "keyword">void Use()
12 {
13 var player = GameManager.Instance.playerStats;
14
15 "comment">// Restore health
16 "keyword">if (healthRestore > 0)
17 {
18 player.Heal(healthRestore);
19 }
20
21 "comment">// Restore mana
22 "keyword">if (manaRestore > 0)
23 {
24 player.RestoreMana(manaRestore);
25 }
26
27 "comment">// Apply status effect
28 "keyword">if (statusEffect != null)
29 {
30 player.ApplyStatusEffect(statusEffect, effectDuration);
31 }
32
33 "comment">// Play sound and effects
34 "keyword">if (useSound != null)
35 {
36 AudioManager.Instance.PlaySFX(useSound);
37 }
38
39 "keyword">if (useEffect != null)
40 {
41 Instantiate(useEffect, player.transform.position, Quaternion.identity);
42 }
43 }
44}
Status Effects
Create reusable status effects:
1[CreateAssetMenu(fileName = "New Status Effect", menuName = "RPG/Status Effect")]
2"keyword">public "keyword">class StatusEffect : ScriptableObject
3{
4 "keyword">public "keyword">string effectName;
5 "keyword">public Sprite icon;
6 "keyword">public Color effectColor = Color.white;
7
8 [Header("Stat Modifiers")]
9 "keyword">public StatModifier[] statModifiers;
10
11 [Header("Over Time Effects")]
12 "keyword">public "keyword">int healthPerTick = 0; "comment">// Regeneration/Poison
13 "keyword">public "keyword">int manaPerTick = 0; "comment">// Mana regen/drain
14 "keyword">public "keyword">float tickInterval = 1f; "comment">// Time between ticks
15
16 "keyword">public "keyword">void ApplyEffect(PlayerStats player)
17 {
18 "comment">// Apply stat modifiers
19 "keyword">foreach (var modifier in statModifiers)
20 {
21 player.AddStatModifier(modifier);
22 }
23
24 "comment">// Start over-time effects "keyword">if any
25 "keyword">if (healthPerTick != 0 || manaPerTick != 0)
26 {
27 player.StartCoroutine(ApplyOverTimeEffect(player));
28 }
29 }
30
31 "keyword">private IEnumerator ApplyOverTimeEffect(PlayerStats player)
32 {
33 "keyword">float elapsed = 0f;
34
35 "keyword">while (elapsed < duration)
36 {
37 yield "keyword">return "keyword">new WaitForSeconds(tickInterval);
38
39 "keyword">if (healthPerTick != 0)
40 {
41 "keyword">if (healthPerTick > 0)
42 player.Heal(healthPerTick);
43 "keyword">else
44 player.TakeDamage(-healthPerTick);
45 }
46
47 "keyword">if (manaPerTick != 0)
48 {
49 player.RestoreMana(manaPerTick);
50 }
51
52 elapsed += tickInterval;
53 }
54 }
55}
Creating Equipment
Equipment Slots
The system supports multiple equipment slots:
Weapon
Primary damage dealer
Shield
Defensive equipment
Helmet
Head protection
Armor
Body protection
Boots
Foot protection
Ring
Magical accessories
Creating a Sword
Example of creating equipment with stat modifiers:
- Open Item Creator
- Set Item Name to "Iron Sword"
- Set Item Type to "Equipment"
- Set Equipment Slot to "Weapon"
- Add stat modifiers:
- Strength: +10
- Attack: +15
- Set Level Requirement to 5
- Click "Create Item"
Stat Modifiers
Configure how equipment affects player stats:
1[System.Serializable]
2"keyword">public "keyword">class StatModifier
3{
4 "keyword">public StatType statType; "comment">// Which stat to modify
5 "keyword">public "keyword">int value; "comment">// How much to modify
6 "keyword">public ModifierType type; "comment">// Flat or percentage
7
8 "keyword">public "keyword">void ApplyModifier(PlayerStats stats)
9 {
10 switch (statType)
11 {
12 case StatType.Strength:
13 stats.strength.AddModifier("keyword">this);
14 break;
15 case StatType.Defense:
16 stats.defense.AddModifier("keyword">this);
17 break;
18 case StatType.Agility:
19 stats.agility.AddModifier("keyword">this);
20 break;
21 case StatType.Intelligence:
22 stats.intelligence.AddModifier("keyword">this);
23 break;
24 }
25 }
26}
27
28"keyword">public "keyword">enum ModifierType
29{
30 Flat, "comment">// +10 strength
31 Percentage "comment">// +15% strength
32}
Equipment Sets
Create equipment sets with bonus effects:
1[CreateAssetMenu(fileName = "New Equipment Set", menuName = "RPG/Equipment Set")]
2"keyword">public "keyword">class EquipmentSet : ScriptableObject
3{
4 "keyword">public "keyword">string setName;
5 "keyword">public Equipment[] setItems;
6
7 [Header("Set Bonuses")]
8 "keyword">public SetBonus[] setBonuses;
9}
10
11[System.Serializable]
12"keyword">public "keyword">class SetBonus
13{
14 "keyword">public "keyword">int requiredPieces = 2; "comment">// How many pieces needed
15 "keyword">public "keyword">string bonusDescription; "comment">// Description of bonus
16 "keyword">public StatModifier[] bonusModifiers; "comment">// Stat bonuses
17 "keyword">public StatusEffect bonusEffect; "comment">// Special effect
18
19 "keyword">public "keyword">bool IsActive(List<Equipment> equippedItems)
20 {
21 "keyword">int equippedSetPieces = 0;
22
23 "keyword">foreach (var item in equippedItems)
24 {
25 "keyword">if (System.Array.Exists(setItems, setItem => setItem == item))
26 {
27 equippedSetPieces++;
28 }
29 }
30
31 "keyword">return equippedSetPieces >= requiredPieces;
32 }
33}
Key Items and Quest Items
Creating Quest Items
Key items are special items that cannot be sold or discarded:
1[CreateAssetMenu(fileName = "New Key Item", menuName = "RPG/Items/Key Item")]
2"keyword">public "keyword">class KeyItem : Item
3{
4 [Header("Key Item Properties")]
5 "keyword">public "keyword">bool canBeDiscarded = false; "comment">// Usually false "keyword">for quest items
6 "keyword">public "keyword">bool showInQuestLog = true; "comment">// Show in quest tracking
7 "keyword">public Quest relatedQuest; "comment">// Associated quest
8
9 "keyword">public "keyword">override "keyword">bool CanDiscard()
10 {
11 "keyword">return canBeDiscarded;
12 }
13
14 "keyword">public "keyword">override "keyword">bool CanSell()
15 {
16 "keyword">return false; "comment">// Key items cannot be sold
17 }
18}
Document Items
Create readable documents and books:
1[CreateAssetMenu(fileName = "New Document", menuName = "RPG/Items/Document")]
2"keyword">public "keyword">class DocumentItem : KeyItem
3{
4 [Header("Document Content")]
5 [TextArea(5, 10)]
6 "keyword">public "keyword">string documentText;
7 "keyword">public Sprite documentImage;
8
9 "keyword">public "keyword">override "keyword">void Use()
10 {
11 "comment">// Show document UI
12 DocumentReader.Instance.ShowDocument("keyword">this);
13 }
14}
15
16"comment">// Document reader UI component
17"keyword">public "keyword">class DocumentReader : MonoBehaviour
18{
19 "keyword">public "keyword">static DocumentReader Instance;
20
21 [Header("UI References")]
22 "keyword">public GameObject documentPanel;
23 "keyword">public Text documentTitle;
24 "keyword">public Text documentContent;
25 "keyword">public Image documentImage;
26
27 "keyword">public "keyword">void ShowDocument(DocumentItem document)
28 {
29 documentPanel.SetActive(true);
30 documentTitle.text = document.itemName;
31 documentContent.text = document.documentText;
32
33 "keyword">if (document.documentImage != null)
34 {
35 documentImage.sprite = document.documentImage;
36 documentImage.gameObject.SetActive(true);
37 }
38 "keyword">else
39 {
40 documentImage.gameObject.SetActive(false);
41 }
42 }
43}
Advanced Custom Effects
Creating Magic Items
Items with special abilities and cooldowns:
1[CreateAssetMenu(fileName = "New Magic Item", menuName = "RPG/Items/Magic Item")]
2"keyword">public "keyword">class MagicItem : Item
3{
4 [Header("Magic Properties")]
5 "keyword">public "keyword">int manaCost = 10;
6 "keyword">public "keyword">float cooldownTime = 30f;
7 "keyword">public MagicEffect[] effects;
8
9 "keyword">private "keyword">float lastUsedTime = -999f;
10
11 "keyword">public "keyword">override "keyword">bool CanUse()
12 {
13 var player = GameManager.Instance.playerStats;
14
15 "comment">// Check mana cost
16 "keyword">if (player.mana.Value < manaCost)
17 {
18 "keyword">return false;
19 }
20
21 "comment">// Check cooldown
22 "keyword">if (Time.time - lastUsedTime < cooldownTime)
23 {
24 "keyword">return false;
25 }
26
27 "keyword">return true;
28 }
29
30 "keyword">public "keyword">override "keyword">void Use()
31 {
32 "keyword">if (!CanUse()) "keyword">return;
33
34 var player = GameManager.Instance.playerStats;
35
36 "comment">// Use mana
37 player.UseMana(manaCost);
38
39 "comment">// Apply effects
40 "keyword">foreach (var effect in effects)
41 {
42 effect.Apply(player);
43 }
44
45 "comment">// Set cooldown
46 lastUsedTime = Time.time;
47
48 "comment">// Show cooldown in UI
49 UIManager.Instance.ShowItemCooldown("keyword">this, cooldownTime);
50 }
51}
52
53[System.Serializable]
54"keyword">public "keyword">class MagicEffect
55{
56 "keyword">public MagicEffectType type;
57 "keyword">public "keyword">int power;
58 "keyword">public "keyword">float duration;
59 "keyword">public GameObject visualEffect;
60
61 "keyword">public "keyword">void Apply(PlayerStats player)
62 {
63 switch (type)
64 {
65 case MagicEffectType.Heal:
66 player.Heal(power);
67 break;
68 case MagicEffectType.Shield:
69 player.AddShield(power, duration);
70 break;
71 case MagicEffectType.Teleport:
72 player.TeleportToSafeLocation();
73 break;
74 }
75
76 "keyword">if (visualEffect != null)
77 {
78 Instantiate(visualEffect, player.transform.position, Quaternion.identity);
79 }
80 }
81}
Crafting Materials
Items used in crafting systems:
1[CreateAssetMenu(fileName = "New Material", menuName = "RPG/Items/Material")]
2"keyword">public "keyword">class CraftingMaterial : Item
3{
4 [Header("Crafting Properties")]
5 "keyword">public MaterialType materialType;
6 "keyword">public "keyword">int tier = 1; "comment">// Quality tier
7 "keyword">public CraftingRecipe[] usedInRecipes; "comment">// What can be made with "keyword">this
8
9 "keyword">public "keyword">override "keyword">string GetTooltip()
10 {
11 "keyword">string tooltip = "keyword">base.GetTooltip();
12
13 tooltip += $"\n\nTier: {tier}";
14 tooltip += $"\nType: {materialType}";
15
16 "keyword">if (usedInRecipes.Length > 0)
17 {
18 tooltip += "\n\nUsed in:";
19 "keyword">foreach (var recipe in usedInRecipes)
20 {
21 tooltip += $"\nโข {recipe.resultItem.itemName}";
22 }
23 }
24
25 "keyword">return tooltip;
26 }
27}
28
29"keyword">public "keyword">enum MaterialType
30{
31 Metal,
32 Wood,
33 Leather,
34 Cloth,
35 Gem,
36 Herb,
37 Essence
38}
Item Tooltips
Create informative tooltips for items:
1"keyword">public "keyword">virtual "keyword">string GetTooltip()
2{
3 StringBuilder tooltip = "keyword">new StringBuilder();
4
5 "comment">// Item name with rarity color
6 tooltip.Append($"GetRarityColor ()}>{itemName}\n");
7
8 "comment">// Item type
9 tooltip.Append($"{type}\n\n");
10
11 "comment">// Description
12 tooltip.Append(description);
13
14 "comment">// Equipment stats
15 "keyword">if ("keyword">this is Equipment equipment)
16 {
17 tooltip.Append("\n\nStats:");
18 "keyword">foreach (var modifier in equipment.statModifiers)
19 {
20 "keyword">string sign = modifier.value > 0 ? "+" : "";
21 tooltip.Append($"\n{sign}{modifier.value} {modifier.statType}");
22 }
23
24 "keyword">if (equipment.levelRequirement > 1)
25 {
26 tooltip.Append($"\n\nLevel Required: {equipment.levelRequirement}");
27 }
28 }
29
30 "comment">// Value
31 "keyword">if (value > 0)
32 {
33 tooltip.Append($"\n\nValue: {value} gold");
34 }
35
36 "keyword">return tooltip.ToString();
37}
38
39"keyword">private "keyword">string GetRarityColor()
40{
41 switch (rarity)
42 {
43 case ItemRarity.Common: "keyword">return "#FFFFFF";
44 case ItemRarity.Uncommon: "keyword">return "#00FF00";
45 case ItemRarity.Rare: "keyword">return "#0080FF";
46 case ItemRarity.Epic: "keyword">return "#8000FF";
47 case ItemRarity.Legendary: "keyword">return "#FF8000";
48 default: "keyword">return "#FFFFFF";
49 }
50}
Item Design Tips
๐ฐ Balanced Economy
Price items appropriately relative to their power and availability
๐จ Visual Clarity
Use clear, distinct icons that are easily recognizable
๐ Progression Curve
Ensure items scale appropriately with player level
๐ Variety
Create items with different utility beyond just stat increases