using System; using System.Collections; using System.Collections.Generic; using ChivaXR; using ChivaXR.Op; using ChivaXR.VR; using EPOOutline; using UnityEngine; public class ProcessState_VRCameraReset : MonoBehaviour, IProcessState { public Transform mainCamera; [Header("自身位置")] public Transform localPoint; [Header("观察目标")] public Transform target; private Outlinable outLinable; private OpTrigger_PlaySoundElement opTriggerPlaySoundElement; public bool resetCameraPos = true; private void Start() { PB_OpData pbOpData = this.gameObject.GetComponent(); OpTrigger_PlaySoundElement opTriggerPlaySoundElement = OperationManager.Instance.GetOpData(pbOpData.opData.operationDataName) as OpTrigger_PlaySoundElement; if (opTriggerPlaySoundElement != null) { opTriggerPlaySoundElement.OperationStatusChanged += OnOperationStatusChanged; } } public void EnterState(bool enterCurrent) { if (resetCameraPos) { InitVRCameraPos(localPoint); } if (target == null) return; if (enterCurrent) { target.gameObject.SetActive(true); outLinable = target.GetComponent() == null ? target.gameObject.AddComponent() : target.GetComponent(); OutLineManager.Instance.ResetOutLinableByType(outLinable, OutLineType.hint); outLinable.enabled = true; }else { if (outLinable != null) { outLinable.enabled = false; } } } public void ExitState() { if (target == null) return; if (outLinable) { outLinable.enabled = false; } target.gameObject.SetActive(false); } public void HalfQuit() { } public void OnOperationStatusChanged(object sender, OperationEventArgs e) { if (e.opData.OperationStatus == OperationDataStatus.InActive) { if (outLinable) { outLinable.enabled = true; } } } public void InitVRCameraPos(Transform initPoint) { RoamCameraController tmpContrl = mainCamera.GetComponent(); OperationStepDataInfo tmpInfo = DAL.Instance.Get().GetOperationStepDataInfoById(ProcessManagement.Instance.currentStepID); if (tmpInfo != null) { if (string.IsNullOrEmpty(tmpInfo.position)) { if (initPoint == null) return; RoamCameraController.Instance.SetCameraState(initPoint.position, initPoint.eulerAngles); } else { RoamCameraController.Instance.SetCameraState(LUtilitys.ParseVector3(tmpInfo.position), LUtilitys.ParseVector3(tmpInfo.rotation)); } } else { if (initPoint == null) return; RoamCameraController.Instance.SetCameraState(initPoint.position, initPoint.eulerAngles); } } [ContextMenu("根据PB生产目标及观察位置")] public void ConfigTarget() { PB_OpData pbOpData = this.gameObject.GetComponent(); //OpTrigger_ToolPack opTrigger_ToolPack = //OperationManager.Instance.GetOpData(pbOpData.opData.operationDataName) as OpTrigger_ToolPack; OpTrigger_ToolPack opTrigger_ToolPack = OperationManager.Instance.GetOpData(pbOpData.opData.operationDataName).gameObject.GetComponent(); if (opTrigger_ToolPack != null) { if (opTrigger_ToolPack.targetObjs.Count > 0) { target = opTrigger_ToolPack.targetObjs[0].transform; if (localPoint == null) localPoint = new GameObject("CameraPoint").transform; localPoint.transform.parent = this.transform; //localPoint.transform.position = opTrigger_ToolPack.targetObjs[0].transform.Find("HintPoint").position; //localPoint.LookAt(target, Vector3.up); Transform targetPoint = opTrigger_ToolPack.targetObjs[0].transform.GetComponentInChildren().transform; Bounds bound = GetBounds(targetPoint); localPoint.transform.position = targetPoint.position + (targetPoint.position - new Vector3(0, targetPoint.position.y - 0.3f, 0)).normalized * (bound.size.magnitude < 0.8f ? 0.8f : bound.size.magnitude); Debug.Log(bound.center + "--" + bound.extents); localPoint.LookAt(targetPoint.position, Vector3.up); } } else { //DestroyImmediate(this.GetComponent()); } } /// /// 获取Transform及其子级的包围盒(MeshRenderer),若MeshRenderer包围盒长度为0,则获取BoxCollider包围盒 /// /// /// private static Bounds GetBounds(Transform transform) { Quaternion oldRotation = Quaternion.identity; bool boundsInitialized = false; //Bounds bounds = new Bounds(transform.position, Vector3.zero); Bounds bounds = new Bounds(); Renderer[] renderers = transform.GetComponentsInChildren(); foreach (Renderer renderer in renderers) { if (!boundsInitialized) { bounds = new Bounds(renderer.transform.position, Vector3.zero); boundsInitialized = true; } bounds.Encapsulate(renderer.bounds); } if (bounds.size.magnitude == 0) { BoxCollider[] colliders = transform.GetComponentsInChildren(); foreach (BoxCollider collider in colliders) { if (!boundsInitialized) { bounds = new Bounds(collider.transform.position, Vector3.zero); boundsInitialized = true; } bounds.Encapsulate(collider.bounds); } } return bounds; } }