Example #1
0
    public Camera GetCurrentCamera_ForBothRuntimeAndEditor()
    {
        MainCameraComponent mainCamComponent = CameraManager.GetInstance().GetMainCamereComponent();

        if (mainCamComponent != null)
        {
            return(mainCamComponent.GetCamera());
        }
        else
        {
            return(Camera.main);
        }
    }
    private Ray GetViewRay()
    {
        MainCameraComponent mainCam = CameraManager.GetInstance().GetMainCamereComponent();

        if (mainCam != null)
        {
            return(new Ray(mainCam.GetPosition(), mainCam.GetForward()));
        }
        else
        {
            return(new Ray());
        }
    }
        /// <summary>
        /// 获取当前主摄像机注视,所选技能最远处的,四元数旋转值
        /// </summary>
        /// <param name="mainCamComponent">主摄像机组件</param>
        /// <param name="d">最远距离</param>
        /// <returns></returns>
        private Crucis.Protocol.Vec4 GetCameraQuaternion(MainCameraComponent mainCamComponent, Vector3 direction, float d)
        {
            if (mainCamComponent == null)
            {
                Leyoutech.Utility.DebugUtility.LogError("目标方向", " 上下文没有摄像机数据");
                return(null);
            }

            //最远点
            Vector3 distantPoint   = Vector3.zero;
            Vector3 playerPosition = m_ISpacecraftSkillProperty.GetRootTransform().position;     //玩家位置
            Vector3 CamPosition    = mainCamComponent.GetPosition();                             //摄像机位置

            Vector3 cameDir       = direction; /*mainCamComponent.GetForward()*/                 //摄像机方向向量
            Vector3 camera2Player = playerPosition - CamPosition;                                //摄像机到玩家的向量
            Vector3 verticalPos   = CamPosition + Vector3.Dot(camera2Player, cameDir) * cameDir; //垂线坐标 = 摄像机坐标+ camera2Player在cameDir投影距离 * cameDir向量
            Vector3 Play2VerticaN = (verticalPos - playerPosition).normalized;                   //玩家到垂线点 的单位向量
            float   Play2VerticaD = Vector3.Distance(verticalPos, playerPosition);               //玩家跟垂线点的距离

            float MaxDis = d;

            if (MaxDis > Play2VerticaD)
            {
                distantPoint = Mathf.Sqrt(MaxDis * MaxDis - Play2VerticaD * Play2VerticaD) * cameDir + verticalPos; //最远点 = 三角函数求得垂线点到最远点向量+ 垂线点坐标
            }
            else
            {
                distantPoint = playerPosition + Play2VerticaN * MaxDis;//垂线上找到距离是 MaxDis 的坐标
            }


            Vector3    Spheredirection  = (distantPoint - m_ISpacecraftSkillProperty.GetRootTransform().position).normalized;        //船到最远处单位方向向量
            Quaternion cameraQuaternion = Quaternion.Euler(Quaternion.FromToRotation(Vector3.forward, Spheredirection).eulerAngles); //欧拉角-->四元数


            Crucis.Protocol.Vec4 vec4 = new Crucis.Protocol.Vec4();
            vec4.X = cameraQuaternion.x;
            vec4.Y = cameraQuaternion.y;
            vec4.Z = cameraQuaternion.z;
            vec4.W = cameraQuaternion.w;

            Vector3 tt = playerPosition + cameraQuaternion * Vector3.forward * d;

            Leyoutech.Utility.DebugUtility.LogWarning("目标方向", string.Format(" 摄像机注视方向射程最远点计算-----> 玩家自己entity = {0}, 玩家坐标:{1} , 计算得到方向 欧拉角 : {2} , 最大射程点坐标:{3}",
                                                                            m_ISpacecraftSkillProperty.EntityId(),
                                                                            playerPosition,
                                                                            cameraQuaternion,
                                                                            distantPoint));

            return(vec4);
        }
Example #4
0
    /// <summary>
    /// 正前方中心点射线选中的目标
    /// </summary>
    /// <returns></returns>
    private BaseEntity GetForwardEntity()
    {
        MainCameraComponent mainCam = CameraManager.GetInstance().GetMainCamereComponent();
        Ray        ray     = new Ray(mainCam.GetPosition(), mainCam.GetForward());
        RaycastHit hitInfo = new RaycastHit();

        if (Physics.Raycast(ray, out hitInfo, m_SkillMaxDistance, LayerUtil.GetLayersIntersectWithSkillProjectile(true)))
        {
            return(hitInfo.collider.attachedRigidbody?.GetComponent <BaseEntity>());
        }
        else
        {
            return(null);
        }
    }
        /// <summary>
        /// 其他上下文或者模块需要携带的数据
        /// </summary>
        private void ContextAddOtherObject()
        {
            //感知目标信息
            m_Context.AddObject <PerceptronTarget>(m_ISpacecraftSkillProperty.GetPerceptronTarget(), true);

            //摄像机信息
            MainCameraComponent mainCamComponent = CameraManager.GetInstance().GetMainCamereComponent();

            m_Context.AddObject <MainCameraComponent>(mainCamComponent, true);

            if (m_ISpacecraftSkillProperty.IsMain())
            {
                //设置引导技能目标变化函数变化委托
                m_ISpacecraftSkillProperty.SetChangeGuideSkillTargetAction(ChangeGuideSkillTargetAction);
            }
        }
