private void StartMove() { m_MoveDuration = 0; m_MoveElapsed = 0; m_IsMoving = true; Vector3 rayDirRevert = m_BulletInfo.MoveDir * (-1); Vector3 impactScrPos = m_BulletInfo.ImpactSrcPos + rayDirRevert * m_BulletInfo.MoveImpactRadius; Ray ray = new Ray(impactScrPos, m_BulletInfo.MoveDir); RaycastHit[] targetHitInfos = Physics.SphereCastAll(ray, m_BulletInfo.MoveImpactRadius, m_BulletInfo.MoveDistanceMax); Script_Util.DrawPhysicsSphereCastLine(ray, m_BulletInfo.MoveDistanceMax, m_BulletInfo.MoveImpactRadius, Color.red, 10.0f); if (targetHitInfos != null && targetHitInfos.Length > 0) { Script_Util.SortRaycastHit(ref targetHitInfos); m_IsHit = true; m_MoveHitInfo = targetHitInfos[0]; m_MoveDuration = m_MoveHitInfo.distance / m_BulletInfo.MoveSpeed; m_HitPos = m_MoveHitInfo.point; } else { m_IsHit = false; m_MoveDuration = m_BulletInfo.MoveDistanceMax / m_BulletInfo.MoveSpeed; m_HitPos = Script_Util.CaculateRelativePos(m_BulletInfo.MoveStartPos, m_BulletInfo.MoveDir, m_BulletInfo.MoveDistanceMax); } }
public static void ProcessVerticalImpact(GameObject attacker, GameObject sender, SkillImpactInfos impacts, float verticalHeight = 10.0f, float verticalHeightStart = 0.0f, float SectorDegree = 360.0f, int hitCount = 1) { bool isTargeted = false; // Find Targets Ray ray = new Ray( sender.transform.position + new Vector3(0, verticalHeightStart - impacts.ImpactRadius, 0), Vector3.up); RaycastHit[] targetHitInfos = Physics.SphereCastAll(ray, impacts.ImpactRadius, verticalHeight, (int)SceneLayerType.Character); Script_Util.DrawPhysicsSphereCastLine(ray, verticalHeight, impacts.ImpactRadius, Color.red, 10.0f); int index = 0; while (index < targetHitInfos.Length) { if (targetHitInfos[index].collider == null || targetHitInfos[index].collider.gameObject == null) { index++; continue; } GameObject target = targetHitInfos[index].collider.gameObject; if (target != null) { Vector3 targetDir = target.transform.position - sender.transform.position; targetDir.y = 0; Vector3 senderDir = sender.transform.rotation * Vector3.forward; if (Mathf.Abs(Vector3.Angle(targetDir, senderDir)) > SectorDegree) { index++; continue; } ImpactInfo curImpact = ExtractBestImpactInfo(target, impacts); if (curImpact != null) { Vector3 faceDir = target.transform.position - sender.transform.position; faceDir.y = 0; ImpactInfo m_ImpactInfo = curImpact.Clone() as ImpactInfo; m_ImpactInfo.m_Velocity = Quaternion.LookRotation(faceDir) * m_ImpactInfo.m_Velocity; m_ImpactInfo.Attacker = sender; ImpactSystem.Instance.SendImpact(attacker, target, m_ImpactInfo, hitCount); TriggerImpl.RecordTarget(attacker, target); isTargeted = true; } } index++; } ProcessImpactLock(attacker, impacts, isTargeted); }
private void ProcessImpact() { if (m_TargetHitInfos != null) { m_TargetHitInfos.Clear(); } Vector3 rayDirRevert = m_BulletInfo.MoveDir * (-1); Vector3 impactScrPos = m_BulletInfo.ImpactSrcPos + rayDirRevert * m_BulletInfo.ImpactInfos.ImpactRadius; Ray ray = new Ray(impactScrPos, m_BulletInfo.MoveDir); float distance = (m_HitPos - m_BulletInfo.ImpactSrcPos).magnitude; RaycastHit[] targetHitInfos = Physics.SphereCastAll(ray, m_BulletInfo.ImpactInfos.ImpactRadius, distance, (int)SceneLayerType.Character); Script_Util.DrawPhysicsSphereCastLine(ray, distance, m_BulletInfo.ImpactInfos.ImpactRadius, Color.red, 10.0f); if (targetHitInfos != null && targetHitInfos.Length > 0) { m_TargetHitInfos = new List <RaycastHit>(targetHitInfos); m_TargetHitInfos = CheckTarget(m_TargetHitInfos, m_BulletInfo.ImpactInfos); foreach (RaycastHit hitInfo in m_TargetHitInfos) { GameObject target = hitInfo.transform.gameObject; if (target != null) { ImpactInfo tImpactInfo = TriggerImpl.ExtractBestImpactInfo(target, m_BulletInfo.ImpactInfos); if (tImpactInfo != null) { tImpactInfo = tImpactInfo.Clone() as ImpactInfo; Script_Util.AdjustImpactEffectDataPos(target, GetAttacker(), tImpactInfo, hitInfo.point, m_BulletInfo.MoveDir); Vector3 faceDir = m_BulletInfo.MoveDir; faceDir.y = 0; tImpactInfo.m_Velocity = Quaternion.LookRotation(faceDir) * tImpactInfo.m_Velocity; tImpactInfo.Attacker = GetAttacker(); ImpactSystem.Instance.SendImpact(GetAttacker(), target, tImpactInfo); TriggerImpl.RecordTarget(GetAttacker(), target); } } } } }