Infinity PBR by Magic Pig Games
  • Infinity PBR Documentation
  • Game Modules 4
    • ➡️Quick Start
    • 📽️Video Tutorials
      • Quick Start: Creating Game Module Objects
      • Automating Start Actions on GameModulesActor
      • Inflicting Damage with Conditions
      • Updating UI (and more) with Blackboard Notes
      • Dynamic Menus with Item Objects and Dictionaries
      • Create Custom Quest Rewards
      • Save and Load Game Data
      • Stats: Deep Dive
      • Items: Deep Dive
      • Conditions: Deep Dive
      • First Person Movement
      • Tutorial: "Overheal" Effect with Condition & Stats
      • Tutorial: Create a Character & Actor Class Inheriting from GameModulesActor
    • 👀Game Modules Viewer
      • Viewer: Dictionaries
      • Viewer: Stat / GameStatList
      • Viewer: ItemObject / GameItemObjectList
      • Viewer: ItemAttribute / GameItemAttributeList
      • Viewer: Condition / GameConditionList
      • Viewer: Quest / GameQuestList
    • V4 Migration Tips
      • Introducing GameModulesActor
      • Interfaces
      • No More Tick*
      • Dictionaries
      • Repositories
      • Tips from Upgrading "Legend of the Stones"
    • Important Information
      • Game Modules Overview
      • Inherit from GameModulesActor
      • Things to not forget to do
      • Bugs, Backups, and Demos
      • FAQ / Tips & Tricks
      • Required Prefabs
      • Game Module Repository
      • Release Notes
    • Module Documentation
      • Game Modules Actor
      • Game Module "Lists"
        • Get() Methods
          • GameStatList Get() Methods
          • GameItemObjectList Get() Methods
          • GameItemAttribute Get() Methods
          • GameConditionList Get() Methods
          • GameQuestList Get() Methods
        • Contains() Methods
          • GameStatList Contains() Methods
          • GameItemObjectList Contains() Methods
          • GameItemAttributeList Contains() Methods
          • GameConditionList Contains() Methods
          • GameQuestList Contains() Methods
        • Count() Methods
          • GameStatList Count() Methods
          • GameItemObjectList Count() Methods
          • GameItemAttributeList Count() Methods
          • GameConditionList Count() Methods
          • GameQuestList Count() Methods
        • Remove() Methods
          • GameStatList Remove() Methods
          • GameItemObjectList Remove() Methods
          • GameItemAttributeList Remove() Methods
          • GameConditionList Remove() Methods
          • GameQuestList Remove() Methods
        • GameStatList
        • GameItemObjectList
        • GameItemAttributeList
        • GameQuestList
        • GameConditionList
      • Blackboard
        • Blackboard.cs
        • Blackboard Follower
        • Blackboard Note
        • Blackboard Event
        • Blackboard Values
        • Tips & Tricks
          • Use extension methods to check BlackboardNotes (or events)
      • Stats
        • IHaveStats
        • Stat.cs
        • GameStat.cs
        • GameStatList.cs
        • Mastery Levels
      • Loot
        • LootItems.cs
        • LootBox.cs
        • GameLootBox.cs
        • Generating & Handling Loot
        • Custom Loot Generation Algorithm
      • Items
        • ItemObject.cs
          • Manage Item Objects
          • Allowed Item Attributes
          • Starting Item Attributes
          • Item Attribute Variables
            • Variables Methods
        • GameItemObject.cs
        • GameItemObjectList.cs
        • ItemAttribute.cs
          • Manage Item Attributes
          • General Settings
          • Name Settings
          • Requisite Attributes
        • GameItemAttribute.cs
        • GameItemAttributeList.cs
        • Code Examples
      • Conditions
        • Condition.cs
          • Main Settings
          • Condition Time
          • Effects on Points
        • GameCondition.cs
        • GameConditionList.cs
        • Expiration Condition Handler
        • Code Examples
      • Quests
        • Quest
          • Main Settings
          • Quest Step Settings
        • Quest Steps
        • Quest Conditions
          • Create a Custom Quest Condition
            • Your Quest Condition
            • Your Quest Condition Editor
            • Your Quest Condition Drawer
          • Quest Condition Details
            • Blackboard Value Bool
            • Blackboard Value GameObject
            • Blackboard Value Number
            • Blackboard Value String
            • Final Stat Is
            • Game Condition List Contains
            • Game Item Object List Contains
            • Game Stat List Contains
          • Quest Condition Enums
        • Quest Rewards
          • Create a Custom Quest Reward
            • Your Quest Reward
            • Your Quest Reward Editor
            • Your Quest Reward Drawer
          • Quest Reward Details
            • Point Reward
            • Condition Reward
            • Quest Quest Reward
            • Item Object Reward
          • Custom Quest Reward Handler
        • GameQuest
        • GameQuestList
        • Quest Events
        • Demo Scene Quests
          • Push the Button
          • Add Money
          • Don't Get Poisoned
          • Rescue the Puppy
      • Voices
        • Voices
        • Voice.cs
        • Code Examples
      • Dictionaries
        • Dictionaries Setup
        • Dictionaries Methods
        • KeyValue Methods
        • Save and Load
        • Object Reference
      • Gametime & Timeboard
        • Timeboard
          • Timeboard Events
          • TimeboardFollower
        • Gametime
          • Pause Level
          • Time Options
          • Properties & Methods
        • TimeSpan
        • Code Examples
      • Property Code
      • Lookup Table
      • Save and Load
        • GameList & GameFile
        • Making objects saveable
        • Saving, and Loading
        • BlackboardEvents sent by Save and Load
    • Game Module "Systems"
      • Drag-and-Drop Inventory System
        • Scripts
          • PanelManager
          • OnScreenItem
          • Panel
          • BoxManager
        • Scene & Class Setup
        • Item / Object Setup
        • Item / Inventory Setup
        • Box Setup (Chests, Bags, Other Inventories)
        • Setup Your Scene
      • First Person Movement
      • Character Creation
    • Game Module Demo Projects
      • Party Based RPG
        • Title Scene
        • Character Creation Scene
        • World & Dungeon Scenes
    • Magic Time for Game Modules
  • ✨Northstar Tracking System
    • ✅Overview & Quickstart
      • ➡️Quick Start
      • 🫐Demo Scene
      • 🛠️Customizing & Overriding
        • Create a Custom Navigation Bar
        • Create a Custom Compass / Radar
        • Runtime Overrides
          • Screen & Edge Overlay
          • Navigation Bar
          • Compass / Radar
      • ☄️Tips & Code Examples
    • Northstar Documentation
      • Global Northstar Settings
      • Northstar Overlay Settings
      • Compass & Radar
        • Compass
        • Radar
      • Northstar Screen Overlay
        • Screen & Edge Overlay
        • Navigation Bar
      • Tracked Target Compass Radar
      • Tracked Target Overlay
        • Types
        • Override Values
      • Overlay Icon
      • Compass Icon
      • Distance Text
  • 🚀Projectile Factory
    • 👀Overview & Quickstart
      • ➡️Quick Start Guide
        • Create Your First Projectile
        • Add Projectile Factory & Create a Projectile Spawner
        • Use 3rd Party Integrations
        • Extending Projectile Factory
        • Making Lasers & Similar Attached Projectiles
      • 💡FAQs + Important Reminders
    • Game Modules 4 Integration
      • Projectiles with TimeMod
    • Magic Time for Projectile Factory
    • ✅3rd Party Particle Integrations [16]
      • ▶️Archanor VFX [5]
        • Sci-Fi Arsenal
        • Polygon Arsenal
        • Magic Arsenal
        • Retro Arsenal
        • Rainbow Magic
      • ▶️Gabriel Aguiar Prod [2]
        • Unique Projectiles Vol. 1
        • Unique Projectiles Vol. 2
      • ▶️HOVL Studio [4]
        • Toon Projectiles
        • Toon Projectiles 2
        • AAA Stylized Projectiles Vol. 1
        • AAA Projectiles Vol. 2
      • ▶️kripto289 [1]
        • Realistic Effects Pack 4
      • ▶️FORGE3D [1]
        • Sci-Fi Effects
      • ▶️Knife [1]
        • PRO Effects - Sci-Fi Shooter FX
      • ▶️Jean Moreno [1]
        • Cartoon FX Remastered
      • ▶️Synty Studios [1]
        • 🟡Synty Studios Particles
    • Projectile Factory Documentation
      • 🔫Projectile Spawner
        • Projectile Spawner Code
      • 🚀Projectile
        • Projectile Code
        • Projectile Data
      • ✨Spawn Behavior
        • Spawn Behavior Code
        • Spawn Behavior Modification
      • 🕊️Behaviors
        • Behavior Examples
      • ⚡Events
      • 👁️Observers, Global Observers, and Observer Objects
        • Toggle Objects At Events Observer Object
      • 👩‍💼Factory Manager
      • 🏹Trajectory
      • 🎱Object Pooling
      • 🤩Create Custom Behaviors
      • Spawn Point Manager
      • Helper Tools
        • Projectiles Quick Editor
        • Set Trail Auto Destroy to False
        • Set Layer of All Projectiles
        • Remove Colliders
      • Additional Scripts
        • Destroy or Pool Object
        • Project Force
        • Raycast Shooter + Handlers
        • Projectile Utilities
  • Additional Systems & Tools
    • 🎨Runtime Color Sampler
      • Quick Start
      • Demo Walkthrough
      • Runtime Color Sampler (Prefab & Class)
        • Sampler Sphere
        • Sampler Camera
      • Runtime Listener
      • Runtime Color Settings
      • Scripting
      • Additional Classes
    • 🙎‍♀️Portrait Avatars
      • Setup
        • Create a Portrait Avatar
        • Create a UI Portrait
      • Portrait Avatars
        • Scripting
      • Portrait3D
      • Portrait2D
      • Portrait UI
      • Avatar Camera
      • Important Considerations
    • 🎛️Audio Clip Combiner
    • 🌈Color Shifter
    • 🛠️Support Classes
      • Utilities.cs
      • InfinityExtensions.cs
  • ⌛Magic Time - Local Time Scale
    • Overview
    • ➡️Quick Start
    • 🛠️Integrations
    • 💡FAQ
    • Local Time Scale
      • Local Time Scale Scripting
    • Magic Time Manager
      • Magic Time Manager Scripting
    • Magic Time User
      • IHaveLocalTime
      • Magic Time User Scripting
      • Additional "Magic Time User" Components
    • Time Zone
  • Equipment Systems
    • Overview
    • Blend Shapes Manager
    • Blend Shapes Preset Manager
    • Prefab and Object Manager
      • Humanoid Demo & Setup
      • EquipmentObject.cs
      • Prefab Groups
      • Variables
      • Scripting Examples
    • Wardrobe Prefab Manager
  • 📽️General Tutorials
    • Quick 3rd Person Controller
  • ⚔️Legend of the Stones
    • Actors, Players, NPCs
    • Systems
      • Game State
  • External Links
  • Get them at the Asset Store
  • Connect on Discord
  • YouTube
  • Twitch
  • 🚧Work In Progress / Coming Soon