Example #6
0
    private void InitCamera()
    {
        Transform transform        = m_Property.GetRootTransform();
        Transform virtualTransform = m_Property.GetVirtualCameraTransform();
        Vector2   axis             = m_Property.GetDefaultCMAxisValue();

        axis.x += transform.localEulerAngles.y;
        MainCameraComponent mainCameraComponent = CameraManager.GetInstance().GetMainCamereComponent();

        mainCameraComponent.SetFollowAndLookAtCMFreeLookAxisValue(MainCameraComponent.CMType.Spacecraft, transform, transform, axis.x, axis.y);
        mainCameraComponent.SetFollowAndLookAt(MainCameraComponent.CMType.Jet, virtualTransform, virtualTransform);
        mainCameraComponent.SetFollowAndLookAt(MainCameraComponent.CMType.JetSpeedUp, virtualTransform, virtualTransform);
        mainCameraComponent.SetFollowAndLookAt(MainCameraComponent.CMType.LeapPrepare, transform, transform);
        mainCameraComponent.SetFollowAndLookAt(MainCameraComponent.CMType.Leaping, transform, transform);
        mainCameraComponent.SetFollowAndLookAt(MainCameraComponent.CMType.LeapFinish, transform, transform);
        mainCameraComponent.SetFollowAndLookAtCMFreeLookAxisValue(MainCameraComponent.CMType.TransferIn, transform, transform, axis.x, axis.y);
    }
