So, I’m making a Game using Unity, and I want it to be moddable. So Modders will create a new C# Class Library Project, reference my Game’s and Unity’s .DLL files located in *_Data/Managed for Mono Games and create new Items, and Enemies, then compile to a .dll and put it in the Mods Folder (AutoGenned by the Game) Which will then be loaded by the Game.
My only problem is that my Items are created like this:
using UnityEngine;
namespace items
{
[CreateAssetMenu(fileName = "NewItem", menuName = "Inventory/Item")]
public class Item : ScriptableObject
{
public string ItemName;
public Sprite Icon;
public bool IsStackable;
public virtual void Use(Vector3 pos)
{
}
}
}
And Enemies are
using DefaultNamespace;
using UnityEngine;
namespace enemey
{
[CreateAssetMenu(fileName = "NewEnemy", menuName = "Enemies/EnemyData")]
public class EnemyData : ScriptableObject
{
public string EnemyName;
public float MaxHealth;
public float MoveSpeed;
public float Damage;
public GameObject EnemyPrefab; // optional, for spawning
public virtual void Attack(IDamageable player)
{
var beh = player;
beh.TakeDamage(Damage);
}
}
}
using DefaultNamespace;
using UnityEngine;
namespace enemey
{
public class Enemy : MonoBehaviour, IDamageable
{
public EnemyData data; // assign in inspector
private Transform playerTransform;
private IDamageable damageable;
private float currentHealth;
void Start()
{
playerTransform = GameObject.FindGameObjectWithTag("Player")?.transform;
damageable = GameObject.FindGameObjectWithTag("Player")?.GetComponent<IDamageable>();
currentHealth = data.MaxHealth;
}
void Update()
{
// Example simple AI: follow player
if (playerTransform != null)
{
Vector3 dir = (playerTransform.position - transform.position).normalized;
transform.position += dir * data.MoveSpeed * Time.deltaTime;
}
if (Vector3.Distance(playerTransform.position, transform.position) <= 0.1f)
{
data.Attack(damageable);
}
}
public void TakeDamage(float amount)
{
currentHealth -= amount;
if (currentHealth <= 0)
{
Die();
}
}
void Die()
{
// Drop loot, play animation, destroy object
Destroy(gameObject);
}
}
}
And I don’t know how Modders will create their own.