CORE dashboard + a lot of changes

This commit is contained in:
2026-06-22 20:09:15 +02:00
parent 19d6bd934a
commit 89fa0b23b2
101 changed files with 1525 additions and 177 deletions
-15
View File
@@ -1,15 +0,0 @@
using RPGCore.Core.Objects;
using UnityEngine;
namespace RPGCore.Core
{
/// <summary>
/// This interface allow any <see cref="BaseObject"/> to call <see cref="OnEnter"/> and <see cref="OnExit"/>.<br/>
/// Setting <see cref="Collider"/>'s <see cref="Collider.isTrigger"/> to true is required!<br/>
/// </summary>
public interface ITrigger
{
public void OnEnter(BaseObject obj);
public void OnExit(BaseObject obj);
}
}
@@ -0,0 +1,19 @@
using System;
namespace RPGCore.Core
{
[AttributeUsage(AttributeTargets.Class)]
public class ObjectModuleAttribute : Attribute
{
public string name;
public string description;
public bool required;
public ObjectModuleAttribute(string name, string description, bool required = false)
{
this.name = name;
this.description = description;
this.required = required;
}
}
}
@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 7732c0ab6a6148ddb8c17a80facf5204
timeCreated: 1780777138
+12 -9
View File
@@ -13,13 +13,11 @@ namespace RPGCore.Core.Objects
[DisallowMultipleComponent]
[RequireComponent(typeof(Rigidbody))]
[RequireComponent(typeof(EventModule))]
[RequireComponent(typeof(ActionModule))]
[RequireComponent(typeof(DataModule))]
public abstract class BaseObject : MonoBehaviour
{
[field: SerializeField, ReadOnly] public new Rigidbody rigidbody { get; private set; }
[field: SerializeField, ReadOnly] public EventModule events { get; private set; }
[field: SerializeField, ReadOnly] public ActionModule actions { get; private set; }
[field: SerializeField, ReadOnly] public DataModule data { get; private set; }
[DynamicValueProvider]
@@ -34,7 +32,6 @@ namespace RPGCore.Core.Objects
{
rigidbody = GetComponent<Rigidbody>();
events = GetComponent<EventModule>();
actions = GetComponent<ActionModule>();
data = GetComponent<DataModule>();
GetComponents<ObjectModule>().ForEach(module => module.parent = this);
}
@@ -42,25 +39,31 @@ namespace RPGCore.Core.Objects
/// <summary>Removes this object from game.</summary>
public void Remove()
{
events.Invoke(new TriggerClearEvent { obj = this });
events.Invoke(new RemoveEvent{ obj = this });
Destroy(gameObject);
}
public void OnDisable()
{
events.Invoke(new TriggerClearEvent { obj = this });
}
/// <summary>It'll execute <see cref="ITrigger"/>.<see cref="ITrigger.OnEnter"/> when this object enter its collider.</summary>
/// <summary>It'll execute <see cref="Trigger"/>.<see cref="Trigger.OnEnter"/> when this object enter its collider.</summary>
private void OnTriggerEnter(Collider other)
{
other.GetComponentsInParent<ITrigger>().ForEach(trigger => {
other.GetComponentsInParent<Trigger>().ForEach(trigger => {
trigger.OnEnter(this);
events.Invoke(new TriggerEnterEvent { target = this, trigger = trigger });
events.Invoke(new TriggerEnterEvent { obj = this, trigger = trigger });
});
}
/// <summary>It'll execute <see cref="ITrigger"/>.<see cref="ITrigger.OnExit"/> when this object exit its collider.</summary>
/// <summary>It'll execute <see cref="Trigger"/>.<see cref="Trigger.OnExit"/> when this object exit its collider.</summary>
private void OnTriggerExit(Collider other)
{
other.GetComponentsInParent<ITrigger>().ForEach(trigger => {
other.GetComponentsInParent<Trigger>().ForEach(trigger => {
trigger.OnExit(this);
events.Invoke(new TriggerExitEvent { target = this, trigger = trigger });
events.Invoke(new TriggerExitEvent { obj = this, trigger = trigger });
});
}
}
@@ -1,4 +1,5 @@
using System;
using RPGCore.ObjectModules.ActionObjectModule;
using RPGCoreCommon.DynamicValues;
using RPGCoreCommon.Helpers.PropertyAttributeDrawers;
using UnityEngine;
@@ -6,16 +7,19 @@ using UnityEngine;
namespace RPGCore.Core.Objects
{
[RequireComponent(typeof(CapsuleCollider))]
[RequireComponent(typeof(ActionModule))]
public class UnitObject : BaseObject
{
[DynamicValueProvider]
private ObjectModule<UnitObject> UnitModuleProvider(Type moduleType) => GetComponent(moduleType) as ObjectModule<UnitObject>;
[field: SerializeField, ReadOnly] public CapsuleCollider unitCollider { get; private set; }
[field: SerializeField, ReadOnly] public ActionModule actions { get; private set; }
protected new void OnValidate()
{
base.OnValidate();
actions = GetComponent<ActionModule>();
unitCollider = GetComponent<CapsuleCollider>();
}
}
+69
View File
@@ -0,0 +1,69 @@
using System;
using System.Collections.Generic;
using RPGCore.Core.Objects;
using RPGCore.ObjectModules.EventObjectModule.Events;
using RPGCoreCommon.Settings;
using UnityEngine;
namespace RPGCore.Core
{
/// <summary>
/// This MonoBehaviour allow any <see cref="BaseObject"/> to call <see cref="OnEnter"/> and <see cref="OnExit"/>.<br/>
/// Setting <see cref="Collider"/>'s <see cref="Collider.isTrigger"/> to true is required!<br/>
/// </summary>
public class Trigger : MonoBehaviour
{
private event Action<BaseObject> OnEnterEvent;
private event Action<BaseObject> OnExitEvent;
private readonly Dictionary<BaseObject, int> _collisionCounter = new();
public static Trigger AddToGameObject(GameObject go, Action<BaseObject> onEnter, Action<BaseObject> onExit)
{
go.layer = SettingsManager.Get<CoreSettings>().triggerLayer;
var interactTrigger = go.AddComponent<Trigger>();
interactTrigger.OnEnterEvent += onEnter;
interactTrigger.OnExitEvent += onExit;
return interactTrigger;
}
internal void OnEnter(BaseObject obj)
{
var alreadyTouching = _collisionCounter.ContainsKey(obj);
if (!alreadyTouching) _collisionCounter.Add(obj, 0);
_collisionCounter[obj]++;
if (!alreadyTouching)
{
obj.events.Register<TriggerClearEvent>(OnClear);
OnEnterEvent?.Invoke(obj);
}
}
internal void OnExit(BaseObject obj)
{
if (!_collisionCounter.ContainsKey(obj))
{
Debug.LogError("Object tried to leave trigger, but never entered it!", obj);
return;
}
_collisionCounter[obj]--;
if (_collisionCounter[obj] == 0) Clear(obj);
}
private void OnClear(TriggerClearEvent ev)
{
Clear(ev.obj);
}
private void Clear(BaseObject obj)
{
obj.events.Unregister<TriggerClearEvent>(OnClear);
_collisionCounter.Remove(obj);
OnExitEvent?.Invoke(obj);
}
}
}