Example #7
0
    public override void OnDrawGizmo()
    {
        BattleWeaponBase     battleWeapon = m_SkillProxy.GetCurrentBattleWeapon();
        BattleWeapon_Missile missile      = battleWeapon as BattleWeapon_Missile;

        if (missile == null)
        {
            return;
        }

        MainCameraComponent mainCam = CameraManager.GetInstance().GetMainCamereComponent();

        Gizmos.color  = Color.red;
        Gizmos.matrix = mainCam.transform.localToWorldMatrix;
        Gizmos.DrawFrustum(Vector3.zero, missile.m_Gizmo_FOV, 10, 0.5f, 1);
        Gizmos.matrix = Matrix4x4.identity;
    }
        /// <summary>
        /// 蓄力---->按下begin,抬起通信release,end
        /// </summary>
        /// <param name="skillData"></param>
        private void ToCastAccumulationSkill(SkillData skillData, bool isdown)
        {
            uint        entityId = (uint)m_ISpacecraftSkillProperty.EntityId();
            uint        skillId  = (uint)skillData.Id;
            SkillRPCNet skillRPC = m_Context.GetObject <SkillRPCNet>();

            if (skillRPC == null)
            {
                return;
            }

            if (isdown) //按下
            {
                Leyoutech.Utility.DebugUtility.Log("蓄力", " 按下");

                AccumulationSkill skillA = new AccumulationSkill();
                skillA.AccumulationSkillBegin          = new global::Crucis.Protocol.AccumulationSkillBegin();
                skillA.AccumulationSkillBegin.CasterId = entityId;
                skillA.AccumulationSkillBegin.SkillId  = skillId;
                skillRPC.CreatListenerCastAccumulationSkill(entityId, skillId);
                skillRPC.CastAccumulationSkillWright(entityId, skillId, skillA);
            }
            else //抬起
            {
                Leyoutech.Utility.DebugUtility.Log("蓄力", " 抬起");
                Vector3 direction = Vector3.zero;
                List <Crucis.Protocol.TargetInfo> targetList = m_ISpacecraftSkillProperty.GetPerceptronTarget().GetCurrentTargetInfos(false, out direction, true, skillData.BaseData.Value.TagercalculationType);
                AccumulationSkill skillA = new AccumulationSkill();
                skillA.AccumulationSkillEnd          = new global::Crucis.Protocol.SkillSelectTargetInfo();
                skillA.AccumulationSkillEnd.CasterId = (uint)m_ISpacecraftSkillProperty.EntityId();
                skillA.AccumulationSkillEnd.SkillId  = (uint)skillData.Id;
                skillA.AccumulationSkillEnd.TargetList.Add(targetList);

                MainCameraComponent mainCamComponent = m_Context.GetObject <MainCameraComponent>();
                float d = skillData.BaseData.Value.MaxDistance; //* SceneController.SKILL_PRECISION;
                Crucis.Protocol.Vec4 vec4 = GetCameraQuaternion(mainCamComponent, direction, d);
                skillA.AccumulationSkillEnd.Quat = vec4;

                skillRPC.CastAccumulationSkillWright(entityId, skillId, skillA);

                if (skillData.BaseData.Value.IsNeedTarget && (targetList == null || targetList.Count == 0))
                {
                    StageType = SkillStageType.None;
                }
            }
        }
    /// <summary>
    /// 中心点射线选中的目标
    /// </summary>
    /// <returns></returns>
    private SpacecraftEntity GetTargetSelectedByCenterRay()
    {
        PlayerSkillVO       skillVO     = m_PlayerSkillProxy.GetCurrentWeaponSkill();
        SkillSystemGrow     skillGrow   = skillVO.GetSkillGrow();
        float               maxDistance = skillGrow.Range * SceneController.SPACE_ACCURACY_TO_CLIENT;
        MainCameraComponent mainCam     = CameraManager.GetInstance().GetMainCamereComponent();
        Ray        ray     = new Ray(mainCam.GetPosition(), mainCam.GetForward());
        RaycastHit hitInfo = new RaycastHit();

        if (Physics.Raycast(ray, out hitInfo, maxDistance, LayerUtil.GetLayersIntersectWithSkillProjectile(true)))
        {
            return(hitInfo.collider.attachedRigidbody?.GetComponent <SpacecraftEntity>());
        }
        else
        {
            return(null);
        }
    }
        /// <summary>
        ///吟唱,前摇 ,验证目标,技能是否可继续释放
        /// </summary>
        private void ToCastSingSkill(SkillData skillData)
        {
            MainCameraComponent mainCamComponent = m_Context.GetObject <MainCameraComponent>();
            float d = skillData.BaseData.Value.MaxDistance;//* SceneController.SKILL_PRECISION;

            Vector3 direction = Vector3.zero;
            List <Crucis.Protocol.TargetInfo> targetInfos = m_ISpacecraftSkillProperty.GetPerceptronTarget().GetCurrentTargetInfos(true, out direction, true, skillData.BaseData.Value.TagercalculationType);
            SkillRPCNet skillRPC = m_Context.GetObject <SkillRPCNet>();

            if (skillRPC == null)
            {
                return;
            }

            Crucis.Protocol.Vec4 vec4 = GetCameraQuaternion(mainCamComponent, direction, d);

            skillRPC.CreatListenerCastSkill((uint)m_ISpacecraftSkillProperty.EntityId(), (uint)skillData.Id, targetInfos, vec4);
        }
    private void DrawBoxOnGUI()
    {
        MainCameraComponent mainCam = CameraManager.GetInstance().GetMainCamereComponent();

        if (mainCam == null)
        {
            return;
        }

        for (int iAim = 0; iAim < m_SubAimAreas.Count; iAim++)
        {
            AimArea aimArea = m_SubAimAreas[iAim];
            m_SubAimAreas[iAim].UpdateBaseRay(GetViewRay().direction);
            Vector3 aimDir    = m_SubAimAreas[iAim].GetBaseRay();
            Vector3 pos       = mainCam.GetPosition() + aimDir;
            Vector3 screenPos = mainCam.GetCamera().WorldToScreenPoint(pos);

            GizmosHelper.GetInstance().DrawGUIBox(screenPos, 100);
        }
    }
    private void DrawGizmo()
    {
        MainCameraComponent mainCam = CameraManager.GetInstance().GetMainCamereComponent();

        if (mainCam == null)
        {
            return;
        }

        // 根据当前瞄准方向更新主区域的目标信息
        m_MainAimArea.UpdateBaseRay(GetViewRay().direction);
        Vector3 baseRayPos = mainCam.GetPosition() + m_MainAimArea.GetBaseRay();

        GizmosHelper.GetInstance().DrawCircle(baseRayPos, 0.05f);

        m_MainAimArea.UpdateRayList(false);
        m_MainAimArea.GetRayList(ref m_AimDirectionsCache);
        for (int iRay = 0; iRay < m_AimDirectionsCache.Count; iRay++)
        {
            Vector3 pos = mainCam.GetPosition() + m_AimDirectionsCache[iRay];
            GizmosHelper.GetInstance().DrawCircle(pos, 0.005f);
            GizmosHelper.GetInstance().DrawLine(mainCam.GetPosition(), mainCam.GetPosition() + m_AimDirectionsCache[iRay] * 5);
        }

        // 根据当前瞄准方向更新主区域的目标信息
        for (int iAim = 0; iAim < m_SubAimAreas.Count; iAim++)
        {
            m_SubAimAreas[iAim].UpdateBaseRay(GetViewRay().direction);
            baseRayPos = mainCam.GetPosition() + m_SubAimAreas[iAim].GetBaseRay();
            GizmosHelper.GetInstance().DrawCircle(baseRayPos, 0.05f);

            m_SubAimAreas[iAim].UpdateRayList(false);
            m_SubAimAreas[iAim].GetRayList(ref m_AimDirectionsCache);
            for (int iRay = 0; iRay < m_AimDirectionsCache.Count; iRay++)
            {
                Vector3 pos = mainCam.GetPosition() + m_AimDirectionsCache[iRay];
                GizmosHelper.GetInstance().DrawCircle(pos, 0.005f);
                GizmosHelper.GetInstance().DrawLine(mainCam.GetPosition(), mainCam.GetPosition() + m_AimDirectionsCache[iRay] * 5);
            }
        }
    }
