Files
TheVVaS-Assets/RPGCore/Runtime/Core/Objects/BaseObject.cs
T

70 lines
2.6 KiB
C#

using System;
using RPGCore.ObjectModules.ActionObjectModule;
using RPGCore.ObjectModules.EventObjectModule;
using RPGCore.ObjectModules.EventObjectModule.Events;
using RPGCoreCommon.DynamicValues;
using RPGCoreCommon.Helpers;
using RPGCoreCommon.Helpers.PropertyAttributeDrawers;
using UnityEngine;
namespace RPGCore.Core.Objects
{
[SelectionBase]
[DisallowMultipleComponent]
[RequireComponent(typeof(Rigidbody))]
[RequireComponent(typeof(EventModule))]
[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 DataModule data { get; private set; }
[DynamicValueProvider]
private ObjectModule<BaseObject> BaseModuleProvider(Type moduleType) => GetComponent(moduleType) as ObjectModule<BaseObject>;
protected void Start()
{
GetComponent<EventModule>().Invoke(new SpawnEvent());
}
protected void OnValidate()
{
rigidbody = GetComponent<Rigidbody>();
events = GetComponent<EventModule>();
data = GetComponent<DataModule>();
GetComponents<ObjectModule>().ForEach(module => module.parent = this);
}
/// <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="Trigger"/>.<see cref="Trigger.OnEnter"/> when this object enter its collider.</summary>
private void OnTriggerEnter(Collider other)
{
other.GetComponentsInParent<Trigger>().ForEach(trigger => {
trigger.OnEnter(this);
events.Invoke(new TriggerEnterEvent { obj = this, trigger = trigger });
});
}
/// <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<Trigger>().ForEach(trigger => {
trigger.OnExit(this);
events.Invoke(new TriggerExitEvent { obj = this, trigger = trigger });
});
}
}
}