using System.Collections; using System.Collections.Generic; using UnityEngine; using System; using UnityEngine.UI; public class AimCrossHair : MonoBehaviour { public Camera mainCamera; [HideInInspector] public PlayerType playerType = PlayerType.FirstPlayer; [NonSerialized] public bool outboundLeft; [NonSerialized] public bool outboundRight; [NonSerialized] public bool outboundUp; [NonSerialized] public bool outboundDown; private bool visiable = false; void Start() { int currentShootLevel = UserSettings.ins.shootLevel; shootBackTime = new int[] { 0, 2, 5 }[currentShootLevel]; shootOffsetAngleScale = new float[] { 0, 10f, 10f }[currentShootLevel]; } void OnDestroy() { } void Update() { SetVisiable(onlyShow && GameController.ins.GetArmBowDoublePlayer(playerType).IsCanShoot()); //if (GetPlayerIndex() == 0) //{ // UpdatePositionByModuleRotation(mouseTest.Update(0),new Vector4(0,Screen.width*0.5f,Screen.height,0)); //} //else if (GetPlayerIndex() == 1) //{ // UpdatePositionByModuleRotation(mouseTest.Update(1), new Vector4(Screen.width*0.5f, Screen.width, Screen.height, 0)); //} //if (GameController.ins.gameStart && !GameController.ins.gameOver) //{ // transform.localScale = Vector3.one; //} //else transform.localScale = Vector3.zero; } private bool onlyShow = true; public void SetOnlyShow(bool onlyShow) { this.onlyShow = onlyShow; } public bool GetOnlyShow() { return this.onlyShow; } int GetPlayerIndex() { return playerType == PlayerType.FirstPlayer ? 0 : 1; //Array.IndexOf(GameController.ins.aimCrossHairs, this); } //MouseTest mouseTest = new MouseTest(); class MouseTest { Quaternion quat = Quaternion.identity; float moveSensitivity = 30; public Quaternion Update(int type) { if (type == 0) { if (Input.GetKey(KeyCode.A)) { quat = Quaternion.AngleAxis(-moveSensitivity * Time.deltaTime, Vector3.up) * quat; } else if (Input.GetKey(KeyCode.D)) { quat = Quaternion.AngleAxis(moveSensitivity * Time.deltaTime, Vector3.up) * quat; } else if (Input.GetKey(KeyCode.W)) { quat = Quaternion.AngleAxis(-moveSensitivity * Time.deltaTime, Vector3.right) * quat; } else if (Input.GetKey(KeyCode.S)) { quat = Quaternion.AngleAxis(moveSensitivity * Time.deltaTime, Vector3.right) * quat; } } else if (type == 1) { if (Input.GetKey(KeyCode.LeftArrow)) { quat = Quaternion.AngleAxis(-moveSensitivity * Time.deltaTime, Vector3.up) * quat; } else if (Input.GetKey(KeyCode.RightArrow)) { quat = Quaternion.AngleAxis(moveSensitivity * Time.deltaTime, Vector3.up) * quat; } else if (Input.GetKey(KeyCode.UpArrow)) { quat = Quaternion.AngleAxis(-moveSensitivity * Time.deltaTime, Vector3.right) * quat; } else if (Input.GetKey(KeyCode.DownArrow)) { quat = Quaternion.AngleAxis(moveSensitivity * Time.deltaTime, Vector3.right) * quat; } } return quat; } } Quaternion currentRotation = Quaternion.identity; public void UpdatePositionByModuleRotation(Quaternion moduleRotation,Vector4 bound) { // 限制模块欧拉角范围 Vector3 moduleAngles = moduleRotation.eulerAngles; moduleAngles.x = Mathf.Clamp(moduleAngles.x > 180 ? moduleAngles.x - 360 : moduleAngles.x, -80, 80); moduleAngles.y = Mathf.Clamp(moduleAngles.y > 180 ? moduleAngles.y - 360 : moduleAngles.y, -80, 80); moduleRotation = Quaternion.Euler(moduleAngles); currentRotation = moduleRotation; // 计算准心的世界旋转 Quaternion rotation = mainCamera.transform.rotation * moduleRotation; // 计算准心的世界方向 Vector3 direction = rotation * Vector3.forward; // 计算准心的世界坐标 Vector3 position = mainCamera.transform.position + direction; // 转为屏幕坐标 Vector3 screenPos = mainCamera.WorldToScreenPoint(position); // 标记是否超出屏幕边界 outboundLeft = screenPos.x < bound.x;//0 outboundRight = screenPos.x > bound.y;//Screen.width outboundUp = screenPos.y > bound.z;//Screen.height outboundDown = screenPos.y < bound.w; //0 // 根据需要的范围进行限制 screenPos.x = Mathf.Clamp(screenPos.x, bound.x, bound.y); //x->y screenPos.y = Mathf.Clamp(screenPos.y, bound.w, bound.z); //w->z // 设置准心的位置 //transform.position = screenPos; } //射箭姿态记录索引倒退数,根据射击难度制造误差 [NonSerialized] public int shootBackTime = 0; [NonSerialized] public float shootOffsetAngleScale = 0; //过去几帧的镜头值记录 // Quaternion[] cameraRotations = new Quaternion[6]; // int cameraRotationHasRecordCount = 0; public RaycastHit GetRaycastHit() { float maxDistance = 100; int layerMask = 1 << 8; //TargetLayerMask if (GetPlayerIndex() == 0) { layerMask = 1 << 6; // Target1 } else if (GetPlayerIndex() == 1) { layerMask = 1 << 7; // Target2 } RaycastHit raycastHit; Ray ray = mainCamera.ScreenPointToRay(crosshairTran.position, Camera.MonoOrStereoscopicEye.Mono); Debug.DrawRay(ray.origin, ray.direction * 1000, Color.yellow,5); Physics.Raycast(ray.origin, ray.direction, out raycastHit, maxDistance, layerMask); //UnityEditor.EditorApplication.isPaused = true; return raycastHit; } private void ChangeLayer(Transform transform, string layer) { if (transform.childCount > 0)//如果子物体存在 { for (int i = 0; i < transform.childCount; i++)//遍历子物体是否还有子物体 { ChangeLayer(transform.GetChild(i), layer);//这里是只将最后一个无子物体的对象设置层级 } transform.gameObject.layer = LayerMask.NameToLayer(layer);//将存在的子物体遍历结束后需要把当前子物体节点进行层级设置 } else //无子物体 { transform.gameObject.layer = LayerMask.NameToLayer(layer); } if (transform.name == "_hunse_jian") { Debug.Log(transform.gameObject.layer); } } #region 更新中心准心 RectTransform _parentRTF; RectTransform parentRTF { get { if (!_parentRTF) { _parentRTF = transform.parent.GetComponent(); } return _parentRTF; } } Vector3 centerPoint = new Vector3(0, 1, 0); Vector3 targetPosition; public Transform crosshairTran; public void UpdatePostionWhenFixedCamera(BowCameraDoublePlayer bowCameraDoublePlayer) { //if (!visiable) return; Transform transform = bowCameraDoublePlayer.transform; Ray ray = new Ray(transform.position, transform.forward); RaycastHit hitInfo; if (Physics.Raycast(ray, out hitInfo, 100)) { targetPosition = hitInfo.point; } else { targetPosition = transform.position + transform.forward * 100f; } Vector3 v3 = bowCameraDoublePlayer.bowCameraFixed.camera.WorldToViewportPoint(targetPosition) - centerPoint; v3.x *= parentRTF.rect.width * 0.5f; v3.y *= parentRTF.rect.height; v3.z = 0; crosshairTran.localPosition = v3; action_UpdatePostionWhenFixedCamera?.Invoke(); } public System.Action action_UpdatePostionWhenFixedCamera; //设置准心显示或者隐藏 void SetVisiable(bool value) { if (this.visiable == value) return; this.visiable = value; crosshairTran.GetComponent().enabled = this.visiable; } /// /// 同步GetOnlyShow /// public void SyncVisiable() { this.visiable = GetOnlyShow(); crosshairTran.GetComponent().enabled = this.visiable; } public void openDisplayToCenter() { if (GetPlayerIndex() == 0) { crosshairTran.transform.localPosition = new Vector3(0.25f * parentRTF.rect.width, -parentRTF.rect.height * 0.5f, 0); } else if (GetPlayerIndex() == 1) { crosshairTran.transform.localPosition = new Vector3(0.25f * parentRTF.rect.width, -parentRTF.rect.height * 0.5f, 0); } } #endregion }