namespace ChivaXR.VR
{
using System.Collections.Generic;
using Sirenix.OdinInspector;
using System.Linq;
using UnityEngine;
using System;
public struct CVR_TriggerElementEventArgs
{
public CVR_TriggerElement triggerElement;
public float value;
}
///
/// Trigger
///
/// this object
///
public delegate void CVRTriggerElementEventHandler(object sender, CVR_TriggerElementEventArgs e);
///
/// 交互触发器
///
public class CVR_TriggerElement : SerializedMonoBehaviour, IVR_OperationElement
{
private CVR_SimulationTool simulationTool;
///
/// 可被操作工具类型
///
public bool isActive = false;
private bool isSimulation = false;
public CVR_ToolType toolType;
[Header("触发点工具模拟动画")]
[TypeFilter("GetFilteredTypeList")]
public CVR_TriggerAniBase triggerAniBase;
public IEnumerable GetFilteredTypeList()
{
var q = typeof(CVR_TriggerAniBase).Assembly.GetTypes()
.Where(x => !x.IsAbstract)
.Where(x => !x.IsGenericTypeDefinition)
.Where(x => typeof(CVR_TriggerAniBase).IsAssignableFrom(x));
return q;
}
private float value;
public float Value
{
get { return value; }
set
{
if (this.value != value)
{
this.value = value;
ValueChanged?.Invoke(this, new CVR_TriggerElementEventArgs() { triggerElement = this, value = Value });
}
}
}
[HideInInspector]
public CVRTriggerElementEventHandler ElementTrigger;
[HideInInspector]
public CVRTriggerElementEventHandler ValueChanged;
public void Trigger(CVR_InteractableTriggerEventArgs e)
{
if (triggerAniBase == null)
{
OnElementTriggered();
}
else
{
simulationTool = e.triggerTool.GetComponent();
if (triggerAniBase != null && simulationTool != null)
{
Debug.Log("EnterTriggerAni");
isSimulation = true;
triggerAniBase.Init(this, simulationTool);
simulationTool.ExitSimulationMode += ToolCloseSimulation;
}
}
}
private void Update()
{
if (!isActive || !isSimulation || triggerAniBase == null) return;
triggerAniBase.SimulationUpdate();
}
private void OnElementTriggered()
{
Debug.Log("Trigger" + this.name);
ElementTrigger?.Invoke(this, new CVR_TriggerElementEventArgs()
{
triggerElement = this
});
}
///
/// toolOpSimulation结束模拟时关闭当前ToolTarget模拟
///
///
///
protected virtual void ToolCloseSimulation(object sender, CVR_SimulationEventArgs e)
{
simulationTool.ExitSimulationMode -= ToolCloseSimulation;
isSimulation = false;
triggerAniBase.CloseSimulation();
OnElementTriggered();
}
bool IVR_OperationElement.GetActive()
{
return isActive;
}
CVR_ToolType IVR_OperationElement.GetToolType()
{
return toolType;
}
}
}