using System; using UnityEngine; using UnityEngine.EventSystems; /* 弓的相机 */ public class BowCamera : MonoBehaviour { //相机组件 Camera _cameraComp; Camera cameraComp { get { if (!_cameraComp) _cameraComp = GetComponent(); return _cameraComp; } } //控制的手臂弓 ArmBow _armBow; ArmBow armBow { get { if (!_armBow) _armBow = GetComponentInChildren(); return _armBow; } } //本地欧拉角记录值 Vector3 localEulerAngles; //触摸检测器 JC.Unity.TouchChecker touchChecker = new JC.Unity.TouchChecker(); //触摸模式开关 private static bool _isTouchMode = true; public static bool isTouchMode { get { if (CommonConfig.isReleaseVersion) return false; return _isTouchMode; } set { _isTouchMode = value; } } //禁止逻辑,只用于同步状态和渲染,目前用于联机 [NonSerialized] public bool banLogic = false; private static BowCamera _ins; public static BowCamera ins { get { if (!_ins) { _ins = GameObject.FindObjectOfType(); } return _ins; } } void Awake() { _ins = this; localEulerAngles = transform.localEulerAngles; RecordDefaultCameraFieldOfView(); if (UserSettings.ins.bowCameraFixed && !CommonConfig.isReleaseVersion) { bowCameraFixed = new BowCameraFixed(this); } } void Start() { touchChecker.onMoved += delegate(Touch t, bool isOnUI) { if (banLogic) return; if (isOnUI) return; //触摸控制镜头和拉弓射箭 this.localEulerAngles.x = Mathf.Clamp(this.localEulerAngles.x - t.deltaPosition.y * Time.deltaTime * 5, -80, 80); this.localEulerAngles.y = Mathf.Clamp(this.localEulerAngles.y + t.deltaPosition.x * Time.deltaTime * 5, -90, 90); this.transform.localEulerAngles = this.localEulerAngles; }; touchChecker.onEnded += delegate(Touch t, bool isOnUI) { if (banLogic) return; if (!isOnUI) armBow.ADS_fire(); }; } void Update() { //更新相机视野 if (cameraComp && !banCameraFieldOfView) { cameraComp.fieldOfView = cameraFieldOfView; } if (banLogic) return; //满足以下条件则阻止控制输入 if (GameMgr.ins.gameOver) { return; } if (GameMgr.debugInEditor) { //鼠标控制镜头和拉弓射箭 this.localEulerAngles.x = Mathf.Clamp(this.localEulerAngles.x - 2f * Input.GetAxis("Mouse Y"), -80, 80); this.localEulerAngles.y = Mathf.Clamp(this.localEulerAngles.y + 2f * Input.GetAxis("Mouse X"), -90, 90); this.transform.localEulerAngles = this.localEulerAngles; if (EventSystem.current.IsPointerOverGameObject()) return; } else if (isTouchMode) { touchChecker.Update(); } else { if (SB_EventSystem.ins && SB_EventSystem.ins.simulateMouseIsAwaked) return; //需要-镜头看向九轴姿态虚拟节点 needLookAtPoint = true; } } //需要-镜头看向九轴姿态虚拟节点? bool needLookAtPoint = false; //镜头旋转转换比值 float[] _bowRotateConvertRate = null; float bowRotateConvertRate { get { if (_bowRotateConvertRate == null) { _bowRotateConvertRate = new float[]{ UserSettings.ins.bowRotateConvert.GetRate() }; } return _bowRotateConvertRate[0]; } } void LateUpdate() { if (needLookAtPoint) { needLookAtPoint = false; //镜头看向九轴姿态虚拟节点 this.transform.LookAt(CameraToLook.ins.point); if (!CommonConfig.isReleaseVersion) { //镜头旋转比值转换 Vector3 localEulerAngles = this.transform.localEulerAngles; float angleY = localEulerAngles.y; if (angleY < 180) { angleY = Mathf.Clamp(angleY * bowRotateConvertRate, 0, 90); } else { angleY = Mathf.Clamp((angleY - 360) * bowRotateConvertRate, -90, 0); } localEulerAngles.y = angleY; this.transform.localEulerAngles = localEulerAngles; } } onAfterLateUpdate?.Invoke(); } Action onAfterLateUpdate; //---------------相机视野的相关操作--------------------- //视野值记录 float cameraFieldOfView = 60; [NonSerialized] public float defaultCameraFieldOfView = 60; private void RecordDefaultCameraFieldOfView() { defaultCameraFieldOfView = cameraComp.fieldOfView; cameraFieldOfView = defaultCameraFieldOfView; } //禁止相机视野改变 [NonSerialized] public bool banCameraFieldOfView = false; public void SetCameraFieldOfView(float value) { cameraComp.fieldOfView = value; } public void SetCameraFieldOfViewRecord(float value) { cameraFieldOfView = value; } //拉弓时的相机视野值变化 public void updateFollowPullBow() { // if (cameraFieldOfView > 40) { // cameraFieldOfView -= 20 * Time.deltaTime; // } else { // cameraFieldOfView = 40; // } } //松开拉弓时的相机视野值变化 public void updateGiveUpPullBow() { // if (cameraFieldOfView < 60) { // cameraFieldOfView += 20 * Time.deltaTime; // } else { // cameraFieldOfView = 60; // } } // 2022-04-28 // ------ 添加固定镜头选项后,新增的API ------ bool isArrowFollowing = false; public void SetArrowFollowing(bool value) { isArrowFollowing = value; cameraComp.enabled = !isArrowFollowing; AutoSwitchCamera(); } bool isScaleAimDisplaying = false; public void SetScaleAimDisplaying(bool value) { isScaleAimDisplaying = value; AutoSwitchCamera(); } void AutoSwitchCamera() { if (bowCameraFixed == null) { cameraComp.enabled = !isArrowFollowing; } else { bowCameraFixed.gameObject.SetActive(!isScaleAimDisplaying && !isArrowFollowing); cameraComp.enabled = isScaleAimDisplaying && !isArrowFollowing; } } public Camera GetRenderCamera() { if (bowCameraFixed == null) { return cameraComp; } else { if (bowCameraFixed.gameObject.activeSelf) { return bowCameraFixed.camera; } else { return cameraComp; } } } BowCameraFixed bowCameraFixed = null; public class BowCameraFixed { public GameObject gameObject; public Transform transform; public Camera camera; private UnityStandardAssets.ImageEffects.Blur blur; //bowCameraComponent BowCamera bowCamera; private Camera targetCamera; private UnityStandardAssets.ImageEffects.Blur targetBlur; public BowCameraFixed(BowCamera bowCamera) { this.bowCamera = bowCamera; gameObject = new GameObject("BowCameraFixed"); transform = gameObject.transform; //复制Camera组件 targetCamera = bowCamera.cameraComp; camera = gameObject.AddComponent(); camera.tag = "MainCamera"; camera.clearFlags = targetCamera.clearFlags; camera.backgroundColor = targetCamera.backgroundColor; camera.cullingMask = targetCamera.cullingMask; camera.fieldOfView = targetCamera.fieldOfView; camera.nearClipPlane = targetCamera.nearClipPlane; camera.depth = targetCamera.depth + 0.1f; camera.renderingPath = targetCamera.renderingPath; //复制Blur组件 targetBlur = bowCamera.GetComponent(); if (targetBlur) { blur = gameObject.AddComponent(); blur.enabled = targetBlur.enabled; blur.blurShader = targetBlur.blurShader; blur.blurSpread = targetBlur.blurSpread; blur.iterations = targetBlur.iterations; } //设置Transform属性 transform.parent = bowCamera.transform.parent; transform.localPosition = bowCamera.transform.localPosition; transform.localScale = bowCamera.transform.localScale; transform.localRotation = Quaternion.identity; //监听和驱动LateUpdate bowCamera.onAfterLateUpdate += LateUpdate; //切换镜头 bowCamera.AutoSwitchCamera(); } void LateUpdate() { if (gameObject.activeSelf) { CrossHair.ins.UpdatePostionWhenFixedCamera(); } if (blur) { blur.enabled = targetBlur.enabled; if (blur.enabled) { blur.blurShader = targetBlur.blurShader; blur.blurSpread = targetBlur.blurSpread; blur.iterations = targetBlur.iterations; } } } } }