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

  1. In Unity, go to RPG Tools > Item Creator
  2. The Item Creator window will open
  3. You'll see a form with various item properties
Item Creator Interface

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:

  1. Open Item Creator
  2. Set Item Name to "Health Potion"
  3. Set Item Type to "Consumable"
  4. Set Description to "Restores 50 HP"
  5. Set Value to 25 gold
  6. Set Stack Size to 10
  7. Check "Is Usable"
  8. 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:

  1. Open Item Creator
  2. Set Item Name to "Iron Sword"
  3. Set Item Type to "Equipment"
  4. Set Equipment Slot to "Weapon"
  5. Add stat modifiers:
    • Strength: +10
    • Attack: +15
  6. Set Level Requirement to 5
  7. 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

Continue Learning

Explore related tutorials to expand your knowledge