Example #13
0
    /// <summary>
    /// 选中一个新的目标
    /// 1. 与上一帧选中的目标不同
    /// 2. 上一帧选中的目标已经锁定完成, 进行下一轮锁定
    /// </summary>
    /// <returns>是否有新的目标</returns>
    private bool PickNewTarget(out SpacecraftEntity newTarget)
    {
        PlayerSkillVO       skillVO     = m_PlayerSkillProxy.GetCurrentWeaponSkill();
        SkillSystemGrow     skillGrow   = skillVO.GetSkillGrow();
        float               maxDistance = skillGrow.Range * SceneController.SPACE_ACCURACY_TO_CLIENT;
        MainCameraComponent mainCam     = CameraManager.GetInstance().GetMainCamereComponent();
        Ray        ray     = new Ray(mainCam.GetPosition(), mainCam.GetForward());
        RaycastHit hitInfo = new RaycastHit();

        // UNDONE
        // 第一版: 使用屏幕中心射线作为目标选取射线. NOW
        // 第二版: 使用 Physics.BoxCast
        if (Physics.Raycast(ray, out hitInfo, maxDistance, LayerUtil.GetLayersIntersectWithSkillProjectile(true)))
        {
            SpacecraftEntity pickedTarget = hitInfo.collider.attachedRigidbody?.GetComponent <SpacecraftEntity>();
            newTarget = pickedTarget;
            return(true);
        }
        else
        {
            newTarget = null;
            return(false);
        }
    }
    public void ChangeCamera(EnumCMType type)
    {
        if (m_Property.IsMain())
        {
            MainCameraComponent mainCameraComponent = CameraManager.GetInstance().GetMainCamereComponent();
            switch (type)
            {
            case EnumCMType.LeapPrepare:
                mainCameraComponent.RequestChangeCM(MainCameraComponent.CMType.LeapPrepare);
                break;

            case EnumCMType.Leaping:
                mainCameraComponent.RequestChangeCM(MainCameraComponent.CMType.Leaping);
                break;

            case EnumCMType.LeapFinish:
                mainCameraComponent.RequestChangeCM(MainCameraComponent.CMType.LeapFinish);
                break;

            case EnumCMType.Spacecraft:
                if (m_Property.GetMotionMode() == EnumMotionMode.Dof6ReplaceOverload)
                {
                    mainCameraComponent.RequestChangeCM(MainCameraComponent.CMType.Jet);
                }
                else
                {
                    mainCameraComponent.RequestChangeCM(MainCameraComponent.CMType.Spacecraft);
                }
                break;

            default:
                break;
            }
            BehaviorManager.Instance.LogFormat(m_Agent, $"ChangeCamera type:{type}");
        }
    }
