123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202 |
- 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<PB_OpData>();
- 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<Outlinable>() == null
- ? target.gameObject.AddComponent<Outlinable>()
- : target.GetComponent<Outlinable>();
- 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<RoamCameraController>();
- OperationStepDataInfo tmpInfo = DAL.Instance.Get<StepListProxy>().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<PB_OpData>();
- //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<OpTrigger_ToolPack>();
- 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<MeshRenderer>().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<ProcessState_VRCameraReset>());
- }
- }
- /// <summary>
- /// 获取Transform及其子级的包围盒(MeshRenderer),若MeshRenderer包围盒长度为0,则获取BoxCollider包围盒
- /// </summary>
- /// <param name="transform"></param>
- /// <returns></returns>
- 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<Renderer>();
- 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<BoxCollider>();
- foreach (BoxCollider collider in colliders)
- {
- if (!boundsInitialized)
- {
- bounds = new Bounds(collider.transform.position, Vector3.zero);
- boundsInitialized = true;
- }
- bounds.Encapsulate(collider.bounds);
- }
- }
- return bounds;
- }
-
- }
|