Powered by GitBook
On this page
  • 1. Import the GameModules4Integration.unitypackage files
  • 2. Update IAmGameModulesActor interface
  • Create a custom interface
  • 3. Implement IAmGameModulesActor
  • 4. Add Game Modules connections to Projectile
  • Spawn Behavior Modification
  • Collision Behavior
  • 5. Modify ProjectileGameModulesConnection.cs
  • Update the CustomAction() action call
  • 6. That's it!

Was this helpful?

  1. Projectile Factory

Game Modules 4 Integration

PreviousFAQs + Important RemindersNextProjectiles with TimeMod

Last updated 9 months ago

Was this helpful?

and work great together, and can be connected with just a few steps.

This document will walk through the setup required to get a character who uses Game Modules 4 for stats, conditions, and other game data to spawn projectiles that can cause damage to other in the scene.

This guide assumes you have imported the latest Game Modules 4 and Projectile Factory packages from the Package Manager.

1. Import the GameModules4Integration.unitypackage files

Find GameModules4Integration.unitypackage and import it into your project. It will be located at Assets/Magic Pig Games/Projectile Factory/Game Modules 4 Integration/GameModules4Integration.unitypackage

2. Update IAmGameModulesActor interface

The IAmGameModulesActor interface should be added to your "Actor" object -- this is the object which has the data that inherits from GameModulesActor.

