Files
Studio/Assets/Scripts/XED/TwinObject/TwinObject.cs
2025-02-19 17:43:14 +09:00

103 lines
2.8 KiB
C#

using System;
using System.Collections.Generic;
using System.Diagnostics.Contracts;
using UnityEngine;
using UnityEngine.Pool;
using XED.Interfaces;
using XED.Attributes;
namespace XED
{
public class TwinObject : MonoBehaviour
{
public HashSet<TwinObject> childs = new HashSet<TwinObject>();
public TwinPhysics physics = new TwinPhysics();
public TwinMetaData metaData = new TwinMetaData();
public AssetLabel assetLabel;
public event Action<TwinObject> onSelectEvent;
public event Action<TwinObject> onDeselectEvent;
public event Action<TwinObject, TwinObject> onTwinConflictEvent;
public event Action<TwinObject, TwinObject> onTwinDeconflictEvent;
[PropertyVisible, Tooltip("ù ¹øÂ° info")]
public bool IsDisplayable;
[PropertyVisible, Tooltip("µÎ ¹øÂ° info")]
public bool IsInteractible;
public override void AfterAwake()
{
IsDisplayable = true;
IsInteractible = true;
physics.Init(this);
metaData.Init(this);
}
public virtual void SetDisplayable(bool value)
{
IsDisplayable = !value;
metaData.modeling.SetActive(!value);
}
public virtual void Select()
{
onSelectEvent?.Invoke(this);
}
public virtual void SetInteractible(bool value)
{
IsInteractible = !value;
physics.SetActive(!value);
}
public virtual void Deselect()
{
onDeselectEvent?.Invoke(this);
}
public HashSet<TwinObject> crashObjects = new();
public BoxHighLighter boxHighLighter;
private void OnTriggerEnter(Collider other)
{
if (!other.TryGetComponent<TwinObject>(out TwinObject contracter))
return;
crashObjects.Add(contracter);
Conflict(contracter);
}
private void OnTriggerExit(Collider other)
{
if (!other.TryGetComponent<TwinObject>(out TwinObject twin))
return;
CrashObjectRemove(twin);
}
public void CrashBoxHighLightDeActive()
{
foreach(var contracter in crashObjects)
{
contracter.CrashObjectRemove(this);
}
}
public void CrashObjectRemove(TwinObject crashObject)
{
crashObjects.Remove(crashObject);
Deconflict(crashObject);
}
public virtual void Conflict(TwinObject contract)
{
onTwinConflictEvent?.Invoke(this, contract);
}
public virtual void Deconflict(TwinObject contract)
{
onTwinDeconflictEvent?.Invoke(this, contract);
}
public virtual void MaterialChange(Material mat)
{
}
}
}