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); }
/// <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); } }
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); }
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); } } }
/// <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}"); } }
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; } }
/// <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); }