using AX.MessageSystem; using System; using System.Collections; using System.Collections.Generic; using UnityEngine; public class QuadCamera : MonoBehaviour { public CloneGameObjInfo info; public Transform target; private Camera myCam; private float height = 1.5f; //查看人员模式下,摄像机高度 private float distance = 2; //查看人员模式下,人与摄像机之间的距离 private float dampTrace = 20.0f; //查看人员模式下,摄像机平滑追踪的变量 private float lookingAtHeight = 2f; private float lookingAtDistance = 5; void Awake() { myCam = GetComponent(); } public void SetTarget(CloneGameObjInfo info) { this.info = info; MessageDispatcher.AddListener("CancelQuadDisplay", DeleteThisCamera); MessageDispatcher.AddListener("OpenFourthG", DisableCameraOpenTransfer); MessageDispatcher.AddListener("QuadrupleMode", DisableCamera); target = EntitiesManager.Instance.GetEntityByID(info.gameObjID).transform; } void OnDestroy() { MessageDispatcher.RemoveListener("CancelQuadDisplay", DeleteThisCamera); MessageDispatcher.RemoveListener("OpenFourthG", DisableCameraOpenTransfer); MessageDispatcher.RemoveListener("QuadrupleMode", DisableCamera); } /// /// 关闭四分屏模式,或四分屏模式下关闭4G图传窗口,则禁用四分屏相机,减少性能消耗 /// /// private void DisableCamera(IMessage obj) { var value = (bool)obj.Data; this.enabled = value; myCam.enabled = value; } private void DisableCameraOpenTransfer(IMessage obj) { var value = (bool)obj.Data; //打开图传面板时,如果不在四分屏模式,则相机和此脚本禁用 //关闭图传面板时,相机和此脚本禁用 if ((/*打开图传面板*/value == true && /*不在四分屏模式*/QuadrupleMode.quadingMode == false) || /*关闭图传面板*/value == false) { this.enabled = false; myCam.enabled = false; return; } //打开图传面板时,在四分屏模式,则相机和此脚本开启 if (value == true && QuadrupleMode.quadingMode == true) { this.enabled = true; myCam.enabled = true; return; } } /// /// 删除此四分相机 /// /// private void DeleteThisCamera(IMessage obj) { var deleteInfo = (CloneGameObjInfo)obj.Data; if (deleteInfo.gameObjID == info.gameObjID) { Destroy(gameObject); } else { StartCoroutine(UpdateName()); } } IEnumerator UpdateName() { yield return new WaitForEndOfFrame(); gameObject.name = "QuadCam-" + transform.GetSiblingIndex().ToString(); } void LateUpdate() { //有目标人员并且相机当前激活 if (target && myCam.enabled == true) { //相机的位置,在人员胸前 transform.position = Vector3.Lerp(transform.position, target.position + (target.forward * distance) + (Vector3.up * height), Time.deltaTime * dampTrace); //transform.LookAt(target.position); transform.LookAt(target.position + (target.forward * lookingAtDistance) + (Vector3.up * lookingAtHeight)); } } }