Example #15
0
    private bool GetAllEntitySelectedByVirtualCamera(ref List <SpacecraftEntity> targetList)
    {
        MainCameraComponent mainCam = CameraManager.GetInstance().GetMainCamereComponent();

        SkillSystemGrow skillGrow = m_PlayerSkillProxy.GetCurrentWeaponSkill().GetSkillGrow();
        float           range     = skillGrow.Range * SceneController.SPACE_ACCURACY_TO_CLIENT;

        // 粗略的拾取.
        // 拾取锥体视为一个相机, 把技能射程视为远裁剪面. 根据FOV取远裁剪面的大小, 投射这个大小的Box, 获取所有拾取到的Entity
        {
            // 所有粗略裁剪的物体 = Physics.BoxCastAll(投射开始点, 盒子边长, 相机方向, SkillLayer)

            float halfBoxSideLength = range * Mathf.Tan(m_ReticleFOVParam * 0.5f * Mathf.Deg2Rad);
            // 投射开始的点 = 相机近裁剪面的中心点 + 相机方向 * 盒子边长的一半
            Vector3      startPoint = mainCam.transform.position + (mainCam.GetCamera().nearClipPlane + halfBoxSideLength) * mainCam.GetForward();
            RaycastHit[] hitInfos   = Physics.BoxCastAll(startPoint,
                                                         Vector3.one * halfBoxSideLength * 2f,
                                                         mainCam.GetForward(),
                                                         Quaternion.identity, range,
                                                         LayerUtil.GetLayersIntersectWithSkillProjectile(true));

            // TEST GIZMO
            m_Gizmo_BoxStart      = startPoint;
            m_Gizmo_BoxEnd        = startPoint + (mainCam.GetCamera().nearClipPlane + halfBoxSideLength + range) * mainCam.GetForward();
            m_Gizmo_BoxSideLength = halfBoxSideLength * 2f;
            m_Gizmo_FOV           = m_ReticleFOVParam;
            // TEST GIZMO

            for (int iHit = 0; iHit < hitInfos.Length; iHit++)
            {
                Rigidbody rigidBody = hitInfos[iHit].rigidbody;
                if (rigidBody == null)
                {
                    continue;
                }

                SpacecraftEntity entity = rigidBody.GetComponent <SpacecraftEntity>();
                if (entity != null)
                {
                    targetList.Add(entity);
                }
            }
        }

        if (m_VirtualCameraForReticleSelection != null)
        {
            // 更新虚拟相机的方向和位置
            m_VirtualCameraForReticleSelection.transform.position = mainCam.transform.position;
            m_VirtualCameraForReticleSelection.transform.rotation = mainCam.transform.rotation;

            // 更精细的判断. 当前版本仅计算目标中心点是不是在 虚拟相机 里面
            for (int iTarget = 0; iTarget < targetList.Count; iTarget++)
            {
                Vector3 viewportPos = m_VirtualCameraForReticleSelection.WorldToViewportPoint(targetList[iTarget].transform.position);
                if (viewportPos.x < 0 || viewportPos.y < 0 || viewportPos.x > 1 || viewportPos.y > 1)
                {
                    targetList.RemoveAt(iTarget);
                    iTarget--;
                }
            }
        }

        return(targetList.Count > 0);
    }
        /// <summary>
        /// 释放引导技能 guidState : 1 按下,2 改变 ,3 抬起
        /// </summary>
        private void ToCastGuideSkill(SkillData skillData, int guidState)
        {
            SkillRPCNet skillRPC = m_Context.GetObject <SkillRPCNet>();

            if (skillData.ByteBuffer == null || skillRPC == null)
            {
                return;
            }

            uint entityId = (uint)m_ISpacecraftSkillProperty.EntityId();
            uint skillId  = (uint)skillData.Id;

            switch (guidState)
            {
            case 1:     //按下
            {
                Leyoutech.Utility.DebugUtility.Log("引导技能", " 按下");


                GuideSkill guideSkill = new GuideSkill();
                guideSkill.GuideSkill_          = new global::Crucis.Protocol.SkillSelectTargetInfo();
                guideSkill.GuideSkill_.CasterId = (uint)m_ISpacecraftSkillProperty.EntityId();
                guideSkill.GuideSkill_.SkillId  = (uint)skillData.Id;
                Vector3 direction = Vector3.zero;
                guideSkill.GuideSkill_.TargetList.Add(m_ISpacecraftSkillProperty.GetPerceptronTarget().GetCurrentTargetInfos(false, out direction, true, skillData.BaseData.Value.TagercalculationType));
                if (guideSkill.GuideSkill_.TargetList.Count == 0)
                {
                    Leyoutech.Utility.DebugUtility.Log(" 引导技能", "------%%%%%%%----按下 :Null ");
                }

                for (int i = 0; i < guideSkill.GuideSkill_.TargetList.Count; i++)
                {
                    Leyoutech.Utility.DebugUtility.Log(" 引导技能", "------%%%%%%%----按下 :" + guideSkill.GuideSkill_.TargetList[i].TargetId);
                }


                MainCameraComponent mainCamComponent = m_Context.GetObject <MainCameraComponent>();
                float d = skillData.BaseData.Value.MaxDistance;        // * SceneController.SKILL_PRECISION;
                Crucis.Protocol.Vec4 vec4 = GetCameraQuaternion(mainCamComponent, direction, d);
                guideSkill.GuideSkill_.Quat = vec4;
                skillRPC.CreatListenerCastGuideSkill(entityId, skillId);
                skillRPC.CastGuideSkillWright(entityId, skillId, guideSkill);
            }
            break;

            case 2:    //目标改变
            {
                Leyoutech.Utility.DebugUtility.Log(" 引导技能", "目标改变");

                GuideSkill guideSkill = new GuideSkill();
                guideSkill.ChangeTarget          = new global::Crucis.Protocol.ChangeGuideSkillTargetInfo();
                guideSkill.ChangeTarget.CasterId = (uint)m_ISpacecraftSkillProperty.EntityId();
                guideSkill.ChangeTarget.SkillId  = (uint)skillData.Id;
                Vector3 direction = Vector3.zero;
                guideSkill.ChangeTarget.TargetList.Add(m_ISpacecraftSkillProperty.GetPerceptronTarget().GetCurrentTargetInfos(false, out direction, false));

                if (guideSkill.ChangeTarget.TargetList.Count == 0)
                {
                    Leyoutech.Utility.DebugUtility.Log(" 引导技能", "------%%%%%%%----目标改变 :Null ");
                }

                for (int i = 0; i < guideSkill.ChangeTarget.TargetList.Count; i++)
                {
                    Leyoutech.Utility.DebugUtility.Log(" 引导技能", "------%%%%%%%----目标改变 :" + guideSkill.ChangeTarget.TargetList[i].TargetId);
                }


                MainCameraComponent mainCamComponent = m_Context.GetObject <MainCameraComponent>();
                float d = skillData.BaseData.Value.MaxDistance;        // * SceneController.SKILL_PRECISION;
                Crucis.Protocol.Vec4 vec4 = GetCameraQuaternion(mainCamComponent, direction, d);
                guideSkill.ChangeTarget.Quat = vec4;
                skillRPC.CastGuideSkillWright(entityId, skillId, guideSkill);
            }
            break;

            case 3:    //抬起
            {
                Leyoutech.Utility.DebugUtility.Log("引导技能", " 抬起");

                GuideSkill guideSkill = new GuideSkill();
                guideSkill.GuideEnd          = new global::Crucis.Protocol.GuideSkillEnd();
                guideSkill.GuideEnd.CasterId = (uint)m_ISpacecraftSkillProperty.EntityId();
                guideSkill.GuideEnd.SkillId  = (uint)skillData.Id;
                skillRPC.CastGuideSkillWright(entityId, skillId, guideSkill);
            }
            break;

            default:
                break;
            }
        }
        protected void LateUpdate()
        {
            if (m_OwnerPlayer == null ||
                !m_OwnerPlayer.IsAlive())
            {
                if (m_OwnerPlayer != null)
                {
                    Leyoutech.Utility.DebugUtility.Log(LOG_TAG
                                                       , "Unregister Owner Player because not alive");
                }
                m_OwnerPlayer           = null;
                m_LastFocusInteractable = null;
                return;
            }

            // fill camera state
            if (GameFacade._IsGaming)
            {
                MainCameraComponent cameraComponent = CameraManager.GetInstance().GetMainCamereComponent();
                m_CameraState.HalfTanFov  = cameraComponent.GetHalfTanFov();
                m_CameraState.AspectRatio = CameraManager.GetInstance().GetAspectRatio();
            }
            else
            {
                m_CameraState.HalfTanFov  = Leyoutech.Utility.RendererUtility.CaculateHalfTanCameraFov(m_CameraState.Camera.fieldOfView);
                m_CameraState.AspectRatio = (float)Screen.width / Screen.height;
            }
            m_CameraState.WorldPosition = m_CameraState.Camera.transform.position;

            // foreach interactable
            Interactable focusInteractable = null;
            float        maxWeight         = float.MinValue;

            for (int iInteractable = 0; iInteractable < m_Interactables.Count; iInteractable++)
            {
                Interactable          iterInteractable         = m_Interactables[iInteractable];
                IInteractable         iterInteractableInstance = iterInteractable.Instance;
                Interactable.ForDebug forDebug = Interactable.EMPTY_FORDEBUG;
                if (!iterInteractableInstance.IsAlive())
                {
                    Leyoutech.Utility.DebugUtility.Log(LOG_TAG
                                                       , "Unregister Interactable because not alive");
                    m_Interactables.RemoveAt(iInteractable);
                    iInteractable--;
                    continue;
                }

#if UNITY_EDITOR
                if (m_EnableGizmos)
                {
                    EditorExtend.GizmosHelper.GetInstance().DrawSphere(iterInteractableInstance.GetWorldPosition()
                                                                       , iterInteractableInstance.GetInteractableRadius()
                                                                       , Color.gray);
                }
#endif

                // 判断距离能否交互
                float interactableToOwnerPlayerDistanceSquare = (iterInteractableInstance.GetWorldPosition() - m_OwnerPlayer.GetWorldPosition()).sqrMagnitude;
                forDebug.ToPlayerDistanceSquare = interactableToOwnerPlayerDistanceSquare;
                if (interactableToOwnerPlayerDistanceSquare > iterInteractableInstance.GetInteractableDistanceSquare())
                {
                    m_Interactables[iInteractable]._ForDebug = forDebug;
                    continue;
                }
                forDebug.MyAllowStep = Interactable.ForDebug.AllowStep.DistanceToPlayer;

                // 判断是否在屏幕内
                Vector3 viewportPoint = m_CameraState.Camera.WorldToViewportPoint(iterInteractableInstance.GetWorldPosition());
                forDebug.ViewportPoint = viewportPoint;
                // 到 以相机朝向为法线的平面 的距离
                float interactableToCameraPlaneDistance = viewportPoint.z;
                // 在相机后方
                if (interactableToCameraPlaneDistance < 0)
                {
                    m_Interactables[iInteractable]._ForDebug = forDebug;
                    continue;
                }
                forDebug.MyAllowStep = Interactable.ForDebug.AllowStep.InCameraForward;

                // 到相机的距离
                Vector3 cameraToInteractableDirection = iterInteractableInstance.GetWorldPosition() - m_CameraState.WorldPosition;
                float   interactableToCameraDistance  = cameraToInteractableDirection.magnitude;
                float   interactableRelativeHeight    = Leyoutech.Utility.RendererUtility.CaculateRelativeHeightInScreen(iterInteractableInstance.GetInteractableRadius() * 0.5f
                                                                                                                         , interactableToCameraDistance
                                                                                                                         , m_CameraState.HalfTanFov);
                float interactableRelativeWidth = interactableRelativeHeight * m_CameraState.AspectRatio;
                bool  inScreen = viewportPoint.x > SAFE_AREA_X - interactableRelativeWidth &&
                                 viewportPoint.x <(1.0f + interactableRelativeWidth - SAFE_AREA_X) &&
                                                  viewportPoint.y> SAFE_AREA_Y - interactableRelativeHeight &&
                                 viewportPoint.y < (1.0f + interactableRelativeHeight - SAFE_AREA_Y);
                forDebug.RelativeSize = new Vector2(interactableRelativeWidth, interactableRelativeHeight);
                if (!inScreen)
                {
                    m_Interactables[iInteractable]._ForDebug = forDebug;
                    continue;
                }
                forDebug.MyAllowStep = Interactable.ForDebug.AllowStep.InScreen;

                // 到屏幕中心距离
                float interactableToScreenCenterWidth  = (viewportPoint.x - 0.5f) * m_CameraState.AspectRatio;
                float interactableToScreenCenterHeight = (viewportPoint.y - 0.5f);
                // 单位是屏幕高度的平方(0表示在正中心,0.25表示距离中心半个屏幕高度)
                float interactableToScreenCenterDistanceSquare = interactableToScreenCenterWidth * interactableToScreenCenterWidth
                                                                 + interactableToScreenCenterHeight * interactableToScreenCenterHeight;
                forDebug.ToScreenCenterDistanceSquare = interactableToScreenCenterDistanceSquare;

                // 计算权重
                float weight = 1.0f
                               / interactableToScreenCenterDistanceSquare
                               * interactableRelativeWidth * interactableRelativeWidth
                               / interactableToOwnerPlayerDistanceSquare * iterInteractableInstance.GetInteractableDistanceSquare();
                forDebug.Weight = weight;
                if (weight < maxWeight)
                {
                    m_Interactables[iInteractable]._ForDebug = forDebug;
                    continue;
                }
                forDebug.MyAllowStep = Interactable.ForDebug.AllowStep.Weight;

                // 检测目标是否被碰撞体遮挡
                bool isRaycast = Physics.Raycast(m_CameraState.WorldPosition
                                                 , cameraToInteractableDirection
                                                 , interactableToCameraDistance - iterInteractableInstance.GetInteractableRadius()
                                                 , m_PhysicsLayerMask);

#if UNITY_EDITOR
                if (m_EnableGizmos)
                {
                    EditorExtend.GizmosHelper.GetInstance().DrawLine(m_CameraState.WorldPosition
                                                                     , m_CameraState.WorldPosition
                                                                     + cameraToInteractableDirection
                                                                     * (interactableToCameraDistance - iterInteractableInstance.GetInteractableRadius())
                                                                     / interactableToCameraDistance
                                                                     , isRaycast ? Color.red : Color.green);
                }
#endif

                if (isRaycast)
                {
                    m_Interactables[iInteractable]._ForDebug = forDebug;
                    continue;
                }
                forDebug.MyAllowStep = Interactable.ForDebug.AllowStep.Raycast;

                maxWeight         = weight;
                focusInteractable = iterInteractable;
                m_Interactables[iInteractable]._ForDebug = forDebug;
            }

            // change focus
            bool changedFocus = m_LastFocusInteractable == null
                                ? focusInteractable != null
                                : focusInteractable == null || focusInteractable.Instance != m_LastFocusInteractable;
            if (changedFocus)
            {
                Leyoutech.Utility.DebugUtility.Log(LOG_TAG
                                                   , string.Format("ChangedFocus from ({0}) to ({1}): "
                                                                   , m_LastFocusInteractable == null || !m_LastFocusInteractable.IsAlive()
                                                        ? "None"
                                                        : m_LastFocusInteractable.GetDisplay()
                                                                   , focusInteractable == null || !focusInteractable.Instance.IsAlive()
                                                        ? "None"
                                                        : focusInteractable.Instance.GetDisplay()));

                if (m_LastFocusInteractable != null &&
                    m_LastFocusInteractable.IsAlive())
                {
                    m_LastFocusInteractable.SetFocus(false);
                }

                if (focusInteractable == null)
                {
                    m_LastFocusInteractable = null;
                }
                else if (focusInteractable.Instance.GetIsActive())
                {
                    m_LastFocusInteractable = focusInteractable.Instance;
                    m_LastFocusInteractable.SetFocus(true);
                }
            }

            if (m_LastFocusInteractable != null)
            {
                focusInteractable._ForDebug.MyAllowStep = Interactable.ForDebug.AllowStep.Pass;
            }
        }
