/// <summary> /// 根据这次射击的弹道方向, 计算命中的目标Entity和目标点 /// </summary> /// <param name="camDirAffectedByRecoil"></param> /// <returns></returns> protected SkillTarget CalulateTargetDataByShootingDirection(Vector3 camDirAffectedByRecoil) { // 计算射线碰到的目标点, 并重新计算从Launcher到目标点的方向 PlayerSkillVO skillVO = m_PlayerSkillProxy.GetCurrentWeaponSkill(); SkillSystemGrow skillGrow = skillVO.GetSkillGrow(); float maxDistance = skillGrow.Range * SceneController.SPACE_ACCURACY_TO_CLIENT; Ray ray = new Ray(CameraManager.GetInstance().GetMainCamereComponent().GetPosition(), camDirAffectedByRecoil); RaycastHit hitInfo = new RaycastHit(); if (Physics.Raycast(ray, out hitInfo, maxDistance, LayerUtil.GetLayersIntersectWithSkillProjectile(true))) { return(new SkillTarget(hitInfo.collider.attachedRigidbody?.GetComponent <SpacecraftEntity>(), hitInfo.point)); } else { Vector3 skillReleasingDir = (ray.GetPoint(maxDistance) - m_MainPlayer.GetRootTransform().position).normalized; return(new SkillTarget(null, m_MainPlayer.GetRootTransform().position + skillReleasingDir * maxDistance)); } }
private void OnSkillHotkeyImplementation(SkillCastEvent skillCast) { PlayerSkillVO skillVO; if (skillCast.IsWeaponSkill) { if (m_SkillProxy.UsingReformer()) { skillVO = m_SkillProxy.GetReformerSkill(); } else { skillVO = m_SkillProxy.GetCurrentWeaponSkill(); if (skillVO != null && !m_CfgSkillProxy.IsWeaponSkill(skillVO.GetID())) { Debug.LogErrorFormat("技能 {0} 被配置在武器上, 但它并不是一个武器技能! 找策划确认一下技能表和武器表", skillVO.GetID()); } } } else { skillVO = m_SkillProxy.GetSkillByIndex(skillCast.SkillIndex); if (skillVO != null && m_CfgSkillProxy.IsWeaponSkill(skillVO.GetID())) { Debug.LogErrorFormat("技能 {0} 被配置在飞船上, 但它其实是一个武器技能! 找策划确认一下技能表和武器表", skillVO.GetID()); } } if (skillVO != null) { int skillID = skillVO.GetID(); bool keyPressed = skillCast.KeyPressed; if (keyPressed && !IsReleasingSkill(skillID)) { // 释放Trigger技能的过程中, 可以释放非Trigger技能. 此时Trigger技能中断, 等非Trigger技能结束后继续放 // 不是Trigger技能的话, 每次技能按键按下, 只能释放一次 if ((m_CfgSkillProxy.IsTriggerSkill(skillID) && !OneOfReleasingSkillsIsNotTriggerSkill()) || (!m_CfgSkillProxy.IsTriggerSkill(skillID) && !SkillHasReleasedDuringPress(skillID))) { ReleaseSkillByClientInput(skillID); SetSkillReleaseDuringPress(skillID, true); if (m_CfgSkillProxy.IsTriggerSkill(skillID)) { m_Property.SetTriggerSkillID(skillID); m_Property.SetReleasingTriggerSkill(true); } } } else { SkillControlEvent skillEvent = keyPressed ? SkillControlEvent.Event_SkillButtonPress : SkillControlEvent.Event_SkillButtonRelease; SendEventToSkill(skillID, skillEvent, null); if (!keyPressed) { SetSkillReleaseDuringPress(skillID, false); m_Property.SetReleasingTriggerSkill(false); m_Property.SetTriggerSkillID(-1); } } } }