125 lines
3.8 KiB
C#
125 lines
3.8 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;
|
|
|
|
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>();
|
|
colorToggle.Init(Utility.ToColor(body.toggle.color.isOn), 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
|
|
{
|
|
colorToggle?.SetColor(isOn);
|
|
objDrag = gameObject.GetOrAddComponent<ObjDrag>();
|
|
objDrag.OnDragEnd.AddListener(obj =>
|
|
{
|
|
Body3DController.Instance.AddMoveObj(gameObject);
|
|
});
|
|
RefreshDrag();
|
|
TypeEventSystem.Global.Send<OnBody3DSelected>(new OnBody3DSelected() { isOn = isOn, obj = gameObject });
|
|
if (isOn)
|
|
{
|
|
TypeEventSystem.Global.Register<OnBody3DDragChanged>(OnBody3DDragHandler);
|
|
}
|
|
else
|
|
{
|
|
TypeEventSystem.Global.UnRegister<OnBody3DDragChanged>(OnBody3DDragHandler);
|
|
}
|
|
}
|
|
|
|
});
|
|
}
|
|
|
|
}
|
|
}
|
|
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);
|
|
}
|
|
else
|
|
{
|
|
Show3DCamera.instance.FocusObj(gameObject.transform.position);
|
|
}
|
|
}
|
|
}
|
|
|
|
private void OnBody3DDragHandler(OnBody3DDragChanged drag)
|
|
{
|
|
RefreshDrag();
|
|
}
|
|
|
|
public void RefreshDrag()
|
|
{
|
|
if (objToggle != null && objDrag != null)
|
|
{
|
|
objDrag.isOn = objToggle.isOn && Body3DController.Instance.CheckStatus(Body3DController.Status.Drag);
|
|
}
|
|
}
|
|
}
|