Exemplo n.º 1
0
    public void Start()
    {
        // loadMouseTexture();
        raycast = gameObject.GetComponent <ScreenRaycast>();
        switchToState(MouseState.HeroControl, true);

        Initialize.onApplicationFocusChangeEvent.AddListener(OnApplicationFocusChangeEvent);
    }
Exemplo n.º 2
0
    private void updateOutline(SelectEffect effect)
    {
        if (effect == null)
        {
            return;
        }

        ICollection <U3D_Render.EntityView> all_entities = EntityFactory.GetEntityList();

        foreach (U3D_Render.EntityView ev in all_entities)
        {
            if (ev == null)
            {
                continue;
            }

            int entity_id = ev.ID;


            if (!ev.gameObject)
            {
                continue;
            }
            int layer = ev.gameObject.layer;
            if (0 == ((1 << layer) & m_selectLayerFilter))
            {
                continue;
            }


            bool select = (ScreenRaycast.checkTargetFilter(ev, m_nTargetFilter));
            select = select && (effect.isInArea(ev.gameObject.transform.position));
            if (select)
            {
                if (!m_outlineList.Contains(entity_id))
                {
                    ev.StateMachine.outLineCount++;
                    m_outlineList.Add(entity_id);
                }
            }
            else
            {
                if (m_outlineList.Contains(entity_id))
                {
                    ev.StateMachine.outLineCount--;
                    m_outlineList.Remove(entity_id);
                }
            }
        }
    }
Exemplo n.º 3
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.º 4
0
        /// <summary>
        /// 绑定主角组件
        /// </summary>
        /// <returns></returns>
        private bool BindHeroComponent()
        {
            Trace.Log("BindHeroComponent() -> Hero, id=" + ID.ToString());

            CreatureProperty property = this.Property;
            BaseStateMachine fsm      = this.StateMachine;

            if (property == null || fsm == null)
            {
                Trace.Log("BindHeroComponent failed. CreatureProperty==null or BaseStateMachine == null !!!");
                return(false);
            }

            m_gameObject.layer = LayerMask.NameToLayer(Config.LayerHero);
            fsm.baseLayer      = LayerMask.NameToLayer(Config.LayerHero);
            fsm.pickableCount  = 1;
            fsm.isNotAttack    = false;
            MouseCtrl mousectrl = m_gameObject.GetComponent <MouseCtrl>();

            if (mousectrl == null)
            {
                mousectrl = m_gameObject.AddComponent <MouseCtrl>();
            }
            m_DynamicCommopnent.AddLast(mousectrl);
            SkillCtrl skillctrl = m_gameObject.GetComponent <SkillCtrl>();

            if (skillctrl == null)
            {
                skillctrl = m_gameObject.AddComponent <SkillCtrl>();
                skillctrl.resetOrderset(0);//property.SkillOrderSetName);
            }
            m_DynamicCommopnent.AddLast(skillctrl);
            ScreenRaycast raycast = m_gameObject.GetComponent <ScreenRaycast>();

            if (raycast == null)
            {
                raycast = m_gameObject.AddComponent <ScreenRaycast>();
            }
            m_DynamicCommopnent.AddLast(raycast);

            fsm.isHero     = true;
            fsm.canControl = true;

            SoldierController soliderController = m_gameObject.GetComponent <SoldierController>();

            if (soliderController == null)
            {
                soliderController = m_gameObject.AddComponent <SoldierController>();
            }
            m_DynamicCommopnent.AddLast(soliderController);

            if (StageManager.Instance.CurPermissionState == EStage_PermissionState.ESPS_OB)
            {
                OBController obController = m_gameObject.GetComponent <OBController>();
                if (obController == null)
                {
                    obController = m_gameObject.AddComponent <OBController>();
                }

                m_DynamicCommopnent.AddLast(obController);
            }

            fsm.maxRunForwardSpeed  = property.runSpeed_Forward;
            fsm.maxRunBackwardSpeed = property.runSpeed_Back;
            fsm.maxRunSidewaySpeed  = property.runSpeed_LeftRight;

            //ScreenCastLayer screenCastLayer = m_gameObject.GetComponent<ScreenCastLayer>();
            //if (screenCastLayer != null)
            //{
            //    screenCastLayer.setHero(true);
            //    GameObject.ResNode.DestroyRes(ref screenCastLayer);
            //}

            return(true);
        }
Exemplo n.º 5
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.º 6
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;
    }