Create a custom interface

The interface has a CustomAction() method defined. To take advantage of this, you'll need to create a custom interface that has custom methods. For this, we will require a TakeDamage() method.

You'll need to update the signature to fit your project, allowing you to pass in the required data needed to propertly compute damage.

// This is the method in the IAttackable interface.
public interface IAttackable
{
    // ... Other methods/properties
    public void TakeDamage(float damage, IAmGameModulesActor attacker);
}

This interface is custom for your project. It can have additional methods and properties as needed. You can call any defined methods in the same way shown later in this setup process, using the CustomAction() method defined in IAmGameModulesActor.

3. Implement IAmGameModulesActor

Your actor class should implement IAmGameModulesActor. In the snippet below, you can see my AttackableObject implements IAmGameModulesActor.

The Actor class (data, below), is a GameModulesActor, so the required properties all pull from there.

// Example from my own game. You can probably copy this and just be sure to connect
// the GameModulesActor variable properly. (data, in this example)
public class AttackableObject : MonoBehaviour, IAmGameModulesActor
{
     // Required for IAmGameModulesActor
     public IAmGameModulesActor ActorObject => this;
     public GameModulesActor GameModulesActor => data;
     public GameStatList Stats => data.stats;
     public GameConditionList Conditions => data.conditions;
     public GameItemObjectList Inventory => data.inventoryItems;
     public GameItemObjectList Equipment => data.equippedItems;
     public GameQuestList Quests => data.quests;
     public void CustomAction(Action<IAmGameModulesActor> action)
     {
          action?.Invoke(this);
     }
     // End of IAmGameModulesActor
        