Example #18
0
    /// <summary>
    /// 播放动画
    /// </summary>
    /// <param name="director">播放器</param>
    private void PlayTimeLine(PlayableDirector director)
    {
        CinemachineBrain         mainCameraBrain = null;
        CinemachineVirtualCamera camera1         = null;
        CinemachineVirtualCamera camera2         = null;

        GameplayProxy gameplayProxy = GameFacade.Instance.RetrieveProxy(ProxyName.GameplayProxy) as GameplayProxy;
        Transform     hero          = IsInSpace() ? null : gameplayProxy.GetMainPlayerSkinTransform();

        if (hero != null)
        {
            MainCameraComponent mainCamera = CameraManager.GetInstance().GetMainCamereComponent();
            mainCameraBrain = mainCamera.GetCamera().GetComponent <CinemachineBrain>();
            camera1         = GetOrCreateVirtualCamera(VIRTUAL_CAMERA_NAME_1);
            camera2         = GetOrCreateVirtualCamera(VIRTUAL_CAMERA_NAME_2);

            if (director == m_OpenTimeline)
            {
                //机位1 ( 打开手表时相机所在机位 )
                camera1.Follow          = GetOrCreateVirtualCameraProxy("WATCH_BACK_POINT");
                camera1.Follow.position = mainCamera.transform.position;
                camera1.Follow.rotation = mainCamera.transform.rotation;

                //机位2 ( 注视手表的机位 )
                camera2.Follow = FindTransformBy(hero, CAMERA_POINT_NAME);

                //UI挂点
                m_WatchPoint                   = FindTransformBy(hero, WATCH_UI_NAME);
                Canvas.worldCamera             = CameraManager.GetInstance().GetUI3DCameraComponent().GetCamera();
                Canvas.worldCamera.cullingMask = 1 << LayerMask.NameToLayer(WATCH_3D_LAYER);
                Canvas.worldCamera.gameObject.SetActive(true);
                Canvas.scaleFactor          = 0.001f;
                Canvas.transform.localScale = Vector3.one * 0.0001f;
                Canvas.GetComponent <RectTransform>().sizeDelta = UIManager.ReferenceResolution;

                LayerUtil.SetGameObjectToLayer(Canvas.gameObject, LayerMask.NameToLayer(WATCH_3D_LAYER), true);
                LayerUtil.SetGameObjectToLayer(m_PostEffectScene, m_PostEffectSceneLayer, false);
                LayerUtil.SetGameObjectToLayer(m_PostEffectUI, m_PostEffectUILayer, false);

                camera1.enabled = true;
                camera2.enabled = true;
            }
        }

        m_WatchPanel.gameObject.SetActive(true);

        if (director == m_OpenTimeline)
        {
            m_CloseTimeline.gameObject.SetActive(false);

            SetCinemachineTrack(m_OpenTimeline, mainCameraBrain, camera1, camera2);

            m_OpenTimeline.extrapolationMode = DirectorWrapMode.Hold;
            m_OpenTimeline.gameObject.SetActive(true);
            m_OpenTimeline.time = 0.0f;
            m_OpenTimeline.Play();

            m_PostEffectScene.gameObject.SetActive(true);
            m_PostEffectUI.gameObject.SetActive(true);
        }
        else if (director == m_CloseTimeline)
        {
            m_OpenTimeline.gameObject.SetActive(false);

            SetCinemachineTrack(director, mainCameraBrain, camera2, camera1);

            m_CloseTimeline.extrapolationMode = DirectorWrapMode.None;
            m_CloseTimeline.gameObject.SetActive(true);
            m_CloseTimeline.time = 0.0f;
            m_CloseTimeline.Play();

            m_PostEffectScene.gameObject.SetActive(true);
            m_PostEffectUI.gameObject.SetActive(true);

            m_SelectedIndex = -1;
            UpdateCenterInfo();
        }

        //人形动画
        PlayHumanAnimator(director == m_OpenTimeline);
    }