Exemplo n.º 7
0
    void RotateByCamera()
    {
        if (bindSoldierCamera == null || m_pFSM == null || !m_pFSM.SkinConfig || !bindSoldierCamera.CurrentCamera)
        {
            return;
        }
        Transform tcam = bindSoldierCamera.CurrentCamera.transform;

        m_pFSM.inputMoveDirection    = new Vector3(0, 0, 0);
        m_pFSM.rawInputMoveDirection = tcam.TransformDirection(inputDir);

        if (dead == true) //被各种控制着不动角色
        {
            return;
        }

        if (!m_pFSM.SkinConfig.RootAReplace && m_pFSM.animatorCtrl.bDoingAttackMove)//不能移动
        {
            return;
        }

        float mode = controlmode;

        if (m_pFSM.isFloating())
        {
            mode = 3;
        }

        bool      freerotate = false;
        MouseCtrl mouseCtrl  = MouseCtrl.Instance;

        if (mouseCtrl != null)
        {
            freerotate = SoldierCamera.MainInstance().cameraMode == CameraMode.FPSMode;
        }

        if (m_pFSM.animatorCtrl.ana && m_pFSM.animatorCtrl.ana.isInitialized)
        {
            m_pFSM.animatorCtrl.ana.SetBool(hashid_frontMode, !(mode == 2 || (mode == 1 && freerotate)));
            //if (SoldierCamera.MainInstance<SoldierCamera>().cameraMode == SoldierCamera.CameraControlMode.FPSMode)
            //{
            //    m_pFSM.animatorCtrl.ana.SetBool(hashid_frontMode,false);
            //}
        }

        if (mode == 1)
        {
            desireAngle.x = 0.0f;
            desireAngle.z = 0.0f;
            if (moveDir.sqrMagnitude > 0.001f || freerotate)
            {
                Vector3 baseright   = tcam.right;
                Vector3 baseup      = tcam.up;
                Vector3 baseforward = tcam.forward;

                Vector3 worlddir = (moveDir.x * baseright + moveDir.z * baseforward);
                worlddir.y = 0.0f;
                worlddir   = worlddir.normalized;

                if (canRotate()) //bSkillingPauseRotate状态下不随镜头转角度
                {
                    if (freerotate)
                    {
                        desireAngle.y = Mathf.LerpAngle(desireAngle.y, tcam.eulerAngles.y, 0.5f);
                    }
                    else
                    {
                        desireAngle   = Vector3.zero;
                        desireAngle.y = Mathf.Atan2(worlddir.x, worlddir.z) / Mathf.PI * 180.0f;
                    }
                }
                m_pFSM.inputMoveDirection = tcam.TransformDirection(moveDir);
            }
        }
        else if (mode == 2)
        {
            desireAngle.x = 0.0f;
            desireAngle.z = 0.0f;
            if (canRotate())
            {
                if (sr == null)
                {
                    sr = GetComponent <ScreenRaycast>();
                }
                //在做攻击动作的时候不随鼠标转向,此功能于2016年5月10日期屏蔽(陈伍宏)
                //if ((!m_pFSM.animatorCtrl.bAnimatorAttack) && ((sr != null) && (sr.targetObject != gameObject)))
                if ((sr != null) && (sr.targetObject != gameObject))
                {
                    //mode2的时候选中自己就不转了,不然会原地旋转
                    Vector3 worlddir = sr.targetPos - gameObject.transform.position;
                    if (worlddir != Vector3.zero)
                    {
                        desireAngle   = Vector3.zero;
                        desireAngle.y = Mathf.Atan2(worlddir.x, worlddir.z) / Mathf.PI * 180.0f;
                    }
                }
            }
            m_pFSM.inputMoveDirection = tcam.TransformDirection(moveDir);
        }
        else
        {
            desireAngle = tcam.eulerAngles;
            m_pFSM.inputMoveDirection = tcam.TransformDirection(moveDir);
            Vector3 oldVel   = m_pFSM.getVelocity();
            Vector3 newVel   = m_pFSM.inputMoveDirection * oldVel.magnitude;
            float   sinAngle = -Vector3.Dot(newVel, transform.right);
            if (sinAngle > 0.8f)
            {
                sinAngle = 0.8f;
            }
            if (sinAngle < -0.8f)
            {
                sinAngle = -0.8f;
            }
            float deltaAngle = Mathf.Asin(sinAngle) / Mathf.PI * 180.0f;
            desireAngle.z = deltaAngle;
        }
    }