     [Header("In Game Data")]
     // This is the GameModulesActor that holds all of the data for this actor.
     public Actor data;
     
//...

4. Add Game Modules connections to Projectile

If you don't have either of these objects available, you can create them. Right click in your project and select Create/ProjectileFactory/... and then find either Spawn Behavior Mod or Collision Behavior and then the correct object, as named below.

This will create the object in your project, and the Projectile window will find them. No additional setup is required for either of these objects.

Spawn Behavior Modification

The "Connect Game Modules" Spawn Behavior Modification is used to connect the Projectile with another compnent we'll add later.

Collision Behavior

The "Game Modules Connection Hit" Collision Behavior calls the proper method on the connection component (the one we'll add later), on collision. This is what actually starts the "Take Damage" process.

5. Modify ProjectileGameModulesConnection.cs

Find and load ProjectileGameModulesConnection in your script editor. There are sections we need to update to work with the Interface you created earlier.

The two sections we are updating are in the DoDamage() method, and have comments that start with "SEE THE DOCUMENTATION..." along with Debug.LogWarning() messages.

➡️ First, remove the Debug.LogWarning() messages, and the "SEE THE DOCUMENTATION..." comments.

➡️ Uncomment the attackedActor lines as well.

Update the CustomAction() action call

The CustomAction() method will call another method you have defined on your custom Interface, including the TakeDamage() method withe the signature required for your project.

In the example below, my "TakeDamage" method passes in the damage and the attacking actor.

public void DoDamage(GameObject objectHit)
{
    // Try to get the IAmGameModulesActor component in the object hit
    if (objectHit.TryGetComponent(out IAmGameModulesActor attackedActor))
    {
        attackedActor.CustomAction(actor => actor.TakeDamage(Actor.NextMeleeDamage, Actor));
        return;
    }

    // If not found, try to get the IAmGameModulesActor component in the parent objects
    var parent = objectHit.transform.parent;
    while (parent != null)
    {
        if (parent.TryGetComponent(out attackedActor))
        {
            attackedActor.CustomAction(actor => actor.TakeDamage(Actor.NextRangeDamage, Actor));
            return;
        }
        parent = parent.parent; // Move up to the next parent
    }

    Debug.Log("No IAmGameModulesActor component found in the object or its parents.");
}

6. That's it!

If your TakeDamage() method is properly connected to actually remove health and do all the other fun stuff that happens in your game, you should be all set, and can test it out.

🚀
Game Modules 4
Projectile Factory
Game Module Actors
This video walks through the steps below as taken in one of my own prototype projects.
IAttackable is commented out -- replace this with your own Interface that has a TakeDamage() method on it!