// 计算英雄与附近玩家目标角度并映射到UI上 private void GetQueryTarget(Int32 entityID, Transform TargetEntityTrans) { Transform CameraTransform = SoldierCamera.MainInstance <SoldierCamera>().getCameraTransform(); if (CameraTransform == null) { return; } if (EntityFactory.MainHero == null) { return; } float checkDis = Vector3.Distance(TargetEntityTrans.position, EntityFactory.MainHero.transform.position); if (checkDis > EntityFactory.MainHeroView.Sight || ScreenRaycast.isInScreen(TargetEntityTrans.position)) { return; } Vector3 vecHeroPos = EntityFactory.MainHeroView.gameObject.transform.position; Vector3 DirHeroToTarget = TargetEntityTrans.position - vecHeroPos; Vector3 DirHeroToCamera = CameraTransform.position - vecHeroPos; DirHeroToTarget.y = 0; DirHeroToCamera.y = 0; // 判断目标在相机的左右方, -1左方, +1右方 Vector3 vecCross = Vector3.Cross(DirHeroToTarget.normalized, DirHeroToCamera.normalized); float fLorR = Mathf.Sign(-vecCross.y); // 计算之间的夹角 float angle = Vector3.Angle(DirHeroToTarget.normalized, DirHeroToCamera.normalized); float relAngle = (angle * fLorR + 90) % 360; UIBillboardQueryResult qr = new UIBillboardQueryResult(); qr.entityID = entityID; qr.x = BillboardRadius * (Mathf.Cos(Mathf.Deg2Rad * (relAngle))); qr.y = -BillboardRadius * (Mathf.Sin(Mathf.Deg2Rad * (relAngle))); //在这个角度范围内图标水平移动 if (relAngle > BillboardAngle && relAngle < BillboardAngle + 120) { qr.y = -BillboardRadius * (Mathf.Sin(Mathf.Deg2Rad * BillboardAngle)); } qr.distance = Convert.ToUInt32(checkDis); qr.angle = Convert.ToInt32(relAngle + 90); tmpAroundEntitys.Add(qr); }
//自动导航镜头 public void NavNormally() { if (m_Camera != Initialize.mainCam) { return; } if (soldier != null && soldier.gameObject) { return; } if (camCtrl == null) { return; } if (NavMode == CameraNavMode.Follow) { bool reached = false; SetUserDesireAngleY(CameraUtil.approximateAngleFloat(this, m_userDesireAngle.y, soldier.gameObject.transform.eulerAngles.y, followNavFactor, ref reached)); } if (NavMode == CameraNavMode.Nav) { if (!bNavRun) { StartCoroutine(NavEnumerator()); ////这个类不是monobehaviour } } else { NavPauseTime = Time.time; } if (NavMode == CameraNavMode.Target) { if (soldier != null && m_navTragetTransform) { bool reached = false; if (ScreenRaycast.isInScreen(m_navTragetTransform.position, 0.1f)) { reached = true; //比较正中就停止了 } else { Vector3 direction = m_navTragetTransform.position - soldier.gameObject.transform.transform.position; direction.y = 0; direction.Normalize(); float angle = Mathf.Rad2Deg * (Mathf.Atan2(direction.x, direction.z)); SetUserDesireAngleY(CameraUtil.approximateAngleFloat(this, m_userDesireAngle.y, angle, 0.0f, ref reached, 10.0f)); } if (reached) { //转到想要的角度 exitNavMode(NavMode); } } else { //自己或者目标已被删除 exitNavMode(NavMode); } } else if (NavMode == CameraNavMode.FloatingAngle) { bool reached = false; SetUserDesireAngleX(CameraUtil.approximateAngleFloat(this, m_userDesireAngle.x, m_navTargetAngle.x, followNavFactor * 2.0f, ref reached)); if (reached) { exitNavMode(NavMode); } } if (mouseCtrl && mouseCtrl.cameraRotateButton && camCtrl.canCameraRotate()) { NavPauseTime = Time.time;//如果用户操作了暂停自动导航一会 } }
private Vector3 m_navTargetAngle = Vector3.zero; //转向指定角度 public void enterNavMode(CameraNavMode enterNavMode, Transform refTransform, Vector3 refAngle) { if (camCtrl == null) { return; } if (enterNavMode == CameraNavMode.Follow) { m_navModeFollowCount++; } if (NavMode > enterNavMode) { return; //正在进行优先级更高的操作,直接挡掉了 } if (enterNavMode == CameraNavMode.Target) { if (refTransform) { if (m_navTragetTransform == refTransform) { //已经跟踪在旋转了,直接退了吧 return; } Vector3 direction = refTransform.position - soldier.gameObject.transform.transform.position; if (direction.magnitude > rotateStartMaxDistance || direction.magnitude < rotateStartMinDistance) { return; //距离限制不开启 } if (ScreenRaycast.isInScreen(refTransform.position)) { return; //在屏幕内的不开启 } direction.y = 0; direction.Normalize(); float angle = Mathf.Rad2Deg * (Mathf.Atan2(direction.x, direction.z)); float detaAngle = Mathf.DeltaAngle(m_userDesireAngle.y, angle); if (Mathf.Abs(detaAngle) <= rotateStartAngle) //小于rotateStartAngle度不开启 { return; } if (enterNavMode != NavMode) //刚进入此模式,从初速度开始旋转 { m_approximageRotateSpeed = rotateStartSpeed; } m_navTragetTransform = refTransform; } else { if (NavMode == enterNavMode) { exitNavMode(NavMode); } return; } } else if (enterNavMode == CameraNavMode.FloatingAngle) { if (refAngle.sqrMagnitude > 0.01f) { m_navTargetAngle = refAngle; } else { exitNavMode(enterNavMode); } } NavMode = enterNavMode; }