Exemplo n.º 1
0
        // 计算英雄与附近玩家目标角度并映射到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);
        }
Exemplo n.º 2
0
    //自动导航镜头
    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;//如果用户操作了暂停自动导航一会
        }
    }
Exemplo n.º 3
0
    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;
    }