CORE dashboard + a lot of changes
This commit is contained in:
@@ -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
|
||||
@@ -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>();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user