VirtualFramework/Assets/Scripts/Item/Body3DOjbItem.cs
2025-03-17 14:51:03 +08:00

145 lines
4.5 KiB
C#

using QFramework;
using QFramework.Example;
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using XMLTool;
public class Body3DOjbItem : MonoBehaviour
{
public Body3D.Body body;
public ObjectToggle objToggle;
ObjDrag objDrag;
// 记录上一次鼠标按下的时间
private float lastClickTime;
// 双击的时间间隔阈值
private const float doubleClickTimeThreshold = 0.3f;
private void Awake()
{
}
public void Init(Body3D.Body body)
{
this.body = body;
if (body.subBody == null || body.subBody.Count == 0)
{
if (body.toggle != null)
{
objToggle = gameObject.GetOrAddComponent<ObjectToggle>();
ObjectColorToggle colorToggle = null;
if (body.toggle.color != null)
{
colorToggle = gameObject.GetOrAddComponent<ObjectColorToggle>();
if (string.IsNullOrEmpty(body.toggle.color.isOn) == false)
{
colorToggle.isOnColor = Utility.ToColor(body.toggle.color.isOn);
}
if (string.IsNullOrEmpty(body.toggle.color.isOff) == false)
{
colorToggle.isOffColor = Utility.ToColor(body.toggle.color.isOff);
}
}
objToggle.OnValueChanged.AddListener(isOn =>
{
if (Body3DController.Instance.CheckStatus(Body3DController.Status.Active))
{
if (isOn == true)
{
gameObject.SetActive(false);
Body3DController.Instance.AddActiveObj(gameObject);
}
}
else
{
if (colorToggle != null)
{
if (isOn)
{
colorToggle.SetColor(ObjectColorToggle.State.On);
}
else
{
colorToggle.SetColor(ObjectColorToggle.State.Off);
}
}
objDrag = gameObject.GetOrAddComponent<ObjDrag>();
objDrag.OnDragEnd.AddListener(obj =>
{
Body3DController.Instance.AddMoveObj(gameObject);
});
RefreshDrag();
if (isOn)
{
TypeEventSystem.Global.Register<OnBody3DDragChanged>(OnBody3DDragHandler);
}
else
{
TypeEventSystem.Global.UnRegister<OnBody3DDragChanged>(OnBody3DDragHandler);
}
}
TypeEventSystem.Global.Send<OnBody3DSelected>(new OnBody3DSelected() { isOn = isOn, obj = gameObject });
});
}
}
}
private void OnMouseDown()
{
// 计算当前时间与上一次点击时间的间隔
float currentTime = Time.time;
if (currentTime - lastClickTime < doubleClickTimeThreshold)
{
// 触发双击事件
OnDoubleClick();
}
lastClickTime = currentTime;
}
public void OnDoubleClick()
{
if (Body3DController.Instance.CheckStatus(Body3DController.Status.Drag))
{
var drag = gameObject.GetComponent<ObjDrag>();
if (drag != null)
{
drag.OnDoubleClick();
}
}
else if (Body3DController.Instance.CheckStatus(Body3DController.Status.Active) == false)
{
float distance = 1;
if (float.TryParse(body.FocusDistance, out distance))
{
Show3DCamera.instance.FocusObj(gameObject.transform.position, distance, 0.5f);
}
else
{
Show3DCamera.instance.FocusObj(gameObject.transform.position, moveTime: 0.5f);
}
}
}
private void OnBody3DDragHandler(OnBody3DDragChanged drag)
{
RefreshDrag();
}
public void RefreshDrag()
{
if (objToggle != null && objDrag != null)
{
objDrag.isOn = objToggle.isOn && Body3DController.Instance.CheckStatus(Body3DController.Status.Drag);